【问题标题】:In NetLogo how agents actions are performed?在 NetLogo 中如何执行代理动作?
【发布时间】:2014-01-28 15:13:59
【问题描述】:

在我的 go 函数中,我有一些条件可能为真,然后调用一个动作,如果多个条件为真,这是否意味着在一个滴答声中,代理可以执行多个动作?或者在另一种情况下,我有一个功能,代理必须移动到目标,并且在面对目标代理后应该找到距离和 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

我需要代理一次只执行一项任务,但我不确定如何确保并非所有代理都具有相同的目标!抱歉,如果这些问题与上下文无关,但我是多智能体建模的新手。

【问题讨论】:

    标签: netlogo


    【解决方案1】:

    这是一个很好的问题!

    首先,具体答案:

    如果多个条件为真,是否意味着在一个滴答中,代理可以执行多个操作?

    澄清一下,你说的是这样的情况吗?

    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。防止这种情况的主要方法是使用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。如果该变量大于零,则代理向前走并减小该变量,并且不执行任何其他操作。

    【讨论】:

    • 非常感谢,这真的很有帮助,谢谢,我在 move 函数中包含 n 的原因是为了确保是否满足条件并选择了操作,我想确保代理完成在开始另一个任务之前手头的任务,但它应该不会一次全部完成,我如何在 netlogo 中安排任务,我有条件和操作但我怎样才能让代理同时执行一项任务?
    • 没问题!乐意效劳。我已通过编辑我的帖子回答了您的后续问题。
    【解决方案2】:

    @Bryan Head 已经回答了你的问题,我在启动 Netlogo 和基于代理的建模时遇到了同样的问题,所以我添加了一个当前任务变量,并在我的 Go 程序中添加了一个函数来检查所有条件和设置代理的任务,当任务完成时,变量再次设置为“”。这也可能对您的情况有用。

    if current-task = "move" [move] 
    if current-task = "A1" [A1] 
    if current-task = "..." [...] 
    if current-task = "" [select-current-task]
    

    【讨论】:

    • 这种编码风格的完整示例是状态机示例,位于 NetLogo 模型库的代码示例部分。
    • 谢谢我刚看到那个模型,它的结构简洁高效
    猜你喜欢
    • 2020-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-13
    相关资源
    最近更新 更多