Где поставить «стоп», чтобы закончить симуляцию - PullRequest
0 голосов
/ 11 марта 2020

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

to set-move
 ask migrants
  [set pot-target patches with [value < 11 and not any? turtles-here]
   set target pot-target with [count neighbors with [any? turtles-here with [value < 11]] >= 1]
   ifelse (count target != 0 and (status != "resident")) [move-to min-one-of target [value]
                                                          set status "resident"
                                                          set color blue]
                                                    [stop]
  ]

Вот полный код

breed [migrants migrant]
breed [residents resident]

patches-own [value]
turtles-own [income
status]

to setup
  ca
  let total problo + probmid + probhi
  if (total != 100)
     [print (word "prob is more than 100")]
  ask patches [set value random-normal 10 3
  let patch-value value
    set pcolor scale-color (gray - 5) patch-value 10 3]
  ask patches
  [if random 100 < 3
    [sprout-residents 1
      [set color red
       set shape "default"
       set size 1
       set status "resident"
      ]
    ]
  ]

end

to go

  ask patches
  [if not any? patches with [value < 11 and not any? turtles-here] [stop ]
    if random 100 < 1
    [sprout-migrants 1
      [set color green
       set shape "default"
       set size 1
       set status "migrant"
       set-move

  ]]]

end


to set-move
  let pot-target patches with [value < 11 and not any? turtles-here]
  let target pot-target with [count neighbors with [any? turtles-here with [value < 11]] >= 1]
  if any? target and (status != "resident")
  [ move-to min-one-of target [value]
    set status "resident"
    set color blue
  ]
end


enter image description here

Ответы [ 2 ]

2 голосов
/ 11 марта 2020

Примитив stop завершит кодовый блок, в котором появляется stop. В вашем коде, когда условие выполнено, процедура set-move завершится, но это не завершит симуляцию. Что вам нужно сделать, это проверить состояние на верхнем уровне (процедура go), и это прервет цикл. Меня немного смущает ваш код, но я думаю, что ответ состоит в том, чтобы отделить движущуюся часть от проверки, останавливаться ли.

Итак, при изменении набора хода:

ifelse (count target != 0 and (status != "resident"))
[ move-to min-one-of target [value]
  set status "resident"
  set color blue
]
[ stop ]

просто к if блоку вместо ifelse (удаляя также stop). Затем, на верхнем уровне, добавьте строку примерно так:

if not any? patches with [value < 11 and not any? turtles-here] [stop]

Меня также беспокоит ваша структура кода set-move, начинающаяся с ask migrants. Я подозреваю, что это ошибка. То, что вы говорите, так это то, что в любое время вызывается переезд, все мигранты пытаются переехать Я думаю, вы предполагали, что только недавно созданный мигрант пытается переместиться, поскольку вы вызывали это из блока кода sprout. Если это так, то ваш сет-ход является процедурой черепахи и должен выглядеть следующим образом:

to set-move
  set pot-target patches with [value < 11 and not any? turtles-here]
  set target pot-target with [count neighbors with [any? turtles-here with [value < 11]] >= 1]
  if any? target and (status != "resident")
  [ move-to min-one-of target [value]
    set status "resident"
    set color blue
  ]
end

Обратите внимание, что я также изменил ваш count != 0 на not any? в качестве предложения по удобочитаемости. Лично я бы также назвал цели набора агентов, а не цель, чтобы напомнить себе, что у него может быть несколько членов.

ОБНОВЛЕНИЕ: вам нужно, чтобы ваш stop был на верхнем уровне процедуры go, чтобы это останавливает эту процедуру. Это должно выглядеть примерно так:

to go
 if not any? patches with [value < 11 and not any? turtles-here] [stop ]
 ask patches
 [ if random 100 < 1
   [ sprout-migrants 1
     [ set color green
0 голосов
/ 11 марта 2020

вместо того, чтобы использовать [stop] для завершения симуляции, я бы предложил использовать вместо l oop.

while [not stop-condition][
  run
]
...