2016-08-02 25 views
2

Ich bin neu bei NetLogo. Ich bin nicht neu in der agentenbasierten Modellierung. Hin und wieder sehe ich Leute sagen NetLogo ist so lustig und einfach, dass ich es versuche.Netlogo: Nachricht an alle außer einem Agenten senden

Ich bin auf Platz 1 stecken, kann nicht herausfinden, Code für die Nachrichtenübermittlung zwischen Agenten, die Planung von Aktionen für Teilmengen von Agenten, andere grundlegende ABM Dinge.

Ich arbeite an einem Mehrheitswahlmodell, in dem die Schildkröten Wähler mit zufällig angeordneten x, y Koordinaten sind. Kandidaten (eine neue Rasse) machen Versprechungen in x, y-Ebene, der Gewinnerkandidat ist derjenige, der von (mehr) Agenten bevorzugt wird. in der Aktualisierung der Kandidatenpositionen

Die Patches spielen überhaupt keine Rolle, es sei denn die räumliche Diagramm Verwendung eines Gitters

Ich habe Probleme zu erfordern scheint. Ich habe das wie folgt konzipiert: Entferne einen "Gewinner" -Agenten aus dem Kandidaten-Agentensatz, sage den anderen Kandidaten, dass er sich anpassen soll, lege dann den Gewinner zurück in die Agentenliste und schaue, wer in der nächsten Zeit gewinnt.

Ich glaube, das Folgende ist in der Nähe von minimalen reproduzierbaren Beispiel. Sehen Sie sich adjustOfferings an. (Sorry, verließ ich in vielen Show-Anweisungen können sonst nicht sagen, was los ist.)

; 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 

Das Setup funktioniert gut, ich sehe Agenten und Kandidaten. Wenn ich den "Step-Button" drücke, kann ich sehen, dass die Wahl funktioniert, ein Gewinner wird ausgewählt, aber alle Kandidaten passen sich an (nicht nur Verlierer). Hier ist die Konsole:

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)" 

mir scheint dies ist die Fehlerquelle:

let losers candidates with [self != winner] 

Der Gewinner ist immer noch in Verlierer danach.

Ich weiß, jetzt können Sie das tatsächlich nicht ohne den Rest der NetLogo-Datei ausführen. Was ist Ihr Brauch, um das vollständig lauffähige Beispiel bereitzustellen? Kann ich Sie auf eine Datei auf einer Website hinweisen? http://pj.freefaculty.org/scraps/majority.nlogo. Ich könnte dies in GitHub oder sonst wo einfügen, wenn Sie bevorzugen.

Ich schätze Ihren Rat.

+0

In den meisten Fällen können erfahrenere NetLogo-Programmierer sehen, was das Problem ist, ohne Ihren Code auszuführen. Wir haben nicht wirklich ein Verfahren, um voll funktionsfähige Modelle zu teilen, also würde ich es ehrlich sagen, wenn jemand nicht ausdrücklich darum bittet - sie werden wahrscheinlich einen Platz vorschlagen. Ich habe GH, GIS oder Leute gesehen, die sie auf ihre eigenen Webserver gestellt haben. –

Antwort

2

Das Problem ist in der Tat mit der von Ihnen vorgeschlagenen Linie. Beide Agenten melden für die Bedingung [self != winner], aber warum ist es der Fall. Sehen Sie sich an, wie Sie die Variable erstellen und an die Funktion übergeben. Sie erstellen es, indem Sie das modes Grundelement verwenden, was eine gute Idee ist. Aber modes meldet Ihnen eine Liste mit einem Element. Das Problem besteht darin, dass Sie diese Liste direkt an Ihre adjustofferings-Funktion übergeben. Dies bedeutet, dass die Agenten [self != [(candidatexy)]] anstelle von [self != (candidatexy)] vergleichen (beachten Sie die zusätzlichen Klammern im ersten Beispiel, die die Liste angeben).

Um das Problem zu lösen, müssen Sie den Gewinner Agent aus der Liste extrahieren, indem Sie das first Grundelement verwenden, das Ihnen das erste Element einer Liste meldet. Sie müssen dies nur der Zeile hinzufügen, in der Sie die winner Variable definieren: let winner first modes theVotes

+1

Ich stimme 99% dieser Lösung zu.Ich möchte nur hinzufügen, dass Sie vielleicht mehr als eine Schildkröte bekommen, die den Modus Anzahl der Stimmen hat, folglich enthält Ihre 'theVotes' Liste mehrere Schildkröten. Nur um sicher zu gehen, dass Sie einen zufälligen aus der Liste auswählen, würde ich 'one-of' anstelle von' first' verwenden. Die Art, wie Sie die Liste jetzt erstellen, wird zufällig sein, aber wenn Sie die Art ändern, wie Sie die Liste erstellen, kann sich das ändern. Mit 'one-of' garantieren Sie, dass Sie immer eine zufällige erhalten. –

+0

Danke für Ihre Aufmerksamkeit. Ich markiere das als Antwort. Ich genieße den steilen Teil der Lernkurve, vor allem weil die Leute sehr freundlich waren, wenn ich Fragen stellte. – pauljohn32