2016-12-22 5 views
0

В настоящее время я создаю код для дилеммы заключенного. В моем усыновлении черепахи представляют собой лесозаготовительные компании, а патчи - деревья, две компании конкурируют за деревья, но могут сотрудничать, пересматривая их.Netlogo Prisoners Dilemma runtime and compiletime errors

Проблема, которую я имею, является то, что ниже код продолжает создавать ошибки во время выполнения из-аск черепахи, говорится:

только наблюдатель может ASK множество всех черепах. ошибка в то время как черепаха 0 работает ASK , вызванный процедурой DEFOREST

, вызываемый кнопкой 'go'. Однако, если я избавлюсь от сегмента черепах, то он создаст ошибку времени компиляции, в которой говорится: «Я не могу использовать трюки в контексте черепахи/патча, потому что тик - только наблюдатель. Итак, что я могу сделать, чтобы исправить это? Я могу временно снять его с моей функции, пока я опишу свой код, но в какой-то момент мне нужно будет вызвать код в функции go.

;; Действие функции к Deforest

спросить черепах [ спросить патч-при 0 0 [если pcolor = зеленый [набор pcolor коричневого набора денег денег + 50 набора обезлесения истинного] ] ]
конца

ответ

0

Каждой процедура имеет «контекст»: какой агент может запустить процедуру. Команда помечена своим контекстом в словаре NetLogo. (Ищите маленькие значки.) Если вы используете команду только для наблюдателя, такую ​​как tick, тогда все команды должны быть командами наблюдателей. (Только наблюдатель может запустить процедуру.) Если вы используете команду только с черепахой, все команды должны быть черепаховыми. (Только черепаха может запустить процедуру.) Если вы смешиваете контексты, это ошибка.

Теперь любой агент может работать ask. Однако NetLogo строит ограничение: только наблюдатель может ask turtles. Это потому, что почти всегда возникает ошибка, например, черепаха, которая просит всех черепах (включая себя) сделать что-то. Однако у вас могут быть черепахи ask other turtles. Это допустимо, но опасно, следующим образом. Если у вас есть 100 черепах, и каждый просит других 99 что-то сделать, вы запустите ask 9900 раз. Это примерно квадрат числа черепах. Так что это разрешено, но вы должны много думать, прежде чем это сделать.

В общем, если вы хотите ask turtles в deforest, вы должны убедиться, что только наблюдатель работает deforest, а не turtles. Но вдобавок ко всему, вы почти наверняка не хотите, чтобы каждая черепаха просила, чтобы один патч (снова и снова) проверял обезлесение. Это выглядит как ошибка в логике программы.