Нетлого - как создавать дорожки?

Я пытаюсь смоделировать конкретное пересечение в 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 ответ

Решение

Один из способов сделать это - использовать правила, основанные на цветах пятен перед поворотными машинами. Для способа, который будет строго работать с шаблоном, который, я думаю, вы пытаетесь воспроизвести, вы можете повернуть машины влево, если перед ними зеленое пятно, и справа, когда впереди красное. Это позволяет вам контролировать их заголовки, основываясь на патчах по мере их движения.

Я бы также рекомендовал встроить в их процедуру движения, чтобы они никогда не двигались вперед, если впереди есть машина (как в моделях движения в библиотеке моделей), так же, как вы это делали в своей процедуре поворота. Таким образом, они никогда не попадут в участок, который уже занят другой машиной.

Вы также должны проверить 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
Другие вопросы по тегам