Netlogo将全局变量列表与数字

时间:2017-08-17 10:26:16

标签: list global netlogo

我提前道歉,答案可能对这个问题有多么简单,我对netlogo很新,而且非常深入。

我试图从文件中读取水温,因此根据温度让我的海龟死亡/繁殖。我最后要读取文件,并将水温设置为全局变量,但我现在仍然停留在比较部分。它不会让我将变量与数字进行比较,因为我认为变量是一个列表。出现以下错误消息;

The > operator can only be used on two numbers, two strings, or two agents of the same type, but not on a list and a number.
error while turtle 7 running >
  called by procedure REPRODUCE
  called by procedure GO
  called by Button 'go'

代码如下;

globals [ year 
  month 
water-temperature ]
extensions [ csv ] 


to setup
  ca
  load-data
  create-turtles 50
  [ set size 1
    set color red
  setxy random-xcor random-ycor ]
  reset-ticks
end

to go
  ask turtles [ move
    reproduce ] 
  run-temperature 
end

to load-data
  file-close-all
    file-open "C:\\Users\\Hannah\\Documents\\Summer research project\\test3.csv"
end 

to run-temperature
    file-close-all
    file-open "C:\\Users\\Hannah\\Documents\\Summer research project\\test3.csv"
   while [ not file-at-end? ] [
    set water-temperature csv:from-row file-read-line 
  tick ] 
  file-close 
end 

to move
 rt random 50
  lt random 50
  fd 1
end

to reproduce
  if water-temperature > 35 [ die ]
  if water-temperature > 30 and water-temperature < 34 [ hatch 1 rt random-float 360 fd 1 ] 
  if water-temperature > 25 and water-temperature < 29 [ hatch 2 rt random-float 360 fd 1 ]
  if water-temperature > 20 and water-temperature < 24 [ hatch 3 rt random-float 360 fd 1 ]
end

我会非常感激任何帮助!

谢谢:)

汉娜

1 个答案:

答案 0 :(得分:2)

欢迎使用Stack Overflow。你能否提供你的&#34; test3.csv&#34;的前几行的例子。文件?这将有助于将您的问题排序 - 如果您有一个标题或多列可能导致您的问题 - 多列可能会以列表形式读入。同样,我认为您需要file-read而不是file-read-line

其他一些事情 - 据我所知,您的load-data程序是不必要的(您只需要在run-temperature中进行加载)。

更重要的是,您的代码现在说的是:&#34;所有海龟,移动和复制。现在,逐行阅读整个温度文件。&#34; 问题是你的while语句说&#34;直到你到达终点的文件,读一行,打勾,然后移动到下一个。&#34;此外,您的模型每行tick一次,没有海龟做任何事情 - 在tick程序的最后只有go可能更简单。在这种情况下,最好避免在while过程中使用go,因为它会循环直到满足while条件。

可能更容易阅读整个test.csv并将其存储在变量中以便于访问 - 这是一个示例。使用此设置:

globals [ 
  water-temperature
  water-temperature-list
]

to setup
  ca
  crt 50 [
    setxy random-xcor random-ycor
  ]

首先,告诉Netlogo water-temperature-list是一个使用set和[]的列表。然后,像以前一样关闭/打开相同的文件,准备文件以供阅读。然后,使用类似的while循环使用water-temperature-list将您的温度读入lput

  set water-temperature-list []

  file-close-all
  file-open "test3.csv"
  while [ not file-at-end? ] [
    set water-temperature-list lput file-read water-temperature-list
  ]
  file-close-all
  reset-ticks
end

现在您的模型更简单地访问这些值,因为它们直接存储在模型变量中。您可以轻松地将ticks值与item一起用作该列表的索引 - 例如,在刻度0上将访问列表中的第一个元素,在第1个元素的刻度1上,依此类推。例如:

to go 
  set water-temperature item ticks water-temperature-list

  ask turtles [
    if water-temperature > 30 [
      die
    ]
    if water-temperature <= 30 [
     rt random 60 
     fd 1
    ]
  ] 
  tick
end

请注意,使用此设置,一旦温度结束,将会出现错误,告诉您Netlogo无法找到下一个列表元素 - 您必须在某个地方设置停止条件为了防止这种情况。

我知道这是您的方法的替代方案,但我希望它有所帮助。对于另一个类似但更复杂的示例,请查看此model by Uri Wilensky