代理继承和人口分组

Posted

技术标签:

【中文标题】代理继承和人口分组【英文标题】:Agent Inheritance and Population Grouping 【发布时间】:2021-04-10 06:17:58 【问题描述】:

我正在更深入地研究代理继承,我仍处于探索阶段,所以我的问题不会针对示例,而是概念性的。

我的目标是创建一个具有名为 Machine 的代理类型的模型。但是,会有不同类型的机器,有些可能有不同的状态图或不同的参数。所以,最初我认为创建一个名为 Machine 的代理类型是个好主意,然后使用代理继承,创建从它扩展的代理类型(例如 Machine 1 , Machine 2 等)。

结果是,如果每种类型都有一台机器,Machine 代理类型人口将为空,而 Machine 1Machine 2 em> 每个人都有 1 个人口。我知道 AnyLogic 是这样设计的,但理想情况下,我希望看到人口为 2 的 Machine 代理类型的人口,其中一个是 Machine 1 和另一个 Machine 2 类型。

代理继承可能不是答案,但我希望我能找到解决这个问题的方法,让一个主要群体具有不同的子类型。

您可能会问为什么需要这样做。答案是所有机器都应该有类似的行为。将此与 DES 进行比较,就像拥有不同的资源一样。所有都将具有相似的行为(例如,可以被抓住、释放、附加等),但每个都可以是唯一的。

您的想法/建议将不胜感激。

谢谢!

【问题讨论】:

【参考方案1】:

如果您想使用代理继承,那么您需要有 2 个不同的种群。 Machine 类型的群体将具有 Machine 类型的代理,而不是它们的子代理类型。我通常通过拥有子代理的人口来处理这个问题,然后将所有代理存储在一个列表中(即,数组列表 - allMachines)。

您提到了不同的状态图,这是使用继承的一个很好的理由。许多人会尝试继承,因为一个延迟块需要 X 分钟,而另一个是 Y。在这些情况下,只需参数化您的一种代理类型。如果这些机器之间的逻辑差异很小,我会只考虑 1 个类,还有一些额外的决定/分支来获得你想要的行为。在 AL 中,将父进程中的进程块/可视元素连接到子进程中的区域有时会很棘手 - 并非不可能,但不像纯 Java 代码那样简单,您可以覆盖和调用 super.function()。

【讨论】:

感谢艾米的意见。我想为所有机器使用一个集合,但我希望为这种情况找到一个内置的解决方案。是的,我确实注意到您无法将块/状态从父类型连接到子类型。我认为总的来说,如果行为完全不同,最好选择一个组合所有子类型的列表,否则坚持一个具有可选状态和参数的群体,你同意吗? 是的,我同意。顺便说一句,您可以在运行时连接进程块,但不一定容易。

以上是关于代理继承和人口分组的主要内容,如果未能解决你的问题,请参考以下文章

Java中动态代理装饰模式和继承简单实现

具有代理和继承层次结构的 protobuf-net v3

设计模式—静态代理模式(聚合与继承方式比较)

在 MySQL 中实现继承:备选方案和只有代理键的表

Spring AOP入门基础-继承装饰者,代理的选择

Java基础-- 继承 多态 泛型 接口 动态绑定 动态代理