【问题标题】:Directing an agent on a specific path (Netlogo)在特定路径上引导代理 (Netlogo)
【发布时间】:2017-05-08 10:16:58
【问题描述】:

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

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

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

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

我尝试将其更改为“cars-on”或“cars with”,但它们都无用。我也尝试在 Netlogo 字典上查找,但在将代理定向到特定路径的代码上没有找到结果。 我在这里尝试做的是,当代理到达特定部分时,它将检查是否有任何代理列为“oppoint1”; “对点2”; “对立3”; “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
      ]
    ] 
  ]
]

真诚的,明赫

【问题讨论】:

    标签: netlogo


    【解决方案1】:

    似乎您收到此错误的原因是您正在将一个(当前汽车)的属性与许多(oppoint 代理集)的属性进行比较。您的代码现在显示类似“如果我的权限大于该组的权限,请执行此操作...”问题是 [pri-lev] of oppoint1 返回oppoint1 代理集的所有成员的pri-lev 列表,如[ 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。如果它们都不做,当前的海龟将向前移动。否则,它将打印当前补丁上还有另一个 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
    

    【讨论】:

    • 亲爱的卢克,谢谢你的评论,但是,我不想在全球范围内这样做,因为当它在全球范围内检查时,总会有一些优先级高于当前的代理,我想要的代理check 只是特定区域之间的代理。例如:当前在(6,10)的代理;我想让他检查其他 3 个位置 (5,11);仅 (7,12) 和 (5,9),但不检查,例如 (9,11) 或 (11,12),依此类推。有没有指定它们?还是我应该从这些位置组成一个小组,然后检查小组中的成员?
    • 在我上面的示例中,海龟只检查它们当前所在的补丁(turtles-here 是执行此操作的原语)——并非所有补丁/全局。在一个新文件中尝试它,它是所需的所有代码。我试图说明的一点是,您无法像以前那样将一个代理与多个代理进行比较,因为您将一个代理的变量与代理集的变量列表进行比较。您所要做的就是更改我上面示例中的let 语句以适合您的模型(例如,代替我定义的other-turtles 代理集,替换为您的“oppoint”代理集)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-05
    • 1970-01-01
    相关资源
    最近更新 更多