Примитив 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