Скажите агенту, чтобы он не переходил дорогу в модели Netlo go - PullRequest
0 голосов
/ 04 апреля 2020

Я пытаюсь добавить условие, которое не позволяет агенту пересечь дорогу. Дорожные участки установлены в красный цвет. Я не могу понять, как заставить это условие работать. В конечном счете, я хочу, чтобы агент развернулся, если дорога впереди. Вот мой код net lo go.

    to go
      ask turtles [
     move
      ]
        tick
      if ticks >= 60 [stop]
    end

    to move
  ifelse random-float 1 < q
  [
    ifelse random-float 1 < w
    [let target-patch max-one-of neighbors [veg-suitability]
    face target-patch]
    [let target-patch max-one-of neighbors [pelev]
    face target-patch]
  ]
  [
    ifelse [pcolor] of patch-ahead 1 = red
    [lt random-float 180]
    move-to one-of neighbors
    ldd-normal
  ]

end

     to ldd-normal
      let ldd-distance (ldd-scale)
      fd ldd-distance

    end

1 Ответ

2 голосов
/ 05 апреля 2020

Логика c вашей процедуры перемещения, я думаю, немного запутана. Сначала у вас есть случайный шанс либо перейти к патчу с более высоким значением интересующей переменной (с примитивом uphill), либо, если случайная отрисовка не удалась, он переместится к случайному соседу. Если вы не хотите, чтобы он перемещался на красное пятно, вам нужно проверить, является ли выбранное пятно красным, но вы просто перемещаете его без проверки.

После того, как вы переместили черепаху, вы затем проверьте цвет patch-ahead. Ваша проблема здесь в том, что patch-ahead зависит от направления, в котором стоит черепаха, что не имеет никакого отношения к тому направлению, в котором она уже двигалась. Вы либо заставляете его поворачиваться (хотя он может и не поворачиваться достаточно) ИЛИ двигаться вперед. Так что на самом деле он никогда не уходит.

Я не могу дать вам точный ответ, потому что я не знаю, какой должна быть ваша логика c. Но вы можете посмотреть на такие структуры, как:

move-to one-of neighbors with [pcolor != red]

Или, если красных пятен достаточно, возможно, что нет соседей, не являющихся красными (что может привести к ошибке, если вы попытаетесь переместиться к одному), вы можете использовать:

let okay-patches neighbors with [pcolor != red]
if any? okay-patches [move-to one-of okay-patches]

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

...