2017-04-18 93 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