目标:我正在尝试让乌龟选择一个目的地,然后继续向它走去,直到到达目的地。此时,乌龟返回其原始补丁并选择另一个目的地,向它走去,重复。
问题:当乌龟走向它时,所选目的地有时会发生变化。我需要一些方法告诉乌龟保持原始目的地,直到它到达它。
详细信息:这是我的相关代码。海龟正在建设领土。他们有一个领土中心点(“起始补丁”),他们从中选择一个目的地走路和索赔。目的地基于具有“最高价值”的补丁,其中值应该是补丁的好处(“对我有利”)除以距离起始补丁的距离(“成本对我”)。不过,我认为海龟在行走时不断重新评估成本。他们不应该这样做 - 必须在站在起始补丁时评估最高价值。
我如何解决这个问题,以便乌龟在站在起始补丁上时评估最高价值,设定一个目的地,并朝着它移动直到达到?
patches-own
[
owner ;; once part of a territory, owner becomes the turtle.
benefit ;; i.e., food available in a patch; used to assess "highest-value" to the turtle.
]
turtles-own
[
start-patch ;; the territory center; turtle returns here after reaching destination.
destination ;; the patch turtle wants to claim for its territory.
territory ;; the patches the turtle owns.
]
to go
tick
ask turtles
[
pick-patch
]
end
to pick-patch
set destination highest-value ;; calculated in reporters, below.
ifelse destination != nobody [
ask destination [set pcolor red] ;; reveals that destination changes occasionally before original destination is reached.
travel]
[give-up] ;; (will reposition start-patch to a new site if no destinations available.)
end
to travel
face destination forward 1 ;; **should** keep original destination, but it doesn't.
if patch-here = destination
[update-territory
move-to start-patch ] ;; return to the start-patch, and should only NOW assess new destination.
end
to update-territory
set owner self ;; and so on....
end
;;;---Reporters for highest-value:---
to-report highest-value ;; this appears to be changing while turtle moves...how fix this?
let available-destinations edge-patches
report max-one-of available-destinations [benefit-to-me / cost-to-me]
end
to-report benefit-to-me
report mean [benefit] of patches in-radius 1 ;; i.e., moving window to find high-benefit cluster
end
to-report cost-to-me
report distance myself
end
to-report edge-patches
report (patch-set [neighbors4] of territory) with [owner = nobody]
end
(注意:而不是“前进1”,我意识到我可以使用“移动到”。但是,我最终会在障碍物中建造,而且海龟将需要走向目的地检查障碍。)
更新:我认为这个问题可以在“费用对我”的记者中解决吗?我试着做这个改变:
to-report cost-to-me
report distance [start-patch] of myself
end
这应该完成我追求的目标吗?它将带走“我自己的距离”部分,以便这个成本保持不变。我所拥有的另一个想法是“挑选补丁”或“旅行”可能需要“ifelse patch-here!= destination [forward 1 ...]”的内容,但这似乎不起作用。
我尝试了下面推荐的“while”循环理念(谢谢!),这似乎引入了一个奇怪行为的新主机。如果我走那条路,我不知道如何编码。这样的东西不起作用(他们只是停止移动):
to travel
while [distance destination > 1]
[face destination forward 1]
if patch-here = destination
[update-territory
move-to start-patch ]
end
我是新手;提前感谢您的帮助!
第二次更新:我认为我在之前的更新中所做的更改(我自己的报告距离[start-patch] )修复了我的问题的一部分(假设线是否有意义?),但留下了一个问题。如果具有最高值的补丁之间存在联系,则乌龟仍会将目标切换到其选定补丁的中间位置。因此,它仍然可以追溯到最初的问题,即设置龟并保持目的地直至到达目的地。有想法该怎么解决这个吗?
答案 0 :(得分:2)
使用while
的困难在于它会在刻度期间全程移动。由于乌龟返回到开始补丁,为什么不简单地添加一个条件,它只在开始补丁时选择一个目的地?所以代码看起来像这样:
to go
tick
ask turtles
[ if patch-here = start-patch [pick-patch]
]
end
答案 1 :(得分:1)
你是对的 - 每次乌龟跑pick-patch
时,它都会经历将目的地设置为highest-value
的步骤。然后,它将向前移动并检查它是否已到达。此时,无论它是否已到达目的地,其他海龟(如果有的话)将有机会运行pick-patch
。一旦所有其他海龟都这样做了,你的原始海龟将再次将其目的地设置为新评估的最高值。因此,由于highest-value
取决于距离,并且乌龟的空间坐标在移动时会发生变化,因此其他一些补丁可能会从乌龟的新位置获得highest-value
。
您可以通过while
使用to move-until
ask turtles [
let start-patch patch-here
let destination patch-ahead 10
while [ distance destination > 1 ] [
fd 1
]
]
end
来实现您所需的一种方式,以便您的乌龟保持在程序中,直到达到您指定的任何标准。举个简单的例子:
{{1}}
显然你必须修改它以满足你的需要,但它应该让你开始。