首页 > 解决方案 > 如何调整文件(删除[])以在NetLogo中导出结果?

问题描述

我有一个问题,但找不到答案。问题是:

  1. 我有一个导出以下结果的代码:

在此处输入图像描述

我希望在不带括号 [] 的情况下导出列 (energy-of-my-agent),如下图所示。

在此处输入图像描述

编码:

globals [ output-filename ]

turtles-own [ energy my-home ]

patches-own [ patch-id my-agent energy-of-my-agent ]

to setup
ca
reset-ticks
set output-filename "energy-of-my-agent.csv"
ask patches [
sprout 1
set patch-id [ who ] of turtles-here
set my-agent turtles-here ]
  ask turtles [
set my-home patch-here
set energy 0
]
  initialize-data-file
end
   

to initialize-data-file
  if output-data?
  [
    file-close-all

    if behaviorspace-run-number <= 1 [
      ;; we only want to delete the existing file if we're running in console
      ;; when running in console,  behaviorspace-run-number = 0,
      ;; first run in behavior space is behaviorspace-run-number = 1
      if file-exists? output-filename [
        file-delete output-filename
      ]
      ;; write a header to the file
      file-open output-filename
      file-print (word "run-number, ticks, energy-of-my-agent, pxcor, pycor" )
    ]
  ]
end

to go
ask turtles [
    let times repetitions
    repeat times [
let step random 5
fd step
set energy energy - step
  ]
  ]
ask patches [
    set energy-of-my-agent [ energy ] of my-agent
    if output-data? [
      if ticks mod output-every-n-ticks = 0  [       ;;output-every-n-ticks
        write-output-data energy-of-my-agent pxcor pycor
      ]
    ]
  ]

tick
end

to write-output-data [ #energy-of-my-agent #xpos #ypos ]

  file-open output-filename
  file-print (word  behaviorspace-run-number ", " ticks ", " #energy-of-my-agent ", " #xpos ", " #ypos  )
  file-flush
end

可能吗?如果是这样,我该怎么做?非常欢迎任何形式的帮助。

提前致谢

标签: netlogo

解决方案


在 NetLogo 中,包含项目的方括号表示一个列表。

实际上,energy-of-my-agent输出中的变量在方括号中,因为它是一个列表(列表不必包含多个项目:空列表或一个项目的列表是完全可能的列表)。

为什么是energy-of-my-agent列表而不是单个值?因为它来自代理集而不是代理(正如我们已经讨论过的)。

规则是:

  • 代理报告者 -> 单个值(除非该值本身已经是一个列表)
  • 代理集的报告者 -> 列表

在您的情况下:energy-of-my-agent由 制作[energy] of my-agent并且my-agent是代理集,而不是代理。

为什么这样?因为my-agent是由 制造的turtles-here,并且turtles-here是一个代理集,而不是一个代理,即使它只包含一个代理。与列表一样,事实上,代理集不必包含多个代理:空代理集或一个代理的代理集是完全可能的代理集。

所以你有三个备选方案:

  1. 使用set my-agent one-of turtles-here. 这将为您提供一个代理,因为one-of报告一个代理。如果您确定(似乎是这种情况)补丁将始终只有sprout 1,那么one-of turtles-here将为您提供与turtles-here- 但确实是作为代理,而不是作为代理集的完全相同的代理。这反过来意味着这[energy] of my-agent将是一个值,而不是一个值的列表。

  2. 输出值时,使用sum energy-of-my-agent. 实际上,sum接受一个列表并报告一个值。鉴于一个值的列表的总和正是该值,在这种情况下sum将报告列表中的唯一值,但没有方括号。

  3. 使用 时sprout 1,可以让新生海龟将自己分配给补丁:sprout 1 [set my-agent self]。这是可能的,因为海龟可以读取和修改它们所在的补丁的变量:在这种情况下,新的海龟能够操作my-agent,特别是my-agent它所在的补丁。

我认为,在上述三个选项之间......

#2 是最不可取的:它永远不会改变代理集的事实my-agent(它只energy-of-my-agent在模拟结束时从列表转换为数字),我认为这在内存和时间方面不方便,因为使用代理集是比与代理合作更繁重的过程。

#1 没有这个问题,因为从一开始它就确保它my-agent是一个代理而不是一个代理集(使用one-of),所以它是一个比第二个更好的解决方案。然而,虽然它非常好,但从风格的角度来看,使用one-of <agentset>reads 就好像您实际上是在寻找代理集的单个随机成员,而不是寻找代理集的特定单个成员。

#3 甚至没有后一个问题:即使从句法的角度来看,这种方法也很清楚地表明,每只海龟,只有这样的海龟,是my-agent它发芽的补丁。


推荐阅读