2016-08-02 13 views
2

我是NetLogo的新成員。我並不是新的基於代理的建模。我偶爾會看到有人說NetLogo是如此的有趣和簡單,我試了一下。netlogo:發送消息給除一個代理之外的所有人

我被困在廣場1處,找不到代理之間的消息傳遞代碼,調度代理子集的操作,其他基本的ABM事情。

我正在處理一個多數規則選舉模型,其中海龜是隨機放置x,y座標的選民。候選人(新品種)在x,y平面作出承諾,獲勝的候選人是(接近)更多代理人首選的候選人。

補丁發揮任何作用,除了空間圖形似乎需要使用我在候選位置的更新麻煩網格

的。我的想法如下:從候選人代理組中刪除一個「優勝者」代理,告訴其他候選人進行調整,然後將優勝者退回代理名單,並查看下次誰獲勝。

我相信以下是接近最小可重現的例子。請看adjustOfferings。 (對不起,我留在了很多表演的語句,否則不能告訴是怎麼回事。)

; Paul Johnson 
; 20160801 
breed [candidates candidate] 
globals[ 
    N 
    D 
] 
; turtles are voters, Euclidean-based preferences. Use 
; built-in 2d coordinates for ideal points for now, 
; need to learn how to create weighted multi-dimensional 
; preferences later 
turtles-own 
[ 
    name 
] 

to setup 
    ca ; clear all 
    reset-ticks ; time start 0 

    set N 100 
    ; N voters with random x,y ideal points 
    create-turtles N 
    [ 
    setxy random-xcor random-ycor 
    ] 

    set D 2 
    create-candidates D 
    [ 
    setxy random-xcor random-ycor 
    set shape "square" 
    set size 2 
    ] 
end 

; collect up the votes. Don't worry about invading agent 
; privacy, just measure for them 
to-report election2 [choices] 
    let fave [min-one-of choices [distance myself]] of turtles 
    report fave 
end 

; Ask all non winners to adjust their offering 
to adjustOfferings [winner] 
    show (word "in adjustOfferings, winner was: " winner) 
    let losers candidates with [self != winner] 
    show (word "adjustOfferings losers are: " losers) 
    ask losers 
    [ 
    setxy random-xcor random-ycor 
    ] 
end 

; ask each voter for its favorite, 
; use modes to calculate the winner 
to electionCycle 
    let theVotes election2 candidates 
    show (word "electionCycle: " theVotes) 
    let winner modes theVotes 
    show (word "electionCycle Winner: " winner) 
    adjustOfferings winner 
end 

to go 
    tick 
    if ticks > 1000 
    [ 
    stop 
    ] 
    electionCycle 
end 

的設置工作正常,我看到代理商和候選人。當我點擊「按鈕」時,我可以看到選舉作品,選出了勝利者,但是所有候選人都調整了(不僅僅是輸家)。這裏的控制檯:

observer: "electionCycle: [(candidate 100) (candidate 101) 
(candidate 101) (candidate 101) (candidate 100) (candidate 101) 
[snip] 
(candidate 100) (candidate 101)]" 
observer: "electionCycle Winner: [(candidate 100)]" 
observer: "in adjustOfferings, winner was: [(candidate 100)]" 
observer: "adjustOfferings losers are: (agentset, 2 turtles)" 

,在我看來,這是錯誤的來源:

let losers candidates with [self != winner] 

贏家仍處於後失敗者。

我現在意識到,如果沒有NetLogo文件的其餘部分,您實際上無法運行此操作。您在此提供的完全可運行示例的定製是什麼?我可以將您指向網站上的文件嗎? http://pj.freefaculty.org/scraps/majority.nlogo。如果你願意,我可以把它放在GitHub或其他地方。

我很感謝您的建議。

+0

在大多數情況下,更多經驗豐富的NetLogo程序員可以在不運行代碼的情況下查看問題所在。我們實際上沒有共享完全可運行的模型的過程,所以老實說,我會阻止發佈它,除非有人特別要求它 - 他們可能會建議一個地方。我見過GH,gists或人們把它們放在自己的網絡服務器上。 –

回答

2

問題確實與您建議的行一致。兩個代理商均對[self != winner]的情況報告了真實情況,但爲什麼是這種情況。看看你如何創建並將winner變量傳遞給函數。您可以使用modes原語創建它,這是一個好主意。但是modes會向您報告一個元素的列表。問題是你直接將這個列表傳遞給你的adjustofferings函數。這意味着,代理人比比較[self != [(candidatexy)]]而不是[self != (candidatexy)](介意第一個示例中的附加括號,表示列表)。

要解決該問題,必須使用first基元從列表中提取優勝者代理,該基元將向您報告列表的第一項。您只需將其添加到行中,即定義winner變量:let winner first modes theVotes

+1

我同意此解決方案的99%。我只想補充一點,你可能會得到不止一個有投票方式數的烏龜,因此你的'theVotes'列表包含了幾個烏龜。只是爲了確保你從列表中隨機選擇一個,我會使用「one-of」而不是「first」。現在構建列表的方式是隨機的,但如果您更改構建列表的方式,則可能會改變。使用'one-of'將保證你總是得到一個隨機的。 –

+0

感謝您的關注。我將其標記爲答案。我很享受學習曲線的陡峭部分,主要是因爲當我提問時,人們一直很愉快。 – pauljohn32

相關問題