Заставить черепах переместиться на другой узел в зависимости от их текущего узла - PullRequest
0 голосов
/ 29 августа 2018

У меня есть сеть узлов, связанных ссылками. Агенты случайным образом перемещаются по этой сети, т. Е. Имеют равную вероятность движения вперед и назад. Вот мой код для перемещения черепах на случайный соседний узел:

to start-movement
  let nearest-node min-one-of nodes [distance myself]
  set wlocation nearest-node
  move-to wlocation
end

to move
  ask walkers
  [
    set prevlocation wlocation
    if any? [link-neighbors] of wlocation [
    let new-location one-of [link-neighbors] of wlocation
      move-to new-location
      set wlocation new-location
    ]
  ]
end

Когда черепаха движется к узлу, я хотел бы проверить, откуда они пришли, а затем с некоторой вероятностью переместить их в другой узел, который не является предыдущим. Например, они перемещаются от узла 1 к узлу 2. Узел 3 находится справа, узел 4 - прямой, а узел 5 - справа. Я хотел бы что-то вроде «если черепаха находится на узле 2, перейти к узлу 3 с p = x, узлу 4 с p = y или узлу 5 с p = z.

Могу ли я сделать это, обратившись к переменной who из wlocation и prevlocation?

1 Ответ

0 голосов
/ 29 августа 2018

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

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

breed [nodes node]
breed [walkers walker]
walkers-own [prevlocation wlocation]

to start-movement    ; walker procedure
  set wlocation min-one-of nodes [distance myself]
  move-to wlocation
end

to move
  ask walkers
  [ let targets ([link-neighbors] of wlocation) with [self != [prevlocation] of myself]
    set prevlocation wlocation
    if any? targets
    [ set wlocation ifelse-value random-float 1 < 0.3
        [ max-one-of targets [y-cor] ]
        [ one-of targets ]
      move-to wlocation
    ]
  ]
end
...