如何在文件中保存和恢复代理品种?

时间:2014-08-22 20:29:10

标签: io netlogo

我想在文件中保存和恢复一组海龟。我有这样的事情:

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编写品种变量的方式与编写truefalse等其他常量的方式相同。这是NetLogo的错误吗?是否有优雅的解决方法?

进一步考虑,我可以单独统计和存储每种代理,所以当我去恢复时我可以create squares number-of-squares等等,但我真的希望不要这样处理所有可能的种类。建议?

谢谢,

格伦

1 个答案:

答案 0 :(得分:0)

runresult原语可以在这里帮助你:它允许运行存储在字符串中的代码。

如果您使用

保存您的品种
file-write (word breed)

要确保NetLogo在其周围添加引号,您可以稍后将其恢复为:

let breed-as-string file-read
set breed runresult breed-as-string

还有其他可能的方法来保存和恢复海龟:

  • export-worldimport-world在这里可能有点过分,因为它们可以保存和恢复NetLogo世界的整个状态,但它们可能在其他环境中很有用。

  • nw:save-graphml中的nw:load-graphmlNW 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