Есть ли способ создать непроходимые барьеры в NetLogo? - PullRequest
0 голосов
/ 23 апреля 2019

Я пытаюсь кодировать поведение при поиске пути, при котором агенты будут находить оптимальное исправление в среде и перемещаться по ограждениям, чтобы достичь указанного исправления. Я создал переменную патча 'f', которая установлена ​​в 1 для обозначения заборов и 0 для любого другого патча.

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

Вот изображение агента, пересекающего барьер. Я не хочу, чтобы он пересек

Соответствующий код принятия решений для агентов выглядит следующим образом:

{let moveset patches in-radius 30 with [f = 0 and n > 0]

let target max-one-of moveset [n]

 ifelse patch-here != target 
 [ 
  set heading towards target

  ]
 []

let chance random-float 10
if chance >= 5 [let pick -145]
if chance < 5 [let pick 145] 

ask patches in-radius 1 
[if f = 1 
[ask myself

  [set heading towards min-one-of patches [distance myself] + 180 - random 10 + random 10 ]

]
]

fd 1}

Для ясности, 'n' - это просто переменная, обозначающая патч, который я хочу, чтобы мой агент обнаружил, и рискну.

Кто-нибудь знает о простом способе NetLogo исключить определенные патчи в качестве жизнеспособных зон для движения в процессе принятия решений (т. Е. Жестких барьеров)?

1 Ответ

1 голос
/ 24 апреля 2019

Если вы еще этого не сделали, взгляните на пример «Look Ahead» в Библиотеке моделей - это простая демонстрация использования цвета патча для управления движением черепахи. Некоторый код на основе этой модели приведен ниже. С этой настройкой:

breed [ seekers seeker ]
breed [ goals goal ]
patches-own [ steps-from-goal ]

to setup
  ca
  ask patches [ 
    set steps-from-goal 999
  ]
  ask patches with [ pxcor mod 10 = 0 ] [
    set pcolor red
  ]
  ask patches with [ pycor mod 10 = 0 ] [
    set pcolor black
  ]
  ask one-of patches with [ pcolor = black ] [
    sprout-seekers 1 [
      set color blue
      pd
    ]
  ]
  ask one-of patches with [ pcolor = black ] [
    sprout-goals 1 [
      set color white
      set shape "circle"
    ]
  ] 
  reset-ticks
end

Вы можете бродить по породе seekers по черным квадратам, пока они не поделятся заплатой с goal черепахой:

to random-wander 
  ask seekers [
    if any? goals-here [
      stop
    ]
    rt random 61 - 30
    ifelse can-move? 1 and [pcolor] of patch-ahead 1 = black [ 
      fd 1
    ] [
      rt one-of [ 90 -90 ]
    ]
  ]
  tick
end

Тем не менее, обратите внимание, что черепахи могут «прыгать» по углам участков, используя этот метод, потому что они могут оценить patch-ahead 1 под любым углом, так что участок за одно место впереди черепахи может быть оценен через угол. другого патча. Черепаха никогда не должна садиться на запрещенный участок, но вы можете заметить, что их путь может пересекать эти заблокированные участки.

Изменить:

См. Упрощенный код, который "ловит" черепаху в квадратной клетке:

to setup
  ca
  crt 1 [ 
    setxy 5 5
    set heading 180
    repeat 4 [
      repeat 10 [
        ask patch-here [ set pcolor red ]
        fd 1 
      ]
      rt 90
    ]
    die
  ]

  crt 1 [ pd ]
  reset-ticks
end

to go
  ask turtles [
    rt random 61 - 30
    ifelse can-move? 1 and [pcolor] of patch-ahead 1 = black [
      fd 1
    ] [
      rt one-of [ 90 -90 ]
    ]
  ]
  tick
end

После 1100 тиков:

enter image description here

После 13300 тиков:

enter image description here

...