【仿真建模-anylogic】Port原理解析

发布于:2024-06-14 ⋅ 阅读:(133) ⋅ 点赞:(0)
Author:赵志乾
Date:2024-06-14
Declaration:All Right Reserved!!!

1. 类图

2. 原理解析

          2.1 核心函数: 

           Port作为各类型端口的基类,其核心方法如下 :

函数 功能
Port(Agent owner) 构造函数,入参指定端口所属的智能体;

void connect(Port<OutMessageType,InMessageType> port)

void disconnect(Port<OutMessageType,InMessageType> port)

与和owner同层级的Agent的端口建立或取消连接;

void map(Port<InMessageType,OutMessageType> port)

void unmap(Port<InMessageType,OutMessageType> port)

与内嵌智能体的端口建立或取消连接;

void map(Statechart statechart)

void unmap(Statechart statechart)

与owner内的状态图建立或取消连接;
void send(OutMessageType msg) 发出消息
void receive(InMessageType msg) 接收消息
List<Port<OutMessageType,InMessageType>> getFlatLinks() 获取该端口与owner同层级的Agent建立连接的端口列表;
List<Port<InMessageType,OutMessageType>> getUpLinks() 获取该端口与owner的容器智能体建立连接的端口列表;
List<Port<InMessageType,OutMessageType>> getDownLinks() 获取该端口与owner内嵌智能体建立连接的端口列表;
List<Statechart> getStatechartLinks() 获取该端口与owner内建立连接的状态图列表;
           2.2 连接类型图形说明

        2.3 代码解析    

         由于AnyLogic内核做过代码混淆,以下代码为二次加工后的内容,与源码不同;

//**************************** Port核心字段******************************************
// 该端口的owner
private transient Agent owner;
// 该端口与和owner同层级Agent建立连接的端口列表
protected transient List<Port<OutMessageType, InMessageType>> flatLinks;
// 该端口与owner的容器Agent建立连接的端口列表
protected transient List<Port<InMessageType, OutMessageType>> upLinks;
// 该端口与owner的内嵌Agent建立连接的端口列表
protected transient List<Port<InMessageType, OutMessageType>> downLinks; 
// 该端口与owner的状态图建立连接的状态图列表
protected transient List<Statechart> statecharts; 

//****************************构造函******************************************************
Port(Agent owner){
    this.owner = owner;
    this.flatLinks = new LinkedList<>();
    this.upLinks = new LinkedList<>();
    this.downLinks = new  LinkedList<>();
    this.statecharts = new LinkedList<>();
}

//************依据建立或取消连接的场景,在对应的列表中进行元素的增删维护**********************
public void connect(Port<OutMessageType, InMessageType> port) {
    // 避免重复添加,即接口调用具有幂等性
    if (this.flatLinks.contains(port)) {
        return;
    }

    this.flatLinks.add(port);
    port.flatLinks.add(this);
}
public void disconnect(Port<OutMessageType, InMessageType> port) {
   this.flatLinks.remove(port);
   port.flatLinks.remove(this);
}

public void map(Port<InMessageType, OutMessageType> port) {
   this.downLinks.add(port);
   port.upLinks.add(this);
}
public void unmap(Port<InMessageType, OutMessageType> port) {
   this.downLinks.remove(port);
   port.upLinks.remove(this);
}

public void map(Statechart statechart) {
   this.statecharts.add(statechart);
}
public void unmap(Statechart statechart) {
   this.statecharts.remove(statechart);
}

//****************************消息收发**************************************************
public void send(OutMessageType message) {
    if (this.owner.executeOnSendActionOf(this, message)) {
        // owner的容器Agent建立连接的端口逐个发送消息
        for(Port<OutMessageType,InMessageType> port : this.upLinks){
            port.send(message);
        }
        // owner同级Agent建立连接的端口逐个接收消息
        for(Port<OutMessageType,InMessageType> port : this.flatLinks){
            port.receive(message);
        }     
    }
}

public void receive(InMessageType message) {
    boolean need = this.owner.executeOnReceiveActionOf(this, message);
    this.owner.onChange();
    if (need) {
        // owner内嵌Agent建立连接的端口逐个接收消息
		for(Port<InMessageType, OutMessageType> port : this.downLinks){
			port.receive(message);
		}
        // owner状态图建立连接的逐个接收消息
        for(Statechart statechart : this.statecharts){
			statechart.receiveMessage(message);
		}
    }
}

3. 应用场景

          图形编辑窗口拖入Port组件后,Anylogic将自动创建Port实例,主要用于实现智能体间消息通信;


网站公告

今日签到

点亮在社区的每一天
去签到