如何解决如何使用NetLogo让满足条件的海龟移动
我目前正在使用 NetLogo 开展一个项目。 长话短说:我有一定数量的海龟分布在我的世界的前半部分。目标是让海龟在满足特定条件(数学条件)时在世界的另一半移动。 我遇到的问题是,我只希望满足条件的海龟移动到另一半(所以我假设它将是海龟的一个子组,其维度将取决于我选择的“自由收入”值滑块),但实际上,如果其中至少一个满足条件,则所有海龟都会移动。那不是我想要的。 我正在考虑使用“品种”功能,但我不确定如何实现它。 这是代码:
globals
[
lazyness-coefficient
fatigue-of-work ; cost associated with looking for work and the activity of working
free-income
working-income
]
turtles-own
[
condition ; condition = 1 if the subject works,0 if the subject is unemployed
utility-value-working-income ; utility associated with working or being unemployed while receiving a subsidy
utility-value-free-income
]
;;;
;;;
;;;
to setup
clear-all
set free-income free-income-slider ; mettere slider
set working-income working-income-slider ; mettere slider
setup-turtles
setup-patches
reset-ticks
end
to setup-patches
ask patches [ set pcolor black]
end
to setup-turtles
create-turtles 500
[
set shape "person"
set color green
set size 1.5
set condition 0
setxy random 64 random 32
set utility-value-free-income free-income ^ 2 + free-income + random-float 1000
set utility-value-working-income 0
]
end
to go
let target any? turtles with [utility-value-free-income > 14000]
if utility-value-free-income > 14000
[move-target]
end
to move-target
setxy random 64 random 64
set color blue
end
这种情况下的条件如下: 如果海龟的效用值(类型为:x^2 + x + r,其中 r 是随机因子)高于 14000,则将颜色设置为蓝色并移至另一半。 这个条件只是一个尝试,在最终项目中,条件将是: 如果自由收入效用和工作收入效用的比率高于 1,则移动到另一半并将特定海龟的颜色设置为蓝色。
希望我解释清楚了,谢谢大家。
解决方法
你想得太复杂了。 Ask 关键字允许您指定过滤器。
to go
ask turtles with [utility-value-free-income > 14000]
[
setxy random 64 random 64
set color blue
]
end
应该可以解决问题。
,Jumboman 的回答解决了最实用的方面并告诉你该怎么做,但我想包括一些更深入的观点,让你了解正在发生的事情,因为这是一开始很容易挣扎的事情.
问题的核心是您的 to go
但是,如您所见,NetLogo 不会警告您任何语法错误 - 因为实际上没有!这与您的问题的性质密切相关,即所有执行操作的海龟(而不仅仅是满足条件的海龟)。
要了解原因,我们应该退后一步:您应该始终特别注意执行过程的上下文(即执行操作的代理类型)。
In NetLogo,there are four types of agents: turtles,patches,links,and the observer. 代码总是从观察者(即你)的角度编写的。这就是为什么,如果你想让其他代理做这些事情,你需要让那些代理做那些事情。你可以让海龟请求补丁请求链接请求一些海龟做事,但最终,每一个 ask
链都从观察者开始。
然而,NetLogo 也会尝试猜测您希望谁执行您的程序。在这种情况下,假设 to go
使用海龟自己的变量(即 utility-value-free-income
和 color
,后者来自 move-target
)并调用只能由海龟(即 setxy
内的 move-target
),NetLogo 假设 to go
属于海龟上下文。
这意味着,在执行 to go
时,每只海龟都会按照 to go
所说的去做。更具体地说,这意味着每只海龟都会评估 let target
语句,然后每只海龟都会执行 to move-target
。
然而这也意味着,虽然 to go
没有给出任何语法错误,但您可能首先应该注意到其他一些奇怪的事情。目前 to go
是一个仅限于海龟的过程,您应该会看到,如果您在界面中添加 go
按钮(这是标准做法),您将收到错误消息。实际上,接口是仅观察者上下文(因此默认情况下按钮是观察者上下文,即除非您不手动更改它们的上下文)。您也会在命令中心输入 go
(默认情况下也是仅观察者上下文)以及尝试在 go
中插入 setup
时出错。
这将通过创建 to go
观察者上下文来解决,即通过从观察者上下文的任何地方调用它 + 使用 ask turtles
,如 Jumboman 所示。
在 Jumboman 的答案中隐含的另一件事是您需要明确理解的内容是 to go
中的实际代码行有什么问题。
JenB 暗示了 any?
的问题:
您显然打算创建一个名为 target
的代理集;然而,any? 只报告真/假。这意味着,正如 JenB 所说,target
不会存储任何代理集,而只会存储一个真/假值。
尽管如此,您的代码创建了这个 target
变量,但从未真正使用过它,这仍然是一个事实。事实上,您在过程名称 (move-target
) 中包含“目标”一词这一事实不会使该过程自动使用名为 target
的变量。所以,即使 target
是一个代理集,move-target
也不会自动引用 target
(就此而言,你可以给这两个元素完全随机的名字,它会是一样的).
要做到这一点,你必须这样做
to move-target
ask target ...
end
但是,正如您已经被建议的那样,with
是完成这项工作的最整洁的方式。
总的来说,以上所有事情的总和就是为什么你应该这样做:
to go
ask turtles with [utility-value-free-income > 14000] [
setxy random 64 random 64
set color blue
]
end
PS:关于context这个东西,我养成了总是写注释的习惯,在每个procedure的声明旁边,指明这个procedure所属的context。这对于加快代码的可读性和进行一些调试特别有用,因为您的模型由大量程序构建而成。
,这是关键过程:
to go
let target any? turtles with [utility-value-free-income > 14000]
if utility-value-free-income > 14000
[move-target]
end
处理每一行:
- 创建一个名为 'target' 的变量,并根据是否有任何收入足够高的海龟为其分配值
true
或 false` - 这应该会产生一个语法错误 - 假设 'utility-value-free-income' 是一个海龟属性(这必须是因为否则第 1 行没有意义),那么这一行是一个错误,因为你没有't 告诉 NetLogo 要查看哪只海龟来运行测试。
- 如果第 2 行条件为真,则在“移动目标”处运行代码
我通常建议新手 NetLogo 建模者避免在太多过程中破坏事物。从概念上考虑一下,您想要的是移动满足某些条件的海龟。这是一个概念,让它成为一个程序。像这样:
to go
move-rich-turtles
end
to move-rich-turtles
let movers turtles with [utility-value-free-income > 14000]
ask movers
[ setxy random 64 random 64
set color blue
]
end
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。