具有大代理集和矩阵扩展的奇怪的netlogo行为

时间:2015-01-13 18:25:15

标签: matrix netlogo

我正在运行一个大约120000只海龟的netlogo模型。在程序运行的某个时刻,netlogo正在将矩阵的一个条目更改为负值。它始终发生在同一个条目,但时间和价值不同。通常情况下,不应该在此矩阵中更改任何内容,并且当我使用减少的Agentset运行程序时,例如使用100000只乌龟,一切正常并且矩阵不会更改。

有谁知道为什么会这样,并且可能有这个问题的答案?

大家好, 这是发生故障的代码段:

                    set mxH2_seg1_tpa matrix:times-element-wise mx_seg1_tpa mxH1_av 
                    set mxH2_seg1_tpb matrix:times-element-wise mx_seg1_tpb mxH1_av
                    set mxH2_r_seg1_tp matrix:times-element-wise mx_r_seg1_tp mxH1_av 

                    set row 0
                    set column 0          ;At this point everything is fine           
                    while [row <= 9][
                      while [column <= 24][
                        if matrix:get mxH2_seg1_tpa column row != 0 [matrix:set mxH_seg1_tpa column row (ln matrix:get mxH2_seg1_tpa column row)] 
                        if matrix:get mxH2_seg1_tpb column row != 0 [matrix:set mxH_seg1_tpb column row (ln matrix:get mxH2_seg1_tpb column row)]     

                   ;After here matrix mx_r_seg1_tp is changed and partly filled with strange values

                        if matrix:get mxH2_r_seg1_tp column row != 0 [matrix:set mxH_r_seg1_tp column row (ln matrix:get mxH2_r_seg1_tp column row)]
                        set column column + 1]
                      set column 0
                      set row row + 1]

完整的代码已经很长了所以如果错误出现在那里,我需要一些建议寻找什么。

4 个答案:

答案 0 :(得分:2)

尝试设置随机种子(任意数字)。然后运行您的模拟,看看它何时失败以及哪个乌龟等等。然后再次运行它并在失败前将其停在勾号上并打印出变量并检查即将导致失败的乌龟。

答案 1 :(得分:0)

这一行:

if matrix:get mxH2_r_seg1_tp column row != 0 [matrix:set mxH_r_seg1_tp column row (ln matrix:get mxH2_r_seg1_tp column row)]

mxH_r_seg1_tp的元素设置为应用于ln元素的mxH2_r_seg1_tp结果。如果取小于1且大于0的数字的对数,结果将为负数。那是什么发生的?您可以使用@ JenB的建议来检查mxH2_r_seg1_tp是否包含元素&lt; 1就在失败之前。

注意,重复取对数结果的对数最终会产生一个小于1的数。也许它也是相关的,所发布代码的前三行重复乘以矩阵元素,因为重复乘法也可以生成小于1的数字。或者,乘法可能导致矩阵元素的幅度增加,而采用对数减小其幅度,并且在任何元素之前需要许多滴答。 1?由于重复计算涉及多个矩阵,因此很难知道其中一个因素是否相关,但您可以检查。

答案 2 :(得分:0)

阅读完整的代码后,我发现了自己的错误。在某个特定点上,我忘了使用matrix:copy。我仍然不确定agentset的大小是如何影响这个问题的,但我不认为它是某种实现错误。非常感谢您的支持。你的提示帮助我找到了我的错误。因此,如果有人遇到类似问题,请检查是否正确使用了matrix:copy。干杯Jan

答案 3 :(得分:0)

只是对Jan最终答案的更新:我遇到了与NetLogo 5.1和新更新的Matrix模块类似的问题。似乎矩阵:时间标量不仅会报告生成的矩阵,还会篡改原始矩阵。这可以使用此代码段(在Command Center中输入)来演示:

(let m matrix:from-row-list [[1 2 3] [4 5 6]]) (let m2 (matrix:times-scalar m -1)) (print m) (print m2)

正确的结果(由NetLogo 5.0.5给出)应为:

{{matrix:  [ [ 1 2 3 ][ 4 5 6 ] ]}}
{{matrix:  [ [ -1 -2 -3 ][ -4 -5 -6 ] ]}}

错误的结果(由NetLogo 5.1和5.2RC3提供):

{{matrix:  [ [ -1 -2 -3 ][ -4 -5 -6 ] ]}}
{{matrix:  [ [ -1 -2 -3 ][ -4 -5 -6 ] ]}}

这很可能是一个错误,因为矩阵:时间标量被定义为记者而不是程序(即:你不能只做矩阵:时间标量m -1),并且从NetLogo文档中,记者函数应该在不篡改输入的情况下报告(返回)他们的结果。

只有矩阵:时间标量受到影响。要解决此问题,您可以使用matrix:times(从NetLogo 5.1开始支持标量作为输入),或者您可以矩阵:在使用矩阵之前复制矩阵:times-scalar,或者您可以使用NetLogo 5.0.5受问题影响(但矩阵:地图等新功能将无法使用)。

有关详细信息,请参阅:https://github.com/NetLogo/Matrix-Extension/issues/12