Anylogic 检测和迭代放置在另一个代理上的代理(主要)

Anylogic detecting and iterating through agents placed on another agent (main)

我创建了一个自定义代理,将其命名为 'MyAgent' 并将其编译到一个库中。用户现在启动一个新的 Anylogic 项目,将这些 'MyAgent' 个实例(每个作为单个代理)拖放到项目 window(主窗体)上。我现在有另一个代理,也放置在 main 上,它执行一个算法来处理放置在项目上的代理。为此,它需要“检测”用户在他的项目中放置了多少这些代理(如果有的话),然后遍历每个“MyAgent”实例,对它们进行操作。

类似于:

for (int i=0;i<="number of 'MyAgent' instances on this"-1;i++) {
MyAgent thisinstance= "collection of 'MyAgent's".get(i);
thisinstance."property_I_would_like_to_modify"="new value";
thisinstance."call_a_function():"; 
}

我的问题是如何找到:

  1. “此上的 'MyAgent' 个实例数”- 在用户删除的此表单(代理)上,可能什么都没有,可能是 50,我不知道用户是否删除了任何,如果他做了多少
  2. “'MyAgent' 的集合”- 允许我遍历整个列表

上面很简单。但可能是完全错误的做法。有人可以就如何执行此操作提供一些指导吗?

这是执行此操作的唯一方法。在您的 MyAgent 启动时(或在您的用户的 Main 启动时,如果可能的话),运行 这个函数:

int counter = 0;
for (Object currObject : ((Agent)getRootAgent()).getEmbeddedObjects()) {
    if (currObject instanceof MyAgent) {
            counter ++;
    }
}

我想到了几个选项。

  1. 主列表添加到启动时。向 main 添加一个 ArrayList 类型的集合。在自定义代理的启动操作中,让他们将自己添加到此列表中。 main.listMyCustomList.add(这个)。您将至少需要一个主对象来自动将 AnyLogic 的 link 获取到主对象。如果你有 none,你可能会得到一个编译错误。解决此问题的一种方法是创建 main 类型的参数。另一种解决方法是使用 ((Main)getOwner()).listMyCustomList.add( this ) 来说明何时 main 上没有对象并让编译器满意。如果用户将对象放在 main 以外的其他地方,这将不起作用。在这些情况下,您需要添加一些检查以查看 getOwner() 的代理类型。
  2. 使用过滤器和 myAgents。您可以创建一个列表供以后使用 (listMyAgents.size()),或者您可以根据需要调用它。除了filter,count也是一个选项。这只是 return 一个对象列表,您稍后必须对其进行转换。
List<Object> listMyAgents = filter( agents(), agent -> agent instanceof MyAgent );

如果您想获得代理类型的列表,转换如下所示:

List<MyAgent> listMyAgents = (List<MyAgent>)(List<?>)filter( agents(), agent -> agent instanceof MyAgent );