我想在一个文件中保存和恢复一组乌龟。我有这样的东西:
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
]查看该文件,我看到血型存储为不带引号的字符串。我尝试以什么方式读取breed变量并不重要;我只是手动地遍历一堆file-read语句就会得到一个错误。
我想我可以有意地将该品种编码为一个字符串,然后使用一大堆嵌套的ifelse块(yuk)对其进行解释。但是看起来NetLogo编写breed变量的方式与编写其他常量(如true和false )的方式相同。这是一个NetLogo错误吗?有没有(优雅的)变通方法?
在进一步的思考中,我可以单独计算和存储每种代理,这样当我去恢复时,我可以create squares number-of-squares,等等,但我真的希望不必以这种方式处理每一种可能的品种。有什么建议吗?
谢谢,
格伦
发布于 2014-08-23 09:19:39
runresult原语可以在这方面为您提供帮助:它允许运行存储在字符串中的代码。
如果您使用以下命令保存您的品种
file-write (word breed)为了确保NetLogo用引号括起来,您可以在以后恢复它,如下所示:
let breed-as-string file-read
set breed runresult breed-as-string还有其他可能的方法来拯救和恢复海龟:
export-world和import-world在这里可能有些夸张,因为它们可以保存和恢复NetLogo世界的整个状态,但它们在其他circomstances.nw:save-graphml中可能很有用,来自NW extension的nw:load-graphml也可以用于此目的。它们的主要目的是处理网络(即海龟和链接),但如果你只有海龟需要保存和恢复,它们不会抱怨。编辑:
下面是使用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
endhttps://stackoverflow.com/questions/25455108
复制相似问题