如何解决没有人为目标补丁
我想检查目标补丁是否满足条件。如果找到满足条件的补丁, 然后海龟应该移动到那里。如果“没人”满足此条件,则应打印一条错误消息。
条件是一个斑块的半径应为10只2个相同品种的海龟。
我尝试通过ifelse
和nobody
实现这一目标。但是,即使
目标变量不为空(可以使用if循环进行检查)。
breed [ breed1s breed1 ]
breed [ breed2s breed2 ]
globals [target1 target2]
to setup
ca
create-breed1s 1000 [
setxy random-xcor random-ycor
]
create-breed1s 1000 [
setxy random-xcor random-ycor
]
end
to go
ask turtles [
set target1 ( count turtles in-radius 10 with [breed = breed1s] ) >= 2
set target2 ( count turtles in-radius 10 with [breed = breed2s] ) >= 2
new-position
]
end
to new-position
ifelse target1 != nobody
[ if (breed = breed1s) [ move-to one-of patches with [ target1 ] ] ]
[ print "Not enough agents in the neighborhood" ]
ifelse target2 != nobody
[ if (breed = breed2s) [ move-to one-of patches with [ target2 ] ] ]
[ print "Not enough agents in the neighborhood" ]
; if (breed = breed1s)
; [ move-to one-of patches with [ target1 ] ]
end
关于模型效率的说明:由于我想稍后在每个刻度中添加海龟,因此必须重新评估目标 在每个刻度中(因此在“执行”中而不是在“设置”中)。
另一个问题:是否有可能做类似[ breed = myself ]
而不是[ breed = breed1s ]
的事情,所以
我不必为每个品种都输入品种吗?
编辑: 移至目标斑块的海龟应具有与目标斑块中同样的品种。
解决方法
问题实际上是您如何创建target1,而不是检查它是否为nobody
。你有:
set target1 ( count turtles in-radius 10 with [breed = breed1s] ) >= 2
此行首先确定附近所有具有适当品种的海龟并进行计数。如果计数为2或更高,则将变量target1设置为true
,如果计数为0或1,则将变量{1}设置为false
。因此,您正在比较布尔值true
或{{1 }}到false
(一种特殊类型的代理)。那总是不匹配的,因此会显示错误。
只是调试方面的注意事项-当您遇到此类问题时,在执行检查之前为检查的每一面都有一条打印语句总是很有用的。您会立即发现target1不是您想的那样。
由于您要移动到nobody
个补丁中,因此您可能真的想存储10个距离内的可用补丁(我认为)并且具有足够的正确类型的海龟。因此,您需要类似的东西:
one-of
那么您的空度测试是to go
ask turtles [
set target1 patches in-radius 10 with [count breed1s-here >= 2]
set target2 patches in-radius 10 with [count breed2s-here >= 2]
new-position
]
end
any?
假设我已经正确地解释了您想要在要求龟的10个以内的斑块(与10个距离内有足够海龟的任何斑块相比),而您所关心的只是它自己品种的海龟的数量,然后:
to new-position
ifelse any? target1
[ move-to one-of target1 ]
[ print "Not enough agents in the neighborhood" ]
ifelse any? target2
[ move-to one-of target2 ]
[ print "Not enough agents in the neighborhood" ]
end
关于效率,这取决于您拥有多少只海龟。如果您有很多乌龟,那么要求每只乌龟盘点自己的邻居会很昂贵。相反,您可以为每个品种设置补丁集。也就是说,在执行过程开始时将target1设置为to go
ask turtles [
let target-breed [breed] of myself
set targets patches in-radius 10 with [count turtles-here with [breed = target-breed] >= 2]
new-position
]
end
to new-position
ifelse any? targets
[ move-to one-of targets ]
[ print "Not enough agents in the neighborhood" ]
end
。然后,您可以这样做:
patches with [count breed1s-here >= 2]
但是,您不能再使用乌龟的品种和to go
let targets1 patches with [count breed1s-here >= 2]
let targets2 patches with [count breed2s-here >= 2]
ask turtles
[ set targets targets1 in-radius 10
new-position
]
end
技巧来选择正确的补丁集。有多种方法可以解决此问题(例如,使用包含两个项目的列表,第一个位置繁殖,第二个位置补丁集),但是对于这个答案,却步入了正轨。
myself
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。