如何提取世界上每只海龟所走的路径并将其保存在.csv文件中?
How to extract the path taken by each turtle in the world and save it in a .csv file?
我仍在尝试提取世界上每只乌龟所走路径的坐标。例如,我想知道 turtle 0 采取的路径是 patch 00 patch 0 5 patch 0 2 和 patch 1 4 并将此信息保存在 .csv 文件中。这样,我想提取出世界上所有海龟所走路径的坐标。我正在考虑创建一个列表来提供这些信息,然后保存它。
问题是我无法为创建的每只海龟创建一个空列表,然后在每次移动之前将当前补丁位置添加到列表中。最后,在 .csv
中生成此信息的文件
也就是说,在检查 turtle 时我没有看到列表,并且在 .csv 中创建文件时没有生成它。谁能帮我写代码?
提前致谢
turtles-own [ mypathx mypathy mytimer]
to setup
ca
reset-ticks
crt 5
ask turtles [
setxy random-xcor random-ycor
let i [ ]
pen-down
]
end
to go
move
let n count turtles
if n = 0 and output? = true [output] ;; ouput? is an switch on interface
if n = 0 [ stop ]
tick
end
to move
ask turtles [
rt random 360
fd 1
if ticks >= 10
[
die
]
]
end
To output
file-open "test.txt"
ask turtles [
set mypathx lput pxcor mypathx
set mypathy lput pycor mypathy
let maxer length mypathx
let i 0
repeat maxer
[
file-print (word item i mypathx " " item i mypathy " " item i mytimer)
let x ( i + 1 )
]
]
file-close
end
这里有很多需要注意的地方,所以我希望我明白你打算做什么。
首先,请注意您的代码仅在所有海龟死亡后才转到 output
(这实际上是转到 output
的条件之一:if n = 0
).因此,没有数据导出是正常的:在output
你ask turtles
,但是当output
执行时所有海龟都已经离开了模拟。
但是,Filip 在对问题的评论中也正确地注意到了一些事情:要求海龟在移动时保存他们的旅程坐标似乎是合乎逻辑的 - 而不是要求他们在模拟结束时这样做。
根据当前代码,海龟只是在模拟中移动,只有在最后(例如调用 output
时)才会要求它们保存当前位置。最好包含一段代码,让海龟在每次移动后记录它们在列表中的位置。
结合这一点和前一点,我会做类似的事情:
to setup
clear-all
reset-ticks
create-turtles 5 [
; I talk about this piece in point 3.
]
end
to go
move
tick
end
to move
ask turtles [
right random 360
forward 1
register-coordinates
]
end
to register-coordinates
set mypathx lput pxcor mypathx
set mypathy lput pycor mypathy
set mytimer lput ticks mytimer ; This is what I assumed you want mytimer to do.
end
- 另一个问题来了。您没有将 turtles-own 变量作为列表启动。
如果您现在 运行 您的代码段,则什么也不会发生,因为在您要求它们输出时所有海龟都已经死了。但是,如果你只是删除
die
命令,或者如果你要求海龟在它们死前 output
,你会得到一个错误 - 说 lput
需要一个列表但得到了其他东西。
从 NetLogo 词典中,您可以看到 list
原语用于创建具有两个值的列表。
如果要创建包含任何其他数量值的列表,则必须使用 (list ...)
。这包括您要创建空列表的情况。为此,我会这样做:
create-turtles 5 [
setxy random-xcor random-ycor
set mypathx (list)
set mypathy (list)
set mytimer (list)
pen-down
]
现在,mypathx
、mypathy
和 mytimer
是 lput
过程的合法输入。
- 最后,您可以在模拟结束时包含
output
(请注意与之前的代码示例相比,我如何更改 go
):
to go
if ticks = 11 [
ask turtles [output]
stop
]
move
tick
end
...
to output
file-open "test.csv"
file-print (word who "," mypathx "," mypathy "," mytimer)
file-close
end
因此,总的来说,重要的调整是:如果你想这样对待变量,则将它们初始化为列表;要求你的海龟在它们的 turtles-own 列表变量中保存它们的坐标 在每一步 中;只有在最后,才要求他们在输出文件中写下他们的列表变量; 在你要求乌龟输出信息之前不要杀死它们。
综合以上所有内容,代码如下所示:
turtles-own [mypathx mypathy mytimer]
to setup
clear-all
reset-ticks
create-turtles 5 [
setxy random-xcor random-ycor
set mypathx (list)
set mypathy (list)
set mytimer (list)
pen-down
]
end
to go
if ticks = 11 [
ask turtles [output]
stop
]
move
tick
end
to move
ask turtles [
right random 360
forward 1
register-coordinates
]
end
to register-coordinates
set mypathx lput pxcor mypathx
set mypathy lput pycor mypathy
set mytimer lput ticks mytimer
end
to output
file-open "test.csv"
file-print (word who "," mypathx "," mypathy "," mytimer)
file-close
end
上面代码的最后注释:
- 我不确定您希望输出的确切格式是什么,但是此示例代码在将列表保存在 .csv 文件中时效果很好 - 因此您可以从那里获取它并尝试使其适合您的需要。
- 我删除了
pcolor
部分,因为它对于问题的目的来说似乎是不必要的。
- 我不确定您希望
i
在 setup
中做什么,但就问题的目的而言,这似乎是不必要的,所以我也从我的示例代码中删除了它。小心你如何使用 item
:我不知道你想做什么,但你将它包含在你的问题中的方式经常给出 运行 时间错误。
- 我根据问题的标题创建了一个 .csv,而不是根据您提供的代码创建的 .txt。
我仍在尝试提取世界上每只乌龟所走路径的坐标。例如,我想知道 turtle 0 采取的路径是 patch 00 patch 0 5 patch 0 2 和 patch 1 4 并将此信息保存在 .csv 文件中。这样,我想提取出世界上所有海龟所走路径的坐标。我正在考虑创建一个列表来提供这些信息,然后保存它。
问题是我无法为创建的每只海龟创建一个空列表,然后在每次移动之前将当前补丁位置添加到列表中。最后,在 .csv
中生成此信息的文件也就是说,在检查 turtle 时我没有看到列表,并且在 .csv 中创建文件时没有生成它。谁能帮我写代码?
提前致谢
turtles-own [ mypathx mypathy mytimer]
to setup
ca
reset-ticks
crt 5
ask turtles [
setxy random-xcor random-ycor
let i [ ]
pen-down
]
end
to go
move
let n count turtles
if n = 0 and output? = true [output] ;; ouput? is an switch on interface
if n = 0 [ stop ]
tick
end
to move
ask turtles [
rt random 360
fd 1
if ticks >= 10
[
die
]
]
end
To output
file-open "test.txt"
ask turtles [
set mypathx lput pxcor mypathx
set mypathy lput pycor mypathy
let maxer length mypathx
let i 0
repeat maxer
[
file-print (word item i mypathx " " item i mypathy " " item i mytimer)
let x ( i + 1 )
]
]
file-close
end
这里有很多需要注意的地方,所以我希望我明白你打算做什么。
首先,请注意您的代码仅在所有海龟死亡后才转到
output
(这实际上是转到output
的条件之一:if n = 0
).因此,没有数据导出是正常的:在output
你ask turtles
,但是当output
执行时所有海龟都已经离开了模拟。但是,Filip 在对问题的评论中也正确地注意到了一些事情:要求海龟在移动时保存他们的旅程坐标似乎是合乎逻辑的 - 而不是要求他们在模拟结束时这样做。 根据当前代码,海龟只是在模拟中移动,只有在最后(例如调用
output
时)才会要求它们保存当前位置。最好包含一段代码,让海龟在每次移动后记录它们在列表中的位置。 结合这一点和前一点,我会做类似的事情:
to setup
clear-all
reset-ticks
create-turtles 5 [
; I talk about this piece in point 3.
]
end
to go
move
tick
end
to move
ask turtles [
right random 360
forward 1
register-coordinates
]
end
to register-coordinates
set mypathx lput pxcor mypathx
set mypathy lput pycor mypathy
set mytimer lput ticks mytimer ; This is what I assumed you want mytimer to do.
end
- 另一个问题来了。您没有将 turtles-own 变量作为列表启动。
如果您现在 运行 您的代码段,则什么也不会发生,因为在您要求它们输出时所有海龟都已经死了。但是,如果你只是删除
die
命令,或者如果你要求海龟在它们死前output
,你会得到一个错误 - 说lput
需要一个列表但得到了其他东西。 从 NetLogo 词典中,您可以看到list
原语用于创建具有两个值的列表。 如果要创建包含任何其他数量值的列表,则必须使用(list ...)
。这包括您要创建空列表的情况。为此,我会这样做:
create-turtles 5 [
setxy random-xcor random-ycor
set mypathx (list)
set mypathy (list)
set mytimer (list)
pen-down
]
现在,mypathx
、mypathy
和 mytimer
是 lput
过程的合法输入。
- 最后,您可以在模拟结束时包含
output
(请注意与之前的代码示例相比,我如何更改go
):
to go
if ticks = 11 [
ask turtles [output]
stop
]
move
tick
end
...
to output
file-open "test.csv"
file-print (word who "," mypathx "," mypathy "," mytimer)
file-close
end
因此,总的来说,重要的调整是:如果你想这样对待变量,则将它们初始化为列表;要求你的海龟在它们的 turtles-own 列表变量中保存它们的坐标 在每一步 中;只有在最后,才要求他们在输出文件中写下他们的列表变量; 在你要求乌龟输出信息之前不要杀死它们。 综合以上所有内容,代码如下所示:
turtles-own [mypathx mypathy mytimer]
to setup
clear-all
reset-ticks
create-turtles 5 [
setxy random-xcor random-ycor
set mypathx (list)
set mypathy (list)
set mytimer (list)
pen-down
]
end
to go
if ticks = 11 [
ask turtles [output]
stop
]
move
tick
end
to move
ask turtles [
right random 360
forward 1
register-coordinates
]
end
to register-coordinates
set mypathx lput pxcor mypathx
set mypathy lput pycor mypathy
set mytimer lput ticks mytimer
end
to output
file-open "test.csv"
file-print (word who "," mypathx "," mypathy "," mytimer)
file-close
end
上面代码的最后注释:
- 我不确定您希望输出的确切格式是什么,但是此示例代码在将列表保存在 .csv 文件中时效果很好 - 因此您可以从那里获取它并尝试使其适合您的需要。
- 我删除了
pcolor
部分,因为它对于问题的目的来说似乎是不必要的。 - 我不确定您希望
i
在setup
中做什么,但就问题的目的而言,这似乎是不必要的,所以我也从我的示例代码中删除了它。小心你如何使用item
:我不知道你想做什么,但你将它包含在你的问题中的方式经常给出 运行 时间错误。 - 我根据问题的标题创建了一个 .csv,而不是根据您提供的代码创建的 .txt。