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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/30135.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux磁盘格式化与重新分区

1.df -BG查看磁盘挂载情况 2.fdisk -l查看磁盘详细信息 3.sudo mkfs.ext4 /path 格式化磁盘 4.挂载格式化后磁盘 挂载成功

CPU 和主板芯片组对应关系

英特尔各代CPU 对应主板芯片组列表 1. 第一代Core&#xff08;Nehalem架构&#xff0c;2008年&#xff09; Core i7/i5/i3&#xff08;LGA 1366/1156&#xff09; 芯片组&#xff1a;X58&#xff08;LGA 1366&#xff09;、P55、H55、H57&#xff08;LGA 1156&#xff09; …

初见DP

线性DP 例题1 1143. 最长公共子序列 &#xff08;LCS&#xff09; 子序列不连续 给定两个字符串 text1 和 text2&#xff0c;返回这两个字符串的最长 公共子序列 的长度。如果不存在 公共子序列 &#xff0c;返回 0 。 一个字符串的 子序列 是指这样一个新的字符串&#x…

opencv 视频处理

概述 OpenCV 的视频模块是其核心组成部分之一&#xff0c;主要负责视频文件的读取、处理、分析以及视频流的捕获和输出。这一模块使得开发者能够轻松地处理来自摄像头、文件或其他视频源的视频数据&#xff0c;进行实时或离线的图像处理和计算机视觉任务。以下是 OpenCV 视频模…

Pentest Muse:一款专为网络安全人员设计的AI助手

关于Pentest Muse Pentest Muse是一款专为网络安全研究人员和渗透测试人员设计和开发的人工智能AI助手&#xff0c;该工具可以帮助渗透测试人员进行头脑风暴、编写Payload、分析代码或执行网络侦查任务。除此之外&#xff0c;Pentest Muse甚至还能够执行命令行代码并以迭代方式…

Excel 找出最大值及其相邻的 N 个成员

某列都是数值&#xff1a; A1132213464215496973482396101113712491342144015151631171718114719182030212222423252419251326272738283029163012312332333233419351436463723383739384028 请找出最大值及其相邻的 10 个成员&#xff0c;注意越界检查&#xff0c;实际符合条件…

JAVA云HIS医院管理系统源码:可医保对接的云HIS运维平台源码 SaaS模式

JAVA云HIS医院管理系统源码&#xff1a;可医保对接的云HIS运维平台源码 SaaS模式 云HIS系统运用云计算、大数据、物联网等新兴信息技术&#xff0c;为医疗机构提供全面的医疗信息管理服务。该系统支持医保功能&#xff0c;通过与医保系统的对接&#xff0c;实现了医疗费用的自…

Boost 网络库

asio 网络编程的基本流程创建 socket绑定acceptor连接指定的端点服务器接受连接 网络编程的基本流程 服务端 1&#xff09;socket----创建socket对象。 2&#xff09;bind----绑定本机ipport。 3&#xff09;listen----监听来电&#xff0c;若在监听到来电&#xff0c;则建…

Vue 3的组合式API:你真的需要它吗?

Vue 3的组合式API&#xff1a;你真的需要它吗&#xff1f; 随着Vue 3的发布&#xff0c;我们迎来了一个新的API——组合式API&#xff08;Composition API&#xff09;。这个API为开发者提供了更灵活、更可复用的代码编写方式。然而&#xff0c;传统的选项式API&#xff08;Opt…

分布式操作系统入门:可的哥(Codigger)引领新潮流

早期&#xff0c;大型机系统盛行&#xff0c;随后个人计算机如Windows、Mac OS等操作系统普及。随着技术发展和计算需求增长&#xff0c;单机系统的局限显现&#xff0c;推动了分布式操作系统的崛起。操作系统演进显露出从单机到多机、从集中到分散的趋势。传统单机系统在处理大…

OPenCV实现把人形轮廓画在实时视频画面中

操作系统&#xff1a;ubuntu22.04OpenCV版本&#xff1a;OpenCV4.9IDE:Visual Studio Code编程语言&#xff1a;C11 1.功能描述 当你从摄像头读取实时视频时&#xff0c;如果想在视频的画面中画一个方框&#xff0c;或者是画一个圆&#xff0c;是很简单的事情&#xff0c;可是…

Python爬虫技术:动态JavaScript加载音频的解析

在当今的互联网世界中&#xff0c;JavaScript已成为构建丰富交互体验不可或缺的技术。然而&#xff0c;对于网络爬虫开发者来说&#xff0c;JavaScript动态生成的内容却带来了不小的挑战。音频内容的动态加载尤其如此&#xff0c;因为它们往往涉及到复杂的用户交互和异步数据加…

【python】Sklearn—Cluster

参考学习来自 10种聚类算法的完整python操作示例 文章目录 聚类数据集亲和力传播——AffinityPropagation聚合聚类——AgglomerationClusteringBIRCH——Birch&#xff08;✔&#xff09;DBSCAN——DBSCANK均值——KMeansMini-Batch K-均值——MiniBatchKMeans均值漂移聚类——…

怎样认识到网络安全的重要性?

在如今的数字化时代&#xff0c;网络行业已经深入到人们的日常生活当中了&#xff0c;除了平时的娱乐社交还包含了工作学习&#xff0c;互联网给我们的生活带来了极大的便利&#xff0c;但同时网络上的安全问题也逐渐凸显出来了&#xff0c;我们在享受网络带来便利的同时&#…

【C#】字符串处理器

实现&#xff1a; 统计字符串中单词的数量。查找字符串中最长的单词&#xff0c;并显示其长度。将字符串中的所有单词首字母大写。将字符串中的所有单词反转。 要求&#xff1a; 使用面向对象的方式实现&#xff0c;包括至少一个类&#xff08;例如 StringProcessor&#xf…

Malformed \uxxxx encoding或Maven server structure problem问题解决

问题描述&#xff1a; idea运行项目时, 报错如下: [ERROR] Malformed \uxxxx encoding. [ERROR] Maven server structure problem [ERROR] Malformed \uxxxx encoding. 解决方法总结 先说一下解决方法无非是下面几种 1、先检查项目的.properties、.yml 、pom.xml、logback等…

视频智能分析平台智能边缘分析一体机视频监控业务平台区域人数不足检测算法

智能边缘分析一体机区域人数不足检测算法是一种集成了先进图像处理、目标检测、跟踪和计数等功能的算法&#xff0c;专门用于实时监测和统计指定区域内的人数&#xff0c;并在人数不足时发出警报。以下是对该算法的详细介绍&#xff1a; 一、算法概述 智能边缘分析一体机区域…

怎么把pdf文件转cad图纸?方法分享!

怎么把pdf文件转cad图纸&#xff1f;在数字化时代&#xff0c;PDF和CAD作为两种常见的文件格式&#xff0c;各自在各自的领域发挥着重要作用。然而&#xff0c;当需要在两者之间进行转换时&#xff0c;许多人可能会感到困惑和无从下手。今天&#xff0c;我将为大家推荐三款强大…

【无标题】小红书618投放高效复盘|种草效果评估

618大促进入尾声&#xff0c;品牌投放是否达到预期目标&#xff1f;如何找准复盘重点&#xff1f;如何衡量种草效果&#xff1f;如何沉淀优质的策略&#xff1f; 基于这些问题&#xff0c;千瓜推出618小红书投放复盘攻略&#xff0c;帮助品牌厘清复盘思路&#xff0c;在大促后快…

数组和文本三剑客

数组&#xff1a; 数组的定义&#xff1a;在集合当中指定多个元素&#xff0c;元素的类型&#xff1a;整数&#xff0c;字符串&#xff0c;浮点数。 数组的作用&#xff1a;可以一次性的定义多个元素&#xff0c;可以为变量赋值提供便利。 数组的定义方法&#xff1a; 数组…