我想在文件中保存和恢复一组海龟。我有这样的事情:
breed [squares square]
breed [circles circle]
squares-own [side-length]
circles-own [radius]
to save-agents
file-open "test"
file-write count turtles
ask turtles [
file-write xcor
file-write ycor
file-write breed
]
ask squares [
file-write side-length
]
ask circles [
file-write radius
]
file-close
end
to restore-agents
file-open "test"
let n file-read
crt n
ask turtles [
set xcor file-read
set ycor file-read
set breed file-read ;; Right here I get an error "Expected a constant. (line number 1,
] ;; character x) error while turtle y running FILE-READ"
ask squares [
set side-length file-read
]
ask circles [
set radius file-read
]
查看文件,我发现品种存储为不带引号的字符串。我试图读取品种变量并不重要;我只是手动浏览一堆file-read
语句就会出错。
我想我可以故意将该品种编码为一个字符串,我后来使用一堆嵌套的ifelse
块(yuk)进行解释。但看起来NetLogo编写品种变量的方式与编写true
和false
等其他常量的方式相同。这是NetLogo的错误吗?是否有优雅的解决方法?
进一步考虑,我可以单独统计和存储每种代理,所以当我去恢复时我可以create squares number-of-squares
等等,但我真的希望不要这样处理所有可能的种类。建议?
谢谢,
格伦
答案 0 :(得分:0)
runresult
原语可以在这里帮助你:它允许运行存储在字符串中的代码。
如果您使用
保存您的品种file-write (word breed)
要确保NetLogo在其周围添加引号,您可以稍后将其恢复为:
let breed-as-string file-read
set breed runresult breed-as-string
还有其他可能的方法来保存和恢复海龟:
export-world
和import-world
在这里可能有点过分,因为它们可以保存和恢复NetLogo世界的整个状态,但它们可能在其他环境中很有用。
nw:save-graphml
中的nw:load-graphml
和NW extension也可用于此目的。他们的主要目的是处理网络(即海龟和链接)但如果你只有海龟可以保存和恢复它们就不会抱怨。
修改强>
以下是使用runresult
的完整示例:
breed [squares square]
breed [circles circle]
to save-and-restore-breeds
clear-all
create-squares 2
create-circles 2
if file-exists? "test" [ file-delete "test" ]
; save agents:
file-open "test"
file-write count turtles
ask turtles [ file-write (word breed) ]
file-close
clear-all
; restore agents:
file-open "test"
let n file-read
crt n [
let breed-as-string file-read
set breed runresult breed-as-string
]
file-close
show [ breed ] of turtles
end