如何调整文件(删除[])以在NetLogo中导出结果?
How to adjust a file (to remove []) to export result in NetLogo?
我有一个问题,但找不到答案。问题是:
- 我有一个导出以下结果的代码:
我希望导出的列(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-agent
、 和 my-agent
是一个代理集,而不是代理。
为什么会这样?因为my-agent
是由turtles-here
制作的,而turtles-here
is an agentset不是一个代理,即使它只包含一个代理。与列表相同,事实上,代理集不必包含多个代理:空代理集或一个代理的代理集是完全可能的代理集。
所以你有三个备选方案:
使用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
将是单个值,而不是一个值的列表。
输出数值时,使用sum energy-of-my-agent
。事实上,sum
takes a list and reports a single value。鉴于一个值列表的总和恰好是该值,在这种情况下 sum
将报告列表中的唯一值,但没有方括号。
使用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
.
我有一个问题,但找不到答案。问题是:
- 我有一个导出以下结果的代码:
我希望导出的列(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-agent
、 和 my-agent
是一个代理集,而不是代理。
为什么会这样?因为my-agent
是由turtles-here
制作的,而turtles-here
is an agentset不是一个代理,即使它只包含一个代理。与列表相同,事实上,代理集不必包含多个代理:空代理集或一个代理的代理集是完全可能的代理集。
所以你有三个备选方案:
使用
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
将是单个值,而不是一个值的列表。输出数值时,使用
sum energy-of-my-agent
。事实上,sum
takes a list and reports a single value。鉴于一个值列表的总和恰好是该值,在这种情况下sum
将报告列表中的唯一值,但没有方括号。使用
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
.