如何调整文件(删除[])以在NetLogo中导出结果?

How to adjust a file (to remove []) to export result in 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 中,包含项目的方括号表示一个列表。

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

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

规则是:

  • 代理的reporter -> 单个值(除非该值本身已经是一个列表)
  • agentset的reporter -> list

在您的情况下:energy-of-my-agent[energy] of my-agentmy-agent 是一个代理集,而不是代理。

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

所以你有三个备选方案:

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

  2. 输出数值时,使用sum energy-of-my-agent。事实上,sum takes a list and reports a single value。鉴于一个值列表的总和恰好是该值,在这种情况下 sum 将报告列表中的唯一值,但没有方括号。

  3. 使用sprout 1时,可以让新生海龟将自己赋值给patch: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> 就好像你真的在寻找代理集的一个随机成员,而不是寻找对于代理集的特定单个成员。

#3 甚至没有后一个问题:即使从句法的角度来看,这种方法也非常清楚每只乌龟,而且只有这样的乌龟,是它发芽的补丁的 my-agent .