【问题标题】:How do I create an agent with a "code" parameter in AnyLogic?如何在 AnyLogic 中创建具有“代码”参数的代理?
【发布时间】:2014-12-13 13:32:28
【问题描述】:

我正在创建一个我想经常重复使用的 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()
  }

这可能吗?

【问题讨论】:

    标签: anylogic


    【解决方案1】:

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

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

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

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

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

    请注意,您的 onPress 伪代码对于可重用的代理来说是有问题的,除非您执行类似将List&lt;? extends Person&gt; 作为代理的参数的操作(因此,在创建时,它具有对允许它的东西的通用引用使用tryToEscapeBuilding 函数循环访问代理)。

    【讨论】:

      【解决方案2】:

      正如 monsieurRigsby 所说,您可以创建 Agent 类的子类。 但实际上可以覆盖函数。 写吧: @覆盖 在 onPress 函数的“自定义修饰符”中

      【讨论】:

      • 什么是“自定义修饰符”?关于 AnyLogic,我以前从未听说过这个术语。
      • 啊,有趣;我需要玩一下。 (你仍然会错过抽象方法之类的东西,尽管你可以用一个超类方法(函数)来近似它,它会创建一个异常,说它需要被覆盖。)我很确定你不能隐藏字段(它不会让您添加具有相同名称的字段),尽管这通常不太有用。
      • @monsieurRigsby,我不确定您所说的“影子字段”是什么意思,但您可以覆盖:超类中具有相同名称的方法、参数、变量等
      • @Nikolaj 我只是仔细检查过,你肯定不能为字段(变量和参数)。尝试添加具有相同名称的名称会出现“名称重复”错误。你在做一些“聪明”的方式吗?附言Shadowing 是 Java 术语,因为定义具有相同名称的字段与方法的同一事物不同:后者覆盖(因为无法直接从子类实例调用超类版本)而以前的阴影(超类字段可以仍然可以访问)。
      • 另外,在测试它之后,您可以在不需要自定义修饰符的情况下进行覆盖(这是有道理的,因为它在 Java 中就是这样工作的;@override 是注释,在编译期间,它会仔细检查您 ,事实上,覆盖一个方法,但你不需要把它)。将编辑我的答案并确认您的观点。
      猜你喜欢
      • 1970-01-01
      • 2020-01-01
      • 2021-10-24
      • 2021-03-09
      • 2020-05-21
      • 2018-03-16
      • 1970-01-01
      • 2020-10-23
      • 2018-08-25
      相关资源
      最近更新 更多