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

2024-06-14 13:28

本文主要是介绍【仿真建模-anylogic】Port原理解析,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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实例,主要用于实现智能体间消息通信;

这篇关于【仿真建模-anylogic】Port原理解析的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1060528

相关文章

C++ 右值引用(rvalue references)与移动语义(move semantics)深度解析

《C++右值引用(rvaluereferences)与移动语义(movesemantics)深度解析》文章主要介绍了C++右值引用和移动语义的设计动机、基本概念、实现方式以及在实际编程中的应用,... 目录一、右值引用(rvalue references)与移动语义(move semantics)设计动机1

MySQL 筛选条件放 ON后 vs 放 WHERE 后的区别解析

《MySQL筛选条件放ON后vs放WHERE后的区别解析》文章解释了在MySQL中,将筛选条件放在ON和WHERE中的区别,文章通过几个场景说明了ON和WHERE的区别,并总结了ON用于关... 今天我们来讲讲数据库筛选条件放 ON 后和放 WHERE 后的区别。ON 决定如何 "连接" 表,WHERE

Java线程池核心参数原理及使用指南

《Java线程池核心参数原理及使用指南》本文详细介绍了Java线程池的基本概念、核心类、核心参数、工作原理、常见类型以及最佳实践,通过理解每个参数的含义和工作原理,可以更好地配置线程池,提高系统性能,... 目录一、线程池概述1.1 什么是线程池1.2 线程池的优势二、线程池核心类三、ThreadPoolE

Mybatis的mapper文件中#和$的区别示例解析

《Mybatis的mapper文件中#和$的区别示例解析》MyBatis的mapper文件中,#{}和${}是两种参数占位符,核心差异在于参数解析方式、SQL注入风险、适用场景,以下从底层原理、使用场... 目录MyBATis 中 mapper 文件里 #{} 与 ${} 的核心区别一、核心区别对比表二、底

Agent开发核心技术解析以及现代Agent架构设计

《Agent开发核心技术解析以及现代Agent架构设计》在人工智能领域,Agent并非一个全新的概念,但在大模型时代,它被赋予了全新的生命力,简单来说,Agent是一个能够自主感知环境、理解任务、制定... 目录一、回归本源:到底什么是Agent?二、核心链路拆解:Agent的"大脑"与"四肢"1. 规划模

MySQL字符串转数值的方法全解析

《MySQL字符串转数值的方法全解析》在MySQL开发中,字符串与数值的转换是高频操作,本文从隐式转换原理、显式转换方法、典型场景案例、风险防控四个维度系统梳理,助您精准掌握这一核心技能,需要的朋友可... 目录一、隐式转换:自动但需警惕的&ld编程quo;双刃剑”二、显式转换:三大核心方法详解三、典型场景

Spring Boot Interceptor的原理、配置、顺序控制及与Filter的关键区别对比分析

《SpringBootInterceptor的原理、配置、顺序控制及与Filter的关键区别对比分析》本文主要介绍了SpringBoot中的拦截器(Interceptor)及其与过滤器(Filt... 目录前言一、核心功能二、拦截器的实现2.1 定义自定义拦截器2.2 注册拦截器三、多拦截器的执行顺序四、过

Java 队列Queue从原理到实战指南

《Java队列Queue从原理到实战指南》本文介绍了Java中队列(Queue)的底层实现、常见方法及其区别,通过LinkedList和ArrayDeque的实现,以及循环队列的概念,展示了如何高效... 目录一、队列的认识队列的底层与集合框架常见的队列方法插入元素方法对比(add和offer)移除元素方法

SQL 注入攻击(SQL Injection)原理、利用方式与防御策略深度解析

《SQL注入攻击(SQLInjection)原理、利用方式与防御策略深度解析》本文将从SQL注入的基本原理、攻击方式、常见利用手法,到企业级防御方案进行全面讲解,以帮助开发者和安全人员更系统地理解... 目录一、前言二、SQL 注入攻击的基本概念三、SQL 注入常见类型分析1. 基于错误回显的注入(Erro

Spring IOC核心原理详解与运用实战教程

《SpringIOC核心原理详解与运用实战教程》本文详细解析了SpringIOC容器的核心原理,包括BeanFactory体系、依赖注入机制、循环依赖解决和三级缓存机制,同时,介绍了SpringBo... 目录1. Spring IOC核心原理深度解析1.1 BeanFactory体系与内部结构1.1.1