netlogo - 如何调整文件(删除[])以在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
列表而不是单个值?因为它来自代理集而不是代理(正如我们已经讨论过的)。
规则是:
- 代理报告者 -> 单个值(除非该值本身已经是一个列表)
- 代理集的报告者 -> 列表
在您的情况下:energy-of-my-agent
由 制作[energy] of my-agent
,并且my-agent
是代理集,而不是代理。
为什么这样?因为my-agent
是由 制造的turtles-here
,并且turtles-here
是一个代理集,而不是一个代理,即使它只包含一个代理。与列表一样,事实上,代理集不必包含多个代理:空代理集或一个代理的代理集是完全可能的代理集。
所以你有三个备选方案:
使用
set my-agent one-of turtles-here
. 这将为您提供一个代理,因为one-of
报告一个代理。如果您确定(似乎是这种情况)补丁将始终只有sprout 1
,那么one-of turtles-here
将为您提供与turtles-here
- 但确实是作为代理,而不是作为代理集的完全相同的代理。这反过来意味着这[energy] of my-agent
将是一个值,而不是一个值的列表。输出值时,使用
sum energy-of-my-agent
. 实际上,sum
接受一个列表并报告一个值。鉴于一个值的列表的总和正是该值,在这种情况下sum
将报告列表中的唯一值,但没有方括号。使用 时
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
它发芽的补丁。
推荐阅读
- spring - 验证请求时未触发 Spring Boot HandlerInterceptor
- php - 在我的数据库 mysql 中创建子菜单时出现错误
- c++ - 从外部资源管理 VS_VERSION_INFO FILEVERSION
- apache-kafka - 创建 KSQL 流时出现问题 - java.lang.NoClassDefFoundError:无法初始化类 org.xerial.snappy.Snappy
- html - 如何将插件添加到 CKEditor 5?
- javascript - 如何在预建表单上将表单数据存储到 localStorage(编辑:“无法设置未定义的 'onsubmit' 的属性”)
- laravel - 尝试执行自定义命令以运行迁移时出错
- python - 在python中以保护模式保存文件字
- python - 将两个 Pandas 列与另一个 DataFrame 进行比较
- selenium - 如何使用 xpath 获取 HTML 的后续兄弟或子级