在特定路径上引导代理(Netlogo)

时间:2017-05-08 10:16:58

标签: netlogo

有一个问题,我想问一下,当我尝试输入此代码时,我收到的错误是

  

>运算符只能用于两个数字,两个字符串或两个相同类型的代理,但不能用于数字和列表。

我想问的是我如何解决这个问题,错误发生在代码的这一行:

  

如果pri-lev> [pri-lev] oppoint1和pri-lev> oppoint2的[pri-lev]

我试图把它改成"汽车开启"或"汽车用"但他们都没用。我也尝试在Netlogo字典上找到,但是我发现在特定路径上引导代理的代码没有结果。 我在这里要做的是当代理人来到特定部分时,它将检查是否有任何代理人列为" oppoint1&#34 ;; " oppoint2&#34 ;; " oppoint3&#34 ;; " oppoint4"然后将值调用pri-lev与其他值进行比较,以设置其继续移动或停止并等待其他人的决定。 这些是我的代码的一部分:

ask cars
[
  let oppoint1 (cars-at (xcor + 2) (ycor + 2))
  let oppoint2 (cars-at (xcor - 1) (ycor + 1))
  let oppoint3 (cars-at (xcor - 2) (ycor + 1))
  let oppoint4 (cars-at (xcor - 3) (ycor + 1))
  ifelse oppoint1 != nobody and oppoint2 != nobody
  [
    if pri-lev > [pri-lev] of oppoint1 and pri-lev > [pri-lev] of oppoint2
      [
        set pri-lev 4
        speed-up
      ]
  ]
  [
    if oppoint2 = nobody and oppoint3 = nobody and oppoint4 = nobody
    [
      set speed 1
      fd speed
      if turning = "Rtrue"
      [
        set heading heading + 90
        speed-up
      ]
    ] 
  ]
]

此致,Minh

1 个答案:

答案 0 :(得分:1)

似乎您收到此错误的原因是您正在将一个(当前汽车)的属性与许多属性(oppoint代理集)进行比较。你的代码现在说的是"如果我的特权超过了该组的特权,那么就做这件事......"问题是[pri-lev] of oppoint1会返回pri-lev代理集的所有成员的oppoint1列表,例如[ 10 12 13 24 ],而Netlogo不会自动遍历该列表并将每个项目与询问龟的属性进行比较。

有几种方法可以解决这个问题。例如,您可以确保只比较两只海龟 - 也许确保您在给定时间每个补丁只有一只乌龟。如果您要将一个代理程序与代理程序集进行比较,则可以使用any?原语来检查您正在查看的组中的任何成员是否满足条件语句。例如,给定此设置:

turtles-own [
  pri-lev
]

to setup
  ca
  reset-ticks
  crt 10 [
    set pri-lev 1 + random 10
  ]
end

你可以让one-of你的海龟检查当前补丁上的not any?只乌龟是否比问龟高pri-lev。如果他们都不这样做,那么当前的乌龟将向前移动。否则,它会打印出当前补丁上有另一只pri-lev更高的乌龟。

to compare-with

  ask one-of turtles [
    let other-turtles other turtles-here 
    ifelse not any? other-turtles with [ pri-lev > [pri-lev] of myself ] [
      fd 1
    ]
    [ 
      print ("A turtle here has a higher pri-lev than I do." )
    ]
  ]
  tick

end