2017-08-08 3 views
1

Ich habe ein kleines ungerichtetes Netzwerk erstellt, in dem einige Knoten als Quellen und einige als Ziele dienen. dann habe ich Wanderer auf Quellknoten platziert. Nun möchte ich einen sehr einfachen lokalen Routing-Algorithmus mit diesem Netzwerk implementieren. Hier tritt mein Algo;Lokales Routing in einem komplexen Netzwerk mit Netlogo

1 go 
2 get-list-of-neighbors 
3 select one-of from list of neighbors 
    check is-visited: 
    if yes: [remove from the list 
      check is-loop 
      if yes: Die 
      else go to setp 3] 

    4 else Move-to selected node 
    5 check is-target? 
    if yes: die 
    else add to list-of-visited and Go 

Frage: Ich bin neu auf Netlog, und weiß nicht, wie dieser Algorithmus zu implementieren. Hier ist mein Code.

to go 
ask walkers[ 
set list-of-neighbors (list [link-neighbors] of location) 
let selected-node one-of list-of-neighbors 
if (visited?=true)[ set list-of-neighbors remove-duplicate list-of-neighbors 
chek if loop? exist 
    if yes: 
    if no: 
if(visited?=false)[ move-to selected-node] 
set location selected-node 
ask location[ ifelse target=true[die][set list-of-visited lput location 
go ] 
end 

Antwort

2

Meine Antwort hier ist eine kleine Änderung meiner Antwort auf your other question. Ich bin mir nicht sicher, was genau Sie unter check is-loop meinen, also in meiner Lösung habe ich nur die Wanderer sterben, wenn sie keine Nachbarknoten haben, auf die sie sich bewegen können (da sie diesen Knoten bereits besucht haben). Außerdem schlage ich einen etwas anderen Ansatz vor, um die gleiche Idee wie der Algorithmus zu erreichen, den Sie skizzieren. Die Schritte sind hier eher wie:

  • Walker wählt einen der Nachbarn, auf die sie bewegt nicht bereits
  • Wenn kein solcher Nachbar existiert (wie es bereits alle Nachbarn von seiner aktuellen Position besucht hat) die walker stirbt.
  • Wenn ein Nachbar, der nicht besucht hat nicht vorhanden ist, wird der Wanderer zu diesem Nachbarn zu bewegen, und fügen Sie den neuen Standort seines variablen locations-list
  • Wenn der neue Standort ein Ziel:
    1. Ziel Knoten wird als besuchte
    2. Zielknoten markiert ändert seine Farbe
    3. Der Wanderer stirbt
  • Wenn keine Walkers am Ende der go-Prozedur verbleiben, wird auf dem Quellknoten ein neuer Walker generiert.
  • Wenn alle Ziele besucht werden, stoppt das Modell

Natürlich, wenn es einen linearen Weg mit mehreren Zielknoten drauf ist, werden die Wanderer jedes Mal, wenn sie mit dem ersten Ziel kommen sterben und so wird nie diejenigen besuchen Knoten, die weiter sind - aber das ist nur ein Beispiel. Entfernen Sie den die Brocken oder ändern Sie andere Dinge, um herumzuspielen.

Wie ich schon sagte, dies ist nur eine sehr kleine Änderung der oben genannten Antwort, aber ich kopiere den ganzen Code unten für einfachen Zugriff.

breed [nodes node] 
breed [walkers walker] 

walkers-own [location locations-list] 
nodes-own [ source? target? visited? ] 

to setup 
    clear-all 
    set-default-shape nodes "circle" 
    create-nodes 30 [ 
    set color blue 
    set target? false 
    set source? false 
    set visited? false 
    ] 
    ask nodes [ create-link-with one-of other nodes ] 
    repeat 500 [ layout ] 
    ask nodes [ 
    setxy 0.95 * xcor 0.95 * ycor 
    ] 
    ask n-of 3 nodes [ 
    set target? true 
    set color white 
    ] 

    ask n-of 1 nodes with [ target? = false ] [ 
    set source? true 
    set color green 
    ] 

    spawn-walkers 

    reset-ticks 
end 

to layout 
    layout-spring nodes links 0.5 2 1 
end 

to spawn-walkers 

    create-walkers 1 [ 
    set color red 
    set location one-of nodes with [ source? ] 
    move-to location 
    set locations-list (list location) 
    ] 

end 

to go 
    ask links [ set thickness 0 ] 
    ask walkers [ 
    let new-location one-of ([link-neighbors] of location) with [ not member? self [locations-list] of myself ] 
    ifelse new-location = nobody [ 
     print "I'm stuck!" 
     die 
    ] 
    [ 
     move-to new-location 
     set location new-location 
     set locations-list lput location locations-list 
     ask location [ 
     set visited? true 
     if target? = true [ 
      set color color + 1 
      ask myself [ 
      die 
      ] 
     ] 
     ] 
    ] 
    ] 

    if not any? nodes with [ target? = true and visited? = false ] [ 
    print ("All target nodes have been visited.") 
    stop 
    ] 

    if count walkers < 1 [ 
    spawn-walkers 
    ] 

    tick 
end 
+0

Thank you so viel, Herr, ich habe meine Antwort bekommen. Durch Überprüfen der Is-Schleife? Ich möchte überprüfen, ob es einen Kreis gibt. durch Bewegen zum ausgewählten Knoten. Also sollte der Walker sterben. –

0

Meine Frage/Algorithmus Beschreibung:

  1. Walker starten von Quelle Knoten
  2. An jedem Knoten wählt jeder Wanderer den nächsten Knoten seines Nachbars
  3. Wenn die alle benachbarten Knoten nicht haben besucht worden ist, dann wird der nächste Nachbar unter den Knoten ausgewählt, die nicht besucht wurden
  4. Wenn alle benachbarten Knoten vorher besucht wurden, wird der nächste Knoten unifo ausgewählt gerade unter allen Nachbarn. Der Rollator gezwungen ist, zu einem zuvor besuchten Knoten
  5. Wenn ein Zyklus erkannt wird, das heißt, die Wanderer
  6. sterben muss Wenn alle Ziele besucht werden zurückkehrt, stoppt das Modell
+0

Sehr geehrter Herr, können Sie bitte den Code gemäß der obigen Beschreibung ändern. @Luke C –

+0

Sie sollten den Code erkunden und versuchen, es herauszufinden - die meisten Ihrer neuen Anforderungen erfordern wenig Änderung von meiner Antwort unten. Wenn Sie nicht weiterkommen, geben Sie eine neue Frage mit dem Code ein, den Sie ausprobiert haben. Ihr "wenn ein Zyklus erkannt wird" allein ist eine eigene Frage wert. Diese Website soll spezifische Codierungsprobleme lösen oder Sie in die richtige Richtung weisen, anstatt vollständige Lösungen bereitzustellen. Weitere Informationen finden Sie unter [Hilfe fragen] (https://stackoverflow.com/help/asking). Außerdem, wenn meine Antwort unten das ursprüngliche Problem gelöst hat, sollten Sie es akzeptieren (mit dem Häkchen), um die Frage zu schließen. –

Verwandte Themen