【问题标题】:How to avoid turtles revisiting the patch on which they were last time?如何避免海龟重新访问它们上次所在的补丁?
【发布时间】:2014-06-25 08:12:12
【问题描述】:

海龟在补丁上停留 60 刻,然后移动到另一个目标补丁。如何避免海龟重新访问它们上次所在的补丁?谢谢

嗨,赛斯和弗兰克,

非常感谢您的回复。很抱歉我没有详细描述问题。

海龟不会访问它们在上一个滴答时所在的补丁,而是会在下一个滴答时移动到另一个最近的补丁。下面的代码意味着他们找到了最近的补丁,并继续前进。

我想做的是乌龟会在下一个滴答声中再次找到最近的补丁。如果最近的补丁仍然与他们在最后一个滴答时相同的补丁,他们将移动到离他们最近的其他选择。谢谢

let closest-leaf min-one-of (patches in-radius 1 with [pcolor = lime]) [distance myself]

face closest-leaf

fd distance closest-leaf

【问题讨论】:

  • 只有它们在最后一个滴答上的补丁,或者他们在之前所有滴答中的所有补丁...?
  • 嗨赛斯和弗兰克,非常感谢您的回复。海龟不会访问它们在最后一次滴答时所在的补丁,而是会移动到另一个最近的补丁。请看上面的代码。

标签: netlogo


【解决方案1】:

一个好方法是拥有一个可以维护的海龟自己的访问补丁变量(请记住在创建海龟时将其初始化为空列表)。

turtles-own [ patches-visited ]

to setup
  ...
  ask turtles [ set patches-visited [] ]
  ...
end

to move
  let potential-targets filter [ not member? ? patches-visited ] target-patches
  let target-patch one-of potential-targets

  if target-patch != NOBODY [
    set patches-visited fput target-patch patches-visited
    ; move to target patch
  ]
end

【讨论】:

  • 您好弗兰克,谢谢您的回答。我认为您的答案是指它们在之前的所有刻度中使用的所有补丁。我想做的是乌龟会在下一个滴答声中再次找到最近的补丁。如果最近的补丁仍然与他们在最后一个滴答时相同的补丁,他们将移动到离他们最近的其他选择。谢谢
【解决方案2】:

添加get-target 记者。

to-report get-target  ;;turtle proc
  let %close patches in-radius 1 with [pcolor = lime and self != [patch-here] of myself]
  ifelse (any? %close) [
    report min-one-of %close [distance myself]
  ] [
    report nobody
  ]
end

现在您可以轻松地改变对如何选择目标的想法。然后您可以移动到目标(如果存在)。

to move  ;; turtle proc
  let %target get-target
  ifelse (%target = nobody) [
    ;handle this case
  ] [
    face %target move-to %target
  ]
end

【讨论】:

  • 嗨艾伦,非常感谢您的回复。我运行代码,有一个错误。此代码无法在 fly 1 运行时因补丁错误而运行并由过程调用 GET-TARGET 由过程调用 SHORT-HOP 由过程调用 MOVE-FLIES 由过程调用 GO 由按钮“运行”调用 有些问题 pcolor =石灰和自我!= 补丁在这里。谢谢。
  • 是的。补丁无法运行patch-here。固定。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多