Как вернуться к середине дороги после поворота в Нетлого? - PullRequest
0 голосов
/ 21 октября 2019

Мой код - примерно 2 машины на одной дороге, где обе машины изменят свой курс (поверните налево), если они встретятся лицом к лицу, и вернутся к центру дороги (то есть pycor= 0) и черепахи не могут идти вне дороги,

Моя проблема в том, что я не знаю, как заставить черепах двигаться назад к центру, Я пыталсяиспользовать сплоченность от стека, но я не знаю правильный путь. Вот мой код:

globals
[initialHead too-close-distance]

turtles-own
[speed
top-speed]

to setup
  clear-all
  ask patches [setup-road]
  setup-cars
  reset-ticks
end

to go

 move

end


to setup-road
   if pycor < 2 and pycor > -2 [ set pcolor white
  ]
end

to setup-cars
  create-turtles 1
  [
    setxy -15 0
    set color red
    set size 1.2
    set initialHead 90

    set speed 0.5
    set top-speed 0.5 + random-float 0.5

  ]

  create-turtles 1
  [
    setxy 15 -0
    set color blue
    set size 1.2
    set initialHead 270

    set speed 0.5
    set top-speed 0.5 + random-float 0.5

  ]
end

to move
  ask turtles
  [
  speed-up-car
  avoid
  forward speed]
end

to avoid
  slow-down-car
  let visibility (patches in-cone 7 50)
  let center pycor = 0
  let too-near one-of other turtles-on visibility

  ifelse too-near != nobody

  [turn-away ([heading] of too-near) max-separate-turn
  [;need to turn back to center]
   [ fd speed]

end


to turn-away [new-heading max-turn]
  turn-at-most (subtract-headings heading new-heading) max-turn
end

to turn-at-most [turn max-turn]  ;; turtle procedure
  ifelse abs turn > max-turn
    [ ifelse turn > 0
        [ rt max-turn ]
        [ lt max-turn ] ]
    [ rt turn ]
end

to speed-up-car
  set speed (speed + acceleration)
  if speed > top-speed [ set speed top-speed ]
end

to slow-down-car
  set speed (speed - deceleration)
  if speed < 0 [ set speed deceleration ]
end

1 Ответ

0 голосов
/ 03 ноября 2019

Вот некоторая базовая логика, которая, я думаю, сработает для проезда для случая, когда 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.

В любом случае, дайте мне знать, что вы думаете об этом подходе. Я не понимаю, как сделать это намного проще.

...