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