这是一个很好的问题!
首先,具体答案:
如果多个条件为真,是否意味着在一个滴答中,代理可以执行多个操作?
澄清一下,你说的是这样的情况吗?
to go
ask turtles [ move ]
tick
end
to move
if xcor > 5 [ fd 1 ]
if ycor > 7 [ rt 15 ]
if color = red [ bk 2 ]
end
如果是,那么是的,如果xcor > 5、ycor > 7 和color = red 都为真,乌龟将向前移动 1,向右转 15,然后向后移动 2。防止这种情况的主要方法是使用ifelses 的序列:
to move
ifelse xcor > 5 [
fd 1
] [
ifelse ycor > 7 [
rt 15
] [
if color = red [ bk 2 ]
]
]
end
这样,只有当第一个条件 (xcor > 5) 为假时,才会查看第二个条件 (ycor > 7)。同样,只有前两个条件失败时才会查看第三个条件。
我有一个功能,代理必须移动到目标,在面对目标代理后应该找到距离和 fd 1 直到到达目标,这是否意味着它需要 n 刻才能完成?
我建议使用n 完成它。否则,一次只有一只乌龟会移动到它的目标!然而,repeat n [ fd 1 ] 会让乌龟一下子向前走n。其实和fd n是一样的。 repeat 块将在海龟完成move 过程之前完成。
您可以按如下方式编辑您的move 函数以获取n 滴答声:
to move [t]
face t
fd 1
end
然后,只需要寻找乌龟何时到达其目标的条件(例如,distance t < 1),然后做相应的事情。
我建议只使用这些不同的技术,让多个海龟使用它们,这样你就可以感受其中的差异。
我不确定如何确保并非所有代理都有相同的目标!
这在很大程度上取决于上下文。假设有一个名为target 的变量turtles-own 存储了每个海龟的目标,你可以这样做:
to-report get-available-target [ possible-targets ]
report one-of possible-targets with [ not any? turtles with [ target = myself ] ]
end
get-available-target 将报告来自possible-targets 的随机代理,该代理不是任何人的目标。 one-of 只是从代理集中获取随机代理。
如何在netlogo中安排任务,我有条件和动作但是如何让代理一次做一个任务?
这通常会自行解决。例如,假设代理饿了,它应该走到食物供应处吃饭。当它走过时,你不希望它离开并做任何事情。然而,它仍然会很饿,所以如果你使用了ifelse,它就会继续去食物供应。因此,您的代理可以免费保持专注!一般来说,最好设计您的条件,使其在代理解决它们之前保持有效。您可以在ifelse 链中订购它们或类似的东西来确定行动的一般优先级(例如,如果走向食物供应的代理受到捕食者的威胁,它仍然应该逃跑)。
如果你真的想让代理在几个滴答声中做某事,你基本上只是扩展这个相同的想法,但是以一种更人为的方式。例如,如果代理应该向前走 3 次,则将 turtles-own 变量设置为 3。如果该变量大于零,则代理向前走并减小该变量,并且不执行任何其他操作。