网络徽标将全局变量列表与数字进行比较



我提前道歉,因为这个问题的答案可能很简单,我对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

我将不胜感激任何帮助!

谢谢:)

汉娜

欢迎来到Stack Overflow。您能否提供"test3.csv"文件前几行的示例?这将有助于对您的问题进行排序 - 如果您有可能导致问题的标题或多列 - 多个列可能会作为列表读入。同样,我认为您想要file-read而不是file-read-line.

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

更重要的是,你的代码现在说:">所有的海龟,移动和繁殖。现在,逐行阅读整个温度文件。问题是你的while语句是"直到你还没有到达文件的末尾,阅读一行,打勾,然后移动到下一行。此外,您的模型每行将tick一次,而无需海龟做任何事情 - 在go程序的最后进行tick可能更简单。在这种情况下,最好避免在go过程中使用while,因为它将循环直到满足while条件。

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

globals [ 
water-temperature
water-temperature-list
]
to setup
ca
crt 50 [
setxy random-xcor random-ycor
]

首先,告诉Netlogo水温列表是使用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

现在,您的模型可以更轻松地访问这些值,因为它们直接存储在模型变量中。您可以轻松地将带有itemticks值用作该列表的索引 - 例如,在 tick 0 上将访问列表中的第一个元素,在 tick 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找不到下一个列表元素 - 您必须在某处放置停止条件以防止这种情况。

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

最新更新