Вот некоторая базовая логика, которая, я думаю, сработает для проезда для случая, когда 2 машины движутся в противоположных направлениях. Логика становится намного более сложной, если у вас много машин.
Я оставлю вам писать код NetLogo.
В основном вам нужны планы перехода между состояниями, которые отслеживают, чтоУкажите состояние каждого автомобиля, чтобы он мог решить, что делать дальше, и в каком состоянии он будет установлен.
Предположим, у вас есть состояния ["движение", "поворот", "прохождение", "поворот"-back "], и вы знаете, есть ли у вас конфликт трафика. Вы также знаете свою y-позицию, чтобы знать, как далеко вы находитесь от центра.
Вам необходимо логически выяснить, какие все возможные и соответствующие переходы есть, и правила, которые определяют, какой из них выбрать, в каком состояниивы находитесь в данный момент.
Было бы интересно (!) смоделировать состояния как узлы, а переходы - как ссылки, но давайте оставим это на другое время.
В основном вы получитедлинный список предложений if-else, которые вы можете оценить, чтобы решить, каким будет следующее состояние, а затем, после того как все будет оценено, вы можете сделать все возможное, чтобы перейти в это состояние. Вместо того, чтобы строить полную динамическую модель движения, давайте упростим, чтобы сказать, что прохождение включает в себя поворот на 10 градусов от первоначального курса на некоторое время, затем на 30 градусов на некоторое время, затем на 10 градусов на некоторое время дольше, затем обратно на 0градусов, когда счастливо с дороги. Возвращение к центральной линии - это просто обратный процесс. Это, вероятно, выглядело бы хорошо для пользователя.
Вот некоторый псевдокод:
if driving and there's no conflict, keep driving.
if driving [
if there's a conflict
[ set next-state "turning-away"
if off-road by short distance [set offset-angle 10]
if off-road by medium distance [ set offset-angle 30]
if off-road by large distance [ set offset-angle 10]
if off-road entirely [ set offset-angle 0 set state "passing"]
]
otherwise [ set next-state "driving"]
and move forward based on speed and heading.
if in the middle of turning away the conflict goes away, i don't know what you want to do. Probably completing move to the passing location is simplest to code.
if passing and there's still a conflict, keep on passing
if passing and there's no conflict anymore, reverse the moves based on distance off-road to get back on the road.
if in the middle of turning back there is a new conflict, i don't know what you want to do. Probably change to turning-away and pick a heading based on distance from the centerline as above.
В любом случае, дайте мне знать, что вы думаете об этом подходе. Я не понимаю, как сделать это намного проще.