当前位置: 首页 > 知识库问答 >
问题:

如何在AnyLogic中创建具有“code”参数的代理?

艾令雪
2023-03-14

我正在创建一个我想经常重用的AnyLogic代理。在许多AnyLogic代理和组件中,有一些空间可以输入代码,如“on receive”、“Action”或“function body”。在构建模型时,这些将被编译到代理中。普通程序员是如何做到这一点的?

例如,假设我有这个代理(显然是伪代码):

Button extends Agent
  name : Parameter  // A normal parameter for recording the button's name.
  color : Parameter // A normal parameter for recording the button's color.
  onPress : <code>  // User-provided code that is executed when the button is pressed.

客户端可能会使用它如下:

userButton7 is a Button 
  name = "Emergency Button"
  color = Red
  onPress = {
     for each Person p in simulation
         p.tryToEscapeBuilding()
  }

这可能吗?

共有2个答案

班言
2023-03-14

正如monsieurRigsby所说,您可以创建Agent类的一个子类。但实际上可以重写函数。只需在onPress函数的“自定义修饰符”中写入:@Override

施敏达
2023-03-14

您不能编写自己的代理(作为普通Java类),其中包括AnyLogic模型构建UI中的元素,如果这就是您的意思(另外,如果您编写自己的Java类来扩展代理,您必须知道用于两个所需构造函数的正确签名,这可以从为其他代理生成的代码中看到)。

但是,在AnyLogic 7中,您可以可视化地设计代理,然后使用有限的继承形式来创建该代理的子类。(请参阅基于代理的建模下有关代理继承的AnyLogic帮助。)继承的局限性在于:

  • 您可以重写/重载方法(函数)-即在子类中定义一个同名的方法-但是您不能对字段(变量/参数)做同样的事情,即使它们在超类中是私有的(因此即使在Java意义上它不会隐藏/隐藏字段的情况下);
  • 您不能在模型中使用这样的子类Agent作为顶级Agent。

[感谢nikolaj指出函数覆盖是可能的。我可以发誓我在最初的AnyLogic 7版本中尝试过,它与参数/变量具有相同的限制;也许它在7.0. x点版本之一中被更改了?]

根据具体情况,这两者都可能非常严格,但在您的示例中,这很好:有一个具有/'is'按钮的代理(带有用于颜色、名称等的AnyLogic参数)。

请注意,onPress伪代码对于可重用代理来说是有问题的,除非您执行类似于拥有列表的操作

 类似资料:
  • 我真的很感激你能提供的任何帮助。

  • 问题内容: 我正在尝试创建一个,但是在方法中添加一些错误。 请帮助我如何添加参数以及如何将其传递给在其中声明a和的另一个函数。 我的另一个功能是insertData(…) 我正在尝试创建一个并将其传递给函数。但是,当我在第一个函数中调用方法时,它将引发错误。 错误是 你调用的对象是空的 问题答案: 如果不调用其构造函数(新),则不能使用任何变量(例如,参考对象),但是不能使用新变量直接对其进行初始

  • null 我只是不明白为什么表数据不能通过PED在运行时使用?是否必须执行另一个映射步骤来将数据推送到ped Agnets? 在这一点上我陷入了僵局。我希望这个问题描述得更清楚,并感谢您的反馈。

  • 我面临着一个逻辑问题。我创建了一个带参数的函数。参数为代理消息。但是,该函数无法获取当前代理。这个论点似乎是空的。为什么?

  • 我正在AnyLogic中构建DES-ABM混合模型。代理通过DES块,其中有多个延迟块。 我该怎么办 访问处于延迟块或延迟状态的代理 访问触发延迟块“进入”操作的特定代理 我的最终目标是在代理框架上打开或关闭一个阀门对象,这样我才能/如何打开或关闭a.在代理框架上打开或关闭阀门,直接形成主/根框架(延迟块位于该框架上),或者如果这是不可能的B.在特定代理内发送消息或触发状态图,然后从特工自己的框架

  • Any逻辑:这应该很简单,但我只是在帮助文件中找不到它...在创建一个新的代理实例时,我们知道有四个参数以及它们是什么,但不知道它们是以什么顺序定义的。假设参数是“type_of_car”(字符串)、“number_of_pax”(整数)、“自动”(布尔值)、“fuel_capacity”(双精度)。现在调用时:代理被创建为具有55 pax、手动和5升燃料容量的ford——这都是错误的。(似乎代理