我有一个模型适用于少于 100 个代理(20 * 20 个世界大小),但我现在的模型要求之一是针对不同的代理组测试我的模型,我需要有超过 100 个代理(和 40 * 40 世界大小)。我尝试单独优化每个功能,但恐怕在不破坏模型要求的情况下我可以改变任何东西。
在当前版本中,我使用链接来跟踪代理关系,并且每个代理可以拥有的链接数量没有限制,因此链接数量增长非常快(超过 2000 个链接),需要更新每个链接的每次交互后的关系值。
关于在我的模型中使用链接的更多细节:
代理之间创建/更新链接的价值和频率,如果他们有社交互动
如果许多代理观察到该代理的异常社交活动,则许多代理会创建或更新其与该代理的链接值和频率(已定义这些活动的不同组,并且将根据活动类型调用不同的操作)
代理在同一块中时会观察同位代理链接的值,并据此可能有不同类型的社交互动
一定年龄范围内的代理会根据他们的链接值和其他标准找到一个伴侣。
也许还有一些我现在不记得了,但是链接的值在每个滴答中被多次调用,代理生命周期为 4000,模拟长度为 40000 个滴答,对于 100 个代理,运行需要 10-15 分钟模拟,但对于 200 个代理,只需要 10 分钟即可完成 2000 个滴答声!
由于我在为更多代理测试我的模型时遇到了一个大问题,我正在考虑消除所有链接,并为每对代理及其关系值和关系频率使用一个全局表,但由于使用链接真的很容易,我想我会有难以设定和获得价值。
有谁知道更好的方法来做到这一点?或者使 netlogo 模型可扩展的方法?
更新: 嗨,我一次又一次地检查我确信我的编程风格让我的程序变慢了,我发现 2 例意外询问其中一个非常愚蠢,因为我将链接设置为不可见,这甚至没有必要!!!每当创建链接时,我就可以设置隐藏链接!不用再问了:D
此外,我已经消除了我使用 ask 或 with for out-link neighbors 、 links 和 out-links 的情况。例如,我替换了一个代码,该代码正在检查以查找与调用者代理有共同关系的任何其他代理,我的初始代码非常慢,我用以下代码替换了它,它工作得更快:
Let Agents_I_Met out-link-neighbors
if any? other agents-here with [any? out-link-neighbors with [member? self Agents_I_Met ]]
[
Let Other_Agent one-of other agents-here with [any? out-link-neighbors with [member? self Agents_I_Met ]]
Let CommonAgent one-of Agents_I_Met with [member? Other_Agent in-link-neighbors ]
...
但是仍然有很多情况我需要打电话给其他代理,所以我认为可以让代理询问半径 X 内的其他代理!
最后,现在我的系统在更合理的时间内为 400 个代理和15000-20000个链接运行得更好:)
但我确信仍有改进的地方。感谢赛斯的有用回答:)