我在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個補丁的列表,這正是我真正想看到的。
謝謝!不幸的是,這會返回相同的錯誤,「這個代碼不能由補丁運行,只有龜 - 運行MEMBER的龜0時出錯?」和以前一樣,我認爲這意味着最高價值在補丁環境中,但黑名單在烏龜環境中,對吧?如何解決這個問題? – User847462
是的,你是對的 - 那不行。我認爲,如果你以這種方式使用記者,那麼記者總是會查詢補丁。然而,由於你的記者是一條非常簡單的兩行文章,你可能不會使用它(我不認爲這是必要的,因爲就我所知,總是龜特有的) - 只要把這些行放在你的烏龜運動程序簡單。查看[您的模型的這個玩具版本]中的代碼(https://lukepc.github.io/example_patch_choose.html)作爲示例。它幾乎肯定不會在您的瀏覽器中運行,您必須下載或複製/粘貼它。 –