在NetLogo中如何执行代理操作?

时间:2014-01-28 15:13:59

标签: netlogo

在我的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建模的新手。

2 个答案:

答案 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 > 5ycor > 7color = 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]