NetLogo:请乌龟设置目的地并继续向它走去,直到达到

时间:2017-03-23 19:20:14

标签: netlogo

目标:我正在尝试让乌龟选择一个目的地,然后继续向它走去,直到到达目的地。此时,乌龟返回其原始补丁并选择另一个目的地,向它走去,重复。

问题:当乌龟走向它时,所选目的地有时会发生变化。我需要一些方法告诉乌龟保持原始目的地,直到它到达它。

详细信息:这是我的相关代码。海龟正在建设领土。他们有一个领土中心点(“起始补丁”),他们从中选择一个目的地走路和索赔。目的地基于具有“最高价值”的补丁,其中值应该是补丁的好处(“对我有利”)除以距离起始补丁的距离(“成本对我”)。不过,我认为海龟在行走时不断重新评估成本。他们不应该这样做 - 必须在站在起始补丁时评估最高价值。

我如何解决这个问题,以便乌龟在站在起始补丁上时评估最高价值,设定一个目的地,并朝着它移动直到达到?

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] )修复了我的问题的一部分(假设线是否有意义?),但留下了一个问题。如果具有最高值的补丁之间存在联系,则乌龟仍会将目标切换到其选定补丁的中间位置。因此,它仍然可以追溯到最初的问题,即设置龟并保持目的地直至到达目的地。有想法该怎么解决这个吗?

2 个答案:

答案 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}}

显然你必须修改它以满足你的需要,但它应该让你开始。