如何阻止我的海龟堆积在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
但他们仍在堆积。
答案 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
并且该补丁上没有乌龟。然后,他们将走向那个补丁。如果另一只乌龟在那里击败它们,它们将重新评估并面对满足这些条件的新补丁。