Anylogic 嵌套代理 RandomNumberGenerator

Anylogic Nested Agent RandomNumberGenerator

我有一个嵌套在另一个代理中的代理。这个嵌套代理有一个函数调用 annylogic 概率分布函数 (pdf),例如 gamma()、lognormal() 等。但是,如果我在嵌套代理中调用这些 pdf,我会不断收到 nullPointerException。我意识到这是因为嵌套代理无法访问默认的 randomNumberGenerator。有没有办法我也可以访问嵌套代理中的 defaultRandomNumberGenerator 或者是为每个嵌套代理创建新生成器的唯一解决方案?

只有以某种方式连接到引擎的代理才能访问随机数生成器。如果您的实验设置为 运行 main - 如下例 - 那么所有想要使用随机数生成器的代理都必须以某种方式连接到 main

所以如果你这样做,例如它不会工作,你会得到一个 NPE(空指针异常)

如果你这样做,它会

最好的选择是创建自己的随机数生成器 lognormal(0.1, 0.1, 5, new Random(0)); (只需将随机数生成器放在某个地方,以便您可以一次又一次地使用它,否则您每次都会得到相同的数字,因为它是用于获取数字的相同(新)随机对象)

这种设计更好 - 请参阅此处的示例

错误是因为您的代理在代理的模型层次结构之外。

这不是好的做法;应该很少 需要 在模型层次结构之外拥有 'floating' 代理;他们总是可以在某个地方的特工人群中。

在极少数情况下有很强的设计理由这样做(或者如果您使用普通 Java classes 并且因此有 Java 对象,根据定义它们不是代理因此在代理层次结构之外),只需给它们一个参数(在 Java class 的情况下的字段)指向某个代理 is in模型层次结构(通常是它们的 'generator'),然后您可以通过该参数调用所有 'required-to-be-in-model-hierarchy' 函数。 (也就是说,您正在 委托 将所有此类调用委托给 可以 调用它们的代理实例。)

例如,嵌套代理类型(假设 Thing)的参数 agentRef 类型 Agent 由创建它的人设置;例如

Thing t = new Thing(this);

然后,在 Thing 中,您使用 agentRef.normal(1,10).

等代码