如何阻止我的海龟堆积在NetLogo上?

时间:2017-07-27 21:10:28

标签: netlogo

如何阻止我的海龟堆积在NetLogo上?

我需要我的海龟移动,但不要彼此重叠并停止堆积。

我已尝试使用以下代码:

to go ask turtles [ let empty-patches neighbors with [not any? turtles-here]

if (breed = ricos)  [
 face one-of patches with [ price = 1000 ]
 if any? empty-patches  [
  fd 1 ]
  ]
 if (breed = pobres) [
 face one-of patches with [ price = 1000 ]
 if any? empty-patches [
 fd 1 ]
 ]
   if (breed = medias)[
     if any? empty-patches [
  face one-of patches with [ price = 1000 ]
 fd 1]

]
]

end

to move-to-empty-one-of [locations]

  move-to one-of locations
  while [any? other turtles-here] [
    move-to one-of locations
  ]
end

但他们仍在堆积。

1 个答案:

答案 0 :(得分:3)

欢迎来到Stack Overflow!提供minimal complete verifiable example代码以使其易于重现通常很有帮助 - 这将增加您获得有用答案的机会。

如果您已将海龟设置为品种(breed [ ricos rico ]),则可以说ask ricos [ ...

你是否在某处调用了move-to-empty-one-of [locations]程序?它没有在示例代码中调用,因此可能有助于海龟堆叠的程序没有运行。

一个注意事项 - 你的代码说的是:
- 空补丁是没有海龟的邻居补丁 - 面对其中一个价格为1000的补丁 - 如果有任何空补丁,请向前移动1

问题在于neighbors包括当前乌龟周围的8个空单元格。所以,当你说if any? empty-patches [ ...时,可能会有至少一个空的补丁,所以乌龟几乎总能向前移动。以下是可能适合您的替代方法:

breed [ ricos rico ]
patches-own [ price ]

to setup
  ca
  reset-ticks

  ask n-of 20 patches [ 
    set price 1000
    set pcolor grey + 2
  ]
  create-ricos 20 [
    set color random 3 + 63
    setxy random-xcor random-ycor
  ]
end


to go

  ask ricos [
    ifelse [price] of patch-here != 1000 or any? other turtles-here [
      let target min-one-of patches with [ price = 1000 and not any? turtles-here ] [ distance myself]
      face target
      fd 1
    ]
    [
      move-to patch-here
    ]
  ]
  tick 
end

这可以通过让ricos(在此示例中)检查它们是否位于price不等于1000的补丁或存在其他海龟的补丁中。如果是,他们将面对最近的补丁price = 1000并且该补丁上没有乌龟。然后,他们将走向那个补丁。如果另一只乌龟在那里击败它们,它们将重新评估并面对满足这些条件的新补丁。