Добавление препятствия между черепахами

Я новичок в среде Netlogo и пытаюсь разработать модель беспроводной связи. Я столкнулся с одной проблемой, когда я должен заблокировать связь между двумя узлами (черепахами) таким образом, что если я держу препятствие между двумя узлами (в виде пятна с каким-то цветом или что-то в этом роде), передающий узел должен сканирует препятствие и сообщает что-то, чтобы завершить процедуру. Я прошел через модель прямой видимости и модель избегания препятствий в сообществе Netlogo, но они мне мало помогают. Узел должен сканировать препятствие не только в диапазоне одного участка впереди, а на всем расстоянии между ним и другим узлом. Любые идеи или примитивы, подходящие для этой задачи, были бы мне очень полезны. Надеюсь, я ясно выразился и прошу прощения за мой английский :)

Наилучшие пожелания


person Srijan    schedule 10.09.2014    source источник


Ответы (2)


Это, вероятно, не самое эффективное решение, но если у вас есть следующие породы:

breed [ obstacles obstacle ]
breed [ nodes node ]

Вы можете использовать следующий репортер:

to-report can-see? [ target ]
  let result false
  hatch 1 [
    face target
    fd 0.1
    set result ifelse-value (any? turtles-here with [ self = target ])
      [ true ]
      [ ifelse-value (any? obstacles-here)
        [ false ]
        [ can-see? target ]
      ]
    die
  ]
  report result
end

Он работает, hatchсоставляя целую серию временных узлов в направлении цель. Если какой-либо узел на пути встречает препятствие, он возвращает false. Если он достигает цели, он возвращает true. Эти временные узлы создаются рекурсивно, пока не будет получен результат.

Возможно, вы захотите отрегулировать «размер шага» (в этом примере fd 0.1): чем больше размер шага, тем больше вероятность того, что вы пропустите угол препятствия, но это будет немного быстрее.

Вы также должны убедиться, что используете обновления на основе тиков, а не непрерывные обновления, или это будет очень медленно.

Вот пример, который создает ссылки между узлами, которые могут видеть друг друга:

to setup
  ca
  ask n-of 100 patches [
    sprout-obstacles 1 [
      set color red
      set shape "square"
    ]
  ]
  ask n-of 50 patches with [ not any? obstacles-here ] [ 
    sprout-nodes 1 [
      set color yellow
      set shape "circle"
      let targets other nodes
      create-links-with targets with [ can-see? myself ]
    ]
  ]
end

Если вы хотите использовать патчи вместо черепах в качестве препятствий, вы, вероятно, можете довольно легко изменить это.

person Nicolas Payette    schedule 11.09.2014

Я разместил этот ответ на этот вопрос в списке пользователей NetLogo. Репост здесь для полноты:

Есть много методов, которые могут сработать.

Моей первой мыслью был пример «Пересекающиеся линии» в библиотеке моделей. Препятствием можно считать X линий на заплате. В этом случае кажется возможным использовать те же методы, чтобы определить, пересекает ли линия между узлами какие-либо линии на препятствиях.

Кажется, это хороший способ найти все линии прямой видимости сети, заблокированные препятствиями. Метод довольно быстрый, и его можно улучшить (проверить!), сначала найдя препятствия в радиусе, определяемом исходным и конечным узлами.

Вот другие идеи.

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

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

Другой вариант — использовать IN-CONE с очень маленьким углом, чтобы получить узкий набор патчей между узлами. Можно найти пересечение ВНУТРЕННЕГО КОНУСА от А до В и ВНУТРЕННЕГО КОНУСА от В до А, чтобы сузить набор. Затем найдите в наборе препятствия или используйте MIN-ONE OF с DISTANCE на наборе, чтобы найти «ближайшее» препятствие.

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

person TurtleZero    schedule 15.09.2014