具有大代理集和矩阵扩展的奇怪 netlogo 行为
Weird netlogo behavoir with big agentset and matrix extension
我是 运行 一个拥有大约 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]
完整的代码已经很长了,所以如果哪里有错误,我需要一些建议来寻找什么。
尝试设置随机种子(任意数字)。然后 运行 你的模拟,看看它什么时候失败,哪只乌龟等。然后再次 运行 它并在失败前的刻度处停止它并打印出变量并检查即将导致失败的乌龟.
这一行:
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
的一个元素设置为应用于 mxH2_r_seg1_tp
的一个元素的 ln
的结果。如果对小于 1 且大于 0 的数取对数,结果将为负数。这是怎么回事?您可以使用@JenB 的建议来检查 mxH2_r_seg1_tp
是否有元素 < 1 就在失败之前。
注意,对取对数的结果反复取对数,最终会得到一个小于1的数。也许贴出的代码前三行重复矩阵元素相乘也有关系,因为重复相乘可以产生小于 1 的数字也是如此。或者乘法可能导致矩阵元素的幅度增加,而取对数会降低它们的幅度,并且在任何元素 < 1 之前需要很多滴答?由于重复计算涉及多个矩阵,因此很难知道这些因素是否相关,但您将能够检查。
通读完整代码后我发现了我的错误。在某一特定时刻,我忘记使用 matrix:copy
。我仍然不确定代理集的大小如何影响这个问题,但我不认为这是某种实现错误。非常感谢您的支持。你的提示帮助我找到了我的错误。因此,如果有人遇到类似问题,请检查 matrix:copy
是否被正确使用。欢呼一月
只是关于 1 月最终答案的更新:我在 NetLogo 5.1 和新更新的 Matrix 模块中遇到了类似的问题。看来 matrix:times-scalar 不仅会报告结果矩阵,还会篡改原始矩阵。这可以使用此代码片段(在命令中心输入)进行演示:
(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 ] ]}}
这很可能是一个错误,因为 matrix:times-scalar 被定义为一个报告器而不是一个过程(即:你不能只做 matrix:times-scalar m -1),并且从NetLogo 文档,报告函数应该在不篡改输入的情况下报告(return)它们的结果。
只有 matrix:times-标量受到影响。要解决此问题,您可以使用 matrix:times(自 NetLogo 5.1 起支持标量作为输入),或者您可以在使用 matrix:times-标量之前 matrix:copy 您的矩阵,或者您可以使用 NetLogo 5.0.5不受此问题影响(但matrix:map等新功能将不可用)。
有关详细信息,请参阅:https://github.com/NetLogo/Matrix-Extension/issues/12
我是 运行 一个拥有大约 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]
完整的代码已经很长了,所以如果哪里有错误,我需要一些建议来寻找什么。
尝试设置随机种子(任意数字)。然后 运行 你的模拟,看看它什么时候失败,哪只乌龟等。然后再次 运行 它并在失败前的刻度处停止它并打印出变量并检查即将导致失败的乌龟.
这一行:
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
的一个元素设置为应用于 mxH2_r_seg1_tp
的一个元素的 ln
的结果。如果对小于 1 且大于 0 的数取对数,结果将为负数。这是怎么回事?您可以使用@JenB 的建议来检查 mxH2_r_seg1_tp
是否有元素 < 1 就在失败之前。
注意,对取对数的结果反复取对数,最终会得到一个小于1的数。也许贴出的代码前三行重复矩阵元素相乘也有关系,因为重复相乘可以产生小于 1 的数字也是如此。或者乘法可能导致矩阵元素的幅度增加,而取对数会降低它们的幅度,并且在任何元素 < 1 之前需要很多滴答?由于重复计算涉及多个矩阵,因此很难知道这些因素是否相关,但您将能够检查。
通读完整代码后我发现了我的错误。在某一特定时刻,我忘记使用 matrix:copy
。我仍然不确定代理集的大小如何影响这个问题,但我不认为这是某种实现错误。非常感谢您的支持。你的提示帮助我找到了我的错误。因此,如果有人遇到类似问题,请检查 matrix:copy
是否被正确使用。欢呼一月
只是关于 1 月最终答案的更新:我在 NetLogo 5.1 和新更新的 Matrix 模块中遇到了类似的问题。看来 matrix:times-scalar 不仅会报告结果矩阵,还会篡改原始矩阵。这可以使用此代码片段(在命令中心输入)进行演示:
(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 ] ]}}
这很可能是一个错误,因为 matrix:times-scalar 被定义为一个报告器而不是一个过程(即:你不能只做 matrix:times-scalar m -1),并且从NetLogo 文档,报告函数应该在不篡改输入的情况下报告(return)它们的结果。
只有 matrix:times-标量受到影响。要解决此问题,您可以使用 matrix:times(自 NetLogo 5.1 起支持标量作为输入),或者您可以在使用 matrix:times-标量之前 matrix:copy 您的矩阵,或者您可以使用 NetLogo 5.0.5不受此问题影响(但matrix:map等新功能将不可用)。
有关详细信息,请参阅:https://github.com/NetLogo/Matrix-Extension/issues/12