2017-04-18 137 views
1

我想模擬NetLogo中的特定交叉點。這裏是代碼(在開發的早期階段):Netlogo - 如何創建路徑?

breed [ trams tram ] 
breed [ cars car ] 



to setup 
    clear-all 
    set-default-shape trams "bug" 
    set-default-shape cars "car" 
    setup-patches 
    reset-ticks 
end 

to go 
    make-new-car frequency-SN-1 1 -20 0 
    make-new-car frequency-SN-2 2 -20 0 
    make-new-car frequency-NS-3 -3 20 180 
    setup-trams tram-frequency 
    move-trams 
    want-turn 
    move-cars 
    tick 
end 

to setup-trams [ freq ] 
    if (random-float 100 < freq) and not any? turtles-on patch 0 -20 [ 
    create-trams 1 [ 
     setxy 0 -20 
     set heading 0 
     set color black 
    ] 
    ] 
end 

to make-new-car [freq x y head ] 
    if (random-float 100 < freq) and not any? turtles-on patch x y [ 
    create-cars 1 [ 
     setxy x y 
     set heading head 
     set color one-of base-colors 
    ] 
    ] 
end 

to move-cars 
    ask cars [ 
    ifelse not can-move? 1 
     [ die ] 
     [ fd 1 ] 
    ] 
end 

to want-turn 
    ask cars-on patch 2 -7 [ 
    ifelse (random-float 100 < 100) and not any? turtles-on patch 3 -7 
     [ rt 90 fd 1 
     lt 90 fd 4 
     rt 90 fd 2 
     lt 90 fd 2 
     rt 90 fd 1] 
     [ fd 1 ] 
    ] 
end 

to move-trams 
    ask trams [ 
    ifelse not can-move? 1 
     [ die ] 
     [ fd 1 ] 
    ] 
end 

to setup-patches 
    ask patches [ 
    ifelse abs pxcor <= 3 or abs pycor <= 3 
     [ set pcolor black ]  
     [ set pcolor green - 1 ] 
    ifelse abs pxcor <= 0.5 
     [ set pcolor red ] 
     [ ] 
    ask patch 3 -2 [ set pcolor red ] 
    ask patch -2 -1 [ set pcolor red ] 
    ask patch -1 -1 [ set pcolor red ] 
    if pycor = -3 and pxcor > 8 
    [ set pcolor green - 1 ] 
    if pycor <= 3 and pycor >= -1 and pxcor < -3 
    [ set pcolor green - 1 ] 
    if pxcor = 3 and pycor <= -8 
    [ set pcolor green - 1 ] 
    ] 
end 

是什麼導致我的問題是需要轉彎過程。我想要一些汽車向右和向東移動。不過,我不能,直到現在(剛剛開始使用NetLogo)以不同的方式做 - 它只是爲了讓汽車在特定的補丁上消失並重新出現在另一個補丁上(這完全是由於在轉入程序中運行的轉彎過程造成的。它每次都會運行,但在轉彎時我會移動很多補丁,所以它看起來像傳送)。

我可以在那裏創造道路嗎?因此,不是將車輛手動移動到另一個補丁上,而是問這輛車是否符合特定補丁的條件(在這種情況下:補丁2-7),如果是 - 它會移動替代路。

我剛剛發現的NetLogo任何想法,歡迎來做到這一點

+1

嗨SCAG,檢查出的[指南](http://stackoverflow.com/help/ mcve)來提高你獲得有意義答案的機會。我無法按照原樣運行你的代碼來重現你的模型(我認爲需要在界面上輸入一些內容),所以很難準確地告訴你後面的內容。 –

+0

頻率-SN-1, 頻率-SN-2, 頻率-NS-3和有軌電車頻率是從1到100的接口值 - 它們僅表示按功能創建的每個時鐘的汽車數量make-new-car – scagbackbone

+0

不夠公平 - 我的意思是說,讓你的問題重現得越容易,你就越有可能在Stack Overflow上獲得有用的答案。通常這意味着要剪掉與你的問題無關的東西;例如,有軌電車和不重要的汽車,在這種情況下。 –

回答

1

的一種方法是使用基於提前轉向汽車的補丁的顏色規則。對於一種嚴格符合我想要複製的模式的方法,如果前方有綠色補丁,並且前方有紅色補丁,則可以讓汽車左轉。這使您可以根據補丁移動時的標題來控制標題。

我也建議在他們的運動過程中建立他們不會向前移動(如在模型庫中的交通模型中),就像您在車削過程中一樣。這樣,他們將永遠不會跨入已經被另一輛車佔用的補丁。

您還應該查看patch-set來創建修補代理程序集,以便您不必重複像set pcolor red這樣的命令;你也可以用or來做到這一點。

看一看,我對代碼進行了上述的一些實施例的修改:

breed [ cars car ] 

to setup 
    ca 
    resize-world -20 20 -20 20 
    set-default-shape cars "car" 
    setup-patches 
    reset-ticks 
end 

to go 
    make-new-car 10 2 -20 0 blue 
    make-new-car 10 1 -20 0 yellow 
    make-new-car 10 -3 20 180 white 
    make-new-car 10 -1 20 180 pink 
    make-new-car 10 -20 -3 90 orange 
    want-turn 
    move-cars 
    tick 
end 

to make-new-car [freq x y head col ] 
    if (random-float 100 < freq) and not any? turtles-on patch x y [ 
    create-cars 1 [ 
     setxy x y 
     set heading head 
     set color col 
    ] 
    ] 
end 

to move-cars 
    ask cars [ 
    ifelse not can-move? 1 
     [ 
     die 
     ] 
     [ 
     if patch-ahead 1 != nobody [ 
      if [pcolor] of patch-ahead 1 = green - 1 [ 
      rt -90 
      ] 
      if [pcolor] of patch-ahead 1 = red [ 
      rt 90 
      ] 
      if ([count turtles-here] of patch-ahead 1 = 0) and 
      ([pcolor] of patch-ahead 1 = black) [ 
       fd 1 
      ] 
     ] 
     ] 
    ] 

end 

to want-turn 
    ask cars-on patch 2 -7 [ 
    if (random-float 100 < 50) [ 
     rt 90 
    ] 
    ] 
end 

to setup-patches 
    ask patches [ 
    ifelse abs pxcor <= 3 or abs pycor <= 3 
     [ set pcolor black ]  
     [ set pcolor green - 1 ] 
    if abs pxcor <= 0.5 
     [ set pcolor red ] 
    ask (patch-set patch 3 -2 patch -2 -1 patch -1 -1 patch 8 -1) [ 
     set pcolor red 
    ] 

    if (pycor = -3 and pxcor > 8) or (pycor <= 3 and pycor >= -1 and pxcor < -3) or (pxcor = 3 and pycor <= -8) [ 
     set pcolor green - 1 
    ] 
    ] 
end 
+0

非常有用,非常感謝@Luke C – scagbackbone