在我的go函数中,我有一些条件可能是真的然后调用一个动作,如果多个条件为真,它是否意味着在一个tick代理可以做多个动作?或者在另一种情况下,我有一个功能,代理必须移动到目标,面对目标代理后应找到距离和fd 1直到达到目标,这是否意味着它需要n个刻度完成?
to move [t]
face t
let n distance self t
repeat n
[fd 1]
end
to go
action 1 = > [move]
action 2
action 3
tick
end
我需要代理商当时只做一项任务,我不知道如何确保例如并非所有代理商都有相同的目标!抱歉,如果这些问题不在上下文中,但我是Multi-agent建模的新手。
答案 0 :(得分:2)
这是一个很好的问题!
首先,具体答案:
如果多个条件为真,这是否意味着在一个代理中代理可以执行多个操作?
为了清楚起见,你在谈论这样的情况吗?
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。防止这种情况的方法是使用一系列ifelse
s:
to move
ifelse xcor > 5 [
fd 1
] [
ifelse ycor > 7 [
rt 15
] [
if color = red [ bk 2 ]
]
]
end
这样,只有在第一个条件(ycor > 7
)为假时,才会查看第二个条件(xcor > 5
)。同样,只有在前两个失败时才会查看第三个条件。
我有一个功能,代理必须移动到一个目标,面对目标代理后应该找到距离和fd 1直到达到目标,这是否意味着它需要n个滴答才能完成?
我建议使用n
刻度来完成它。否则,一次只有一只乌龟会移动到目标!但是,repeat n [ fd 1 ]
会让乌龟一下子前进n
。实际上,它与fd n
相同。 {t}}块将在乌龟执行repeat
程序之前完成。
您可以按照以下方式修改move
功能,以便move
滴答:
n
然后,只要有一个条件来寻找乌龟到达目标的时间(例如,to move [t]
face t
fd 1
end
)然后做相应的事情。
我建议只使用这些不同的技术来处理多种乌龟,这样你就可以了解它们之间的差异。
我不确定如何确保例如并非所有代理都具有相同的目标!
这在很大程度上取决于背景。假设存在一个名为distance t < 1
的{{1}}变量来存储每只乌龟的目标,你可以这样做:
turtles-own
target
将报告to-report get-available-target [ possible-targets ]
report one-of possible-targets with [ not any? turtles with [ target = myself ] ]
end
中不是任何人的目标的随机代理。 get-available-target
只是从代理集中获取随机代理。
如何在netlogo中安排任务,我有条件和行动但是如何让代理人当时完成一项任务?
通常这只是照顾自己。例如,比如说,当代理人饿了,它应该走到食物供应处吃。当它走过时,你不希望它出去做任何事情。但是,它仍然会很饿,所以如果你使用了possible-targets
,它就会继续供应食物。因此,您的代理人可以免费保持专注!一般而言,最好设计条件,使其在代理解决之前保持有效。您可以在one-of
链或类似的东西中订购它们以确定行动的一般优先级(例如,如果走向食品供应的代理受到捕食者的威胁,它应该仍然会逃跑)。
如果你真的想让代理人为几个滴答做一些事情,你基本上只是扩展同样的想法,但是以一种更人为的方式。例如,如果代理应该向前走三次,则将ifelse
变量设置为三。如果该变量大于零,则代理会前进并减少该变量,并且不执行任何其他操作。
答案 1 :(得分:2)
@Bryan Head已经回答了你的问题,当我启动Netlogo和基于代理的建模时遇到了同样的问题,所以我添加了一个当前任务变量,在我的Go Procedure中我添加了一个函数来检查所有条件和设置代理的任务,当任务完成时,变量再次设置为“”。这对你的情况也许有用。
if current-task = "move" [move]
if current-task = "A1" [A1]
if current-task = "..." [...]
if current-task = "" [select-current-task]