2017-03-28 82 views
1

我在NetLogo中爲區域選擇建模。當烏龜建立一個領土時,它也建立了一個不需要的補丁(一個叫做「黑名單」的代理集)的記憶,並且需要在爲該領土選擇新補丁的時候避免這些補丁。在決定要申請的下一個補丁時,將創建一個名爲「可用目的地」的新補丁集,根據幾個因素從中報告「最高價值」(見下文)。我想要可用的目的地來檢查補丁是否是烏龜黑名單的一部分,並排除這些補丁。但是,在補丁程序中,我很難弄清楚如何調用烏龜的黑名單。任何建議?提前致謝!NetLogo:獲取修補程序集以排除保存在龜內存中的修補程序

這裏是我的主要代碼:

patches-own 
[ 
    owner ;; turtle who claims patch for territory 
    benefit ;; i.e., food 
    avoiding ;; turtle who is avoiding this patch 
] 

turtles-own 
[ 
    start-patch ;; my territory center 
    destination ;; my next patch to claim 
    territory ;; patches I own 
    blacklist ;; my agentset of patches to avoid 
] 

to pick-patch 
    if patch-here = start-patch [ set destination highest-value ] 
    if destination != nobody [ travel ] 
end 

to travel 
    ;; there are a number of actions here, but the relevant one is: 
    ;; check if owned, and avoid it: 
    if patch-here != destination 
      [ if owner != nobody ;; if it's owned... 
      [ if owner != self ;; and not by me... 
       [ avoid-obstacle 
       move-to start-patch ] 
      ] 
      ] 
end 

to avoid-obstacle 
    ask destination [ set avoiding myself ] 
    set blacklist (patches with [avoiding = myself]) 
end 

to-report highest-value   ;; <--- source of error since using "blacklist" 
    let available-destinations edge-patches with [blacklist != myself] 
    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 2 
end 

to-report cost-to-me 
    report distance [start-patch] of myself 
end 

to-report edge-patches 
    report (patch-set [neighbors4] of territory) with [owner = nobody] 
end 

此錯誤該代碼產生從最高值的記者:此代碼不能由一個補丁運行,只有turtle--錯誤,而龜0運行BLACKLIST。我怎樣才能解決這個問題?


我的另外一個設想如下:使用patch-變量 「避免」:

to-report highest-value 
    let available-destinations edge-patches with [avoiding != myself] 
    report max-one-of available-destinations ([benefit-to-me/cost-to-me]) 
end 

這將運行。麻煩是,正如目前在「避免障礙」程序下設計的那樣,補丁知道避免成爲一隻烏龜,並且如果多個烏龜決定避免該補丁,它將被覆蓋。

因此,如果我要使用它而不是烏龜的記憶,則應該避免使用補丁集。然而,我還沒有能夠確定如何用這種方式編碼。我試過這個:

to avoid-obstacle 
     ask destination 
     [ let now-avoiding myself 
      set avoiding (turtle-set avoiding now-avoiding) ] 
     set blacklist (patch-set blacklist patches with [avoiding = myself])    
end 

避免似乎成爲一個烏龜集。烏龜對黑名單的記憶永遠不會正確完成,但是 - 它保持空白。另外,即使避免代理集包含烏龜,最高價值的記者也不會排除補丁。所以,我不知所措。


結論:我寧願去與我原來的調用龜的黑名單的方法,如果有一種方法可以做到這一點。如果我決定走另一條路線,我也很想知道我在使用「避免」的想法中做錯了什麼。謝謝!

還有一個快速相關的問題:我如何調用代理集來顯示其中的代理列表?我想這樣做來檢查代碼是否按預期工作。從指揮中心,「烏龜0的顯示[黑名單]」只返回「(agentset,50個補丁)」,而不是這50個補丁的列表,這正是我真正想看到的。

回答

2

你能使用member?做你想要排除你的補丁嗎?例如:

to-report highest-value   
    let available-destinations edge-patches with [ member? self blacklist = false ] 
    report max-one-of available-destinations ([benefit-to-me/cost-to-me]) 
end 

我真的不能測試,如果沒有你的設置和一切,但member?報道屬實,如果要求代理(在這種情況下,烏龜但潛在可用的補丁)屬於agentset 。舉個簡單的工作示例,請參見:

to setup 
    ca 
    ask patches with [pxcor > 0 ] [ 
    set pcolor white 
    ] 
    crt 1 
end 

to go 
    ask turtles [ 
    let blacklist patches with [ pcolor = black ] 
    let northpatches patches with [ pycor > 0 ] 
    let northred (northpatches with [ member? self blacklist = false ]) 
    ask northred [ set pcolor red ] 
    ask northred [ 
     print self 
    ] 
    ] 
end 

至於只是顯示哪些補丁是可用的,檢查出如何在上述過程中,烏龜問龜在其agentset「northred」自己打印到控制檯。這是一個簡單的方法!

+0

謝謝!不幸的是,這會返回相同的錯誤,「這個代碼不能由補丁運行,只有龜 - 運行MEMBER的龜0時出錯?」和以前一樣,我認爲這意味着最高價值在補丁環境中,但黑名單在烏龜環境中,對吧?如何解決這個問題? – User847462

+1

是的,你是對的 - 那不行。我認爲,如果你以這種方式使用記者,那麼記者總是會查詢補丁。然而,由於你的記者是一條非常簡單的兩行文章,你可能不會使用它(我不認爲這是必要的,因爲就我所知,總是龜特有的) - 只要把這些行放在你的烏龜運動程序簡單。查看[您的模型的這個玩具版本]中的代碼(https://lukepc.github.io/example_patch_choose.html)作爲示例。它幾乎肯定不會在您的瀏覽器中運行,您必須下載或複製/粘貼它。 –