【问题标题】:Netlogo - how to create paths?Netlogo - 如何创建路径?
【发布时间】:2017-04-18 16:31:31
【问题描述】:

我正在尝试在 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)做不同的事情 - 只是为了让汽车在特定的补丁上消失并重新出现在另一个补丁上(它完全是由在 to-go 程序中运行的want-turn 程序引起的。它在每个滴答声中运行,但在想要转弯时,我移动汽车很多补丁,所以它看起来像传送)。

我可以在那里创造道路吗?因此,与其手动将汽车移动到另一个补丁,我只会询问这辆车是否满足特定补丁上的条件(在本例中:补丁 2 -7),如果是 - 它会移动替代道路。

我刚刚发现 NetLogo,欢迎提出任何想法

【问题讨论】:

  • 嗨,Scag,请查看guidelines,以提高您获得有意义答案的机会。我无法按原样运行您的代码来重现您的模型(我认为需要界面上的一些输入),因此很难准确说出您想要什么。
  • frequency-SN-1、frequency-SN-2、frequency-NS-3 和 tram-frequency 是从 1 到 100 的接口值 - 它们仅表示函数 make 在每个刻度上创建的汽车数量-新车
  • 很公平——我的意思是,您越容易重现您的问题,您就越有可能在 Stack Overflow 上获得有用的答案。通常这意味着删除与您的问题无关的内容;例如,在这种情况下,有轨电车和不重要的汽车。

标签: netlogo


【解决方案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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多