2016-03-29 13 views
0

Ich möchte ein Netlogo-Projekt erstellen, wo es eine Beschreibung der KI gibt und andere Schlüsseldaten aufzeichnet, die eventuell auftretende Fehler anzeigen können. Ich habe gesehen, dass es ein Protokollregister im Benutzerhandbuch gibt, aber es ist ein bisschen alt und sieht nicht hilfreich aus, während ich erfahren habe, dass es eine Erweiterung namens CSV gibt, die mir helfen kann, aber ich möchte keine Erweiterungen in dieses Projekt einfügen . Hier ist der Code, den ich gerade verwende;Wie kann ich Daten in Netlogo protokollieren

; global variables used 
globals 
[ 
    open ; the open list of patches 
    closed ; the closed list of patches 
    optimal-path ; the optimal path, list of patches from source to destination 
] 

; patch variables used 
patches-own 
[ 
    parent-patch ; patch's predecessor 
    f ; the value of knowledge plus heuristic cost function f() 
    g ; the value of knowledge cost function g() 
    h ; the value of heuristic cost function h() 
] 

; turtle variables used 
turtles-own 
[ 
    path ; the optimal path from source to destination 
    current-path ; part of the path that is left to be traversed 
] 

; setup the world 
to Setup 
    ;; (for this model to work with NetLogo's new plotting features, 
    ;; __clear-all-and-reset-ticks should be replaced with clear-all at 
    ;; the beginning of your setup procedure and reset-ticks at the end 
    ;; of the procedure.) 
    __clear-all-and-reset-ticks ;; clear everything (the view and all the variables) 
    create-source-and-destination 
end 

; create the source and destination at two random locations on the view 
to create-source-and-destination 
    ask one-of patches with [pcolor = black] 
    [ 
    set pcolor blue 
    set plabel "source" 
    sprout 1 
    [ 
     set color red 
     ;pd 
    ] 
    ] 
    ask one-of patches with [pcolor = black] 
    [ 
    set pcolor green 
    set plabel "destination" 
    ] 
end 

; draw the selected maze elements on the view 
to draw 
    if mouse-inside? 
    [ 
     ask patch mouse-xcor mouse-ycor 
     [ 
     sprout 1 
     [ 
      set shape "square" 
      die 
     ] 
     ] 

     ;draw obstacles 
     if Select-element = "obstacles" 
     [ 
     if mouse-down? 
     [ 
      if [pcolor] of patch mouse-xcor mouse-ycor = black or [pcolor] of patch mouse-xcor mouse-ycor = brown or [pcolor] of patch mouse-xcor mouse-ycor = yellow 
      [ 
      ask patch mouse-xcor mouse-ycor 
      [ 
       set pcolor white 
      ] 
      ] 
     ] 
     ] 

     ;erase obstacles 
     if Select-element = "erase obstacles" 
     [ 
     if mouse-down? 
     [ 
      if [pcolor] of patch mouse-xcor mouse-ycor = white 
      [ 
      ask patch mouse-xcor mouse-ycor 
      [ 
       set pcolor black 
      ] 
      ] 
     ] 
     ] 

     ;draw source patch 
     if Select-element = "source" 
     [ 
     if mouse-down? 
     [ 
      let m-xcor mouse-xcor 
      let m-ycor mouse-ycor 
      if [plabel] of patch m-xcor m-ycor != "destination" 
      [ 
      ask patches with [plabel = "source"] 
      [ 
       set pcolor black 
       set plabel "" 
      ] 
      ask turtles 
      [ 
       die 
      ] 
      ask patch m-xcor m-ycor 
      [ 
       set pcolor blue 
       set plabel "source" 
       sprout 1 
       [ 
       set color red 
       ;pd 
       ] 
      ] 
      ] 
     ] 
     ] 

     ;draw destination patch 
     if Select-element = "destination" 
     [ 
      if mouse-down? 
      [ 
       let m-xcor mouse-xcor 
       let m-ycor mouse-ycor 

       if [plabel] of patch m-xcor m-ycor != "source" 
       [ 
       ask patches with [plabel = "destination"] 
       [ 
        set pcolor black 
        set plabel "" 
       ] 
       ask patch m-xcor m-ycor 
       [ 
        set pcolor green 
        set plabel "destination" 
       ] 
       ] 
      ] 
     ] 
    ] 
end 

; call the path finding procedure, update the turtle (agent) variables, output text box 
; and make the agent move to the destination via the path found 
to find-shortest-path-to-destination 
    reset-ticks 
    ask one-of turtles 
    [ 
    move-to one-of patches with [plabel = "source"] 
    set path find-a-path one-of patches with [plabel = "source"] one-of patches with [plabel = "destination"] 
    set optimal-path path 
    set current-path path 
    ] 
    output-show (word "Shortest path length : " length optimal-path) 
    move 
end 


; the actual implementation of the A* path finding algorithm 
; it takes the source and destination patches as inputs 
; and reports the optimal path if one exists between them as output 
to-report find-a-path [ source-patch destination-patch] 

    ; initialize all variables to default values 
    let search-done? false 
    let search-path [] 
    let current-patch 0 
    set open [] 
    set closed [] 

    ; add source patch in the open list 
    set open lput source-patch open 

    ; loop until we reach the destination or the open list becomes empty 
    while [ search-done? != true] 
    [ 
    ifelse length open != 0 
    [ 
     ; sort the patches in open list in increasing order of their f() values 
     set open sort-by [[f] of ?1 < [f] of ?2] open 

     ; take the first patch in the open list 
     ; as the current patch (which is currently being explored (n)) 
     ; and remove it from the open list 
     set current-patch item 0 open 
     set open remove-item 0 open 

     ; add the current patch to the closed list 
     set closed lput current-patch closed 

     ; explore the Von Neumann (left, right, top and bottom) neighbors of the current patch 
     ask current-patch 
     [ 
     ; if any of the neighbors is the destination stop the search process 
     ifelse any? neighbors4 with [ (pxcor = [ pxcor ] of destination-patch) and (pycor = [pycor] of destination-patch)] 
     [ 
      set search-done? true 
     ] 
     [ 
      ; the neighbors should not be obstacles or already explored patches (part of the closed list) 
      ask neighbors4 with [ pcolor != white and (not member? self closed) and (self != parent-patch) ] 
      [ 
      ; the neighbors to be explored should also not be the source or 
      ; destination patches or already a part of the open list (unexplored patches list) 
      if not member? self open and self != source-patch and self != destination-patch 
      [ 
       ;set pcolor 45 

       ; add the eligible patch to the open list 
       set open lput self open 

       ; update the path finding variables of the eligible patch 
       set parent-patch current-patch 
       set g [g] of parent-patch + 1 
       set h distance destination-patch 
       set f (g + h) 
      ] 
      ] 
     ] 
     if self != source-patch 
     [ 
      ;set pcolor 35 
     ] 
     ] 
    ] 
    [ 
     ; if a path is not found (search is incomplete) and the open list is exhausted 
     ; display a user message and report an empty search path list. 
     user-message("A path from the source to the destination does not exist.") 
     report [] 
    ] 
    ] 

    ; if a path is found (search completed) add the current patch 
    ; (node adjacent to the destination) to the search path. 
    set search-path lput current-patch search-path 

    ; trace the search path from the current patch 
    ; all the way to the source patch using the parent patch 
    ; variable which was set during the search for every patch that was explored 
    let temp first search-path 
    while [ temp != source-patch ] 
    [ 
    ask temp 
    [ 
     set pcolor 85 
    ] 
    set search-path lput [parent-patch] of temp search-path 
    set temp [parent-patch] of temp 
    ] 

    ; add the destination patch to the front of the search path 
    set search-path fput destination-patch search-path 

    ; reverse the search path so that it starts from a patch adjacent to the 
    ; source patch and ends at the destination patch 
    set search-path reverse search-path 

    ; report the search path 
    report search-path 
end 

; make the turtle traverse (move through) the path all the way to the destination patch 
to move 
    ask one-of turtles 
    [ 
    while [length current-path != 0] 
    [ 
     go-to-next-patch-in-current-path 
     ;pd 
     wait 0.05 
    ] 
    if length current-path = 0 
    [ 
     ;pu 
    ] 
    ] 
end 

to go-to-next-patch-in-current-path 
    face first current-path 
    repeat 10 
    [ 
    fd 0.1 
    ] 
    move-to first current-path 
    if [plabel] of patch-here != "source" and [plabel] of patch-here != "destination" 
    [ 
    ask patch-here 
    [ 
     set pcolor black 
    ] 
    ] 
    set current-path remove-item 0 current-path 
end 

; clear the view of everything but the source and destination patches 
to clear-view 
    cd 
    ask patches with[ plabel != "source" and plabel != "destination" ] 
    [ 
    set pcolor black 
    ] 
end 

; load a maze from the file system 
to load-maze [ maze ] 
    if maze != false 
    [ 
    ifelse (item (length maze - 1) maze = "g" and item (length maze - 2) maze = "n" and item (length maze - 3) maze = "p" and item (length maze - 4) maze = ".") 
    [ 
     save-maze "temp.png" 
     ;; (for this model to work with NetLogo's new plotting features, 
    ;; __clear-all-and-reset-ticks should be replaced with clear-all at 
    ;; the beginning of your setup procedure and reset-ticks at the end 
    ;; of the procedure.) 
    __clear-all-and-reset-ticks 
     import-pcolors maze 
     ifelse count patches with [pcolor = blue] = 1 and count patches with [pcolor = green] = 1 
     [ 
     ask patches 
     [ 
      set plabel "" 
     ] 
     ask turtles 
     [ 
      die 
     ] 
     ask one-of patches with [pcolor = blue] 
     [ 
      set plabel "source" 
      sprout 1 
      [ 
      set color red 
      ;pd 
      ] 
     ] 
     ask one-of patches with [pcolor = green] 
     [ 
      set plabel "destination" 
     ] 
     ] 
     [ 
     ;; (for this model to work with NetLogo's new plotting features, 
    ;; __clear-all-and-reset-ticks should be replaced with clear-all at 
    ;; the beginning of your setup procedure and reset-ticks at the end 
    ;; of the procedure.) 
    __clear-all-and-reset-ticks 
     user-message "The selected image is not a valid maze." 
     load-maze "temp.png" 
     ;;clear-view 
     ] 
    ] 
    [ 
     user-message "The selected file is not a valid image." 
    ] 
    ] 
end 

; save a maze as a PNG image into the system 
to save-maze [filename] 
    if any? patches with [pcolor != black] 
    [ 
    clear-unwanted-elements 
    export-view (filename) 
    restore-labels 
    ] 
end 

; clear the view of everything but the obstacles, source and destination patches 
; so that the view can be saved as a PNG image 
to clear-unwanted-elements 
    if any? patches with [pcolor = brown or pcolor = yellow ] 
    [ 
    ask patches with [pcolor = brown or pcolor = yellow ] 
    [ 
     set pcolor black 
    ] 
    ] 
    if any? patches with [pcolor = blue] 
    [ 
    ask one-of patches with [pcolor = blue] 
    [ 
     set plabel "" 
    ] 
    ] 
    if any? patches with [pcolor = green] 
    [ 
    ask one-of patches with [pcolor = green] 
    [ 
     set plabel "" 
    ] 
    ] 
    clear-drawing 
    ask turtles 
    [ 
    die 
    ] 
end 

; re-label the source and destination patches ones 
; the maze image file has been saved 
to restore-labels 
    ask one-of patches with [pcolor = blue] 
    [ 
    set plabel "source" 
    sprout 1 
    [ 
     set color red 
     ;pd 
    ] 
    ] 
    ask one-of patches with [pcolor = green] 
    [ 
    set plabel "destination" 
    ] 
end 

Antwort

0

Verschiedene Optionen. Wenn Sie nur einen Softprint wünschen, können Sie Informationen an ein Ausgabe-Widget mit output-print und zugehörigen Befehlen senden, oder an die Kommandozentrale mit print und ähnlichem. Wenn Sie eine Protokolldatei erstellen möchten, auf die Sie später zugreifen können, sind im Wörterbuch verschiedene Dateibefehle dokumentiert (wie file-open und file-print), die Sie zum Erstellen eines solchen Protokolls verwenden können. Im Codebeispielabschnitt der Modellbibliothek befindet sich auch ein Dateibeispiel.

+1

Dateiausgabe Beispiel, unter Codebeispiele. –

Verwandte Themen