#netlogo
Вопрос:
Я хотел бы создать модель, в которой агенты хранят свои процедуры в списке и разворачивают эти процедуры одну за другой во время работы. Я нашел, как пройти процедуру в модели конечного автомата, но в моем случае это работает не так, как я ожидаю
; inspiration de "state machine exemple"
globals[
]
turtles-own[
roles ; liste of all roles of out agent
next-task
task-stacked ;; liste of all task are stored and schedulled in that attribut
myplots ;a plot agentset of my own plots
myFamillyPlots ; a plot agentset of my famillie plts
age
]
to setup
clear-all
create-turtles 10 [
;set task-stacked list
setxy random-xcor random-ycor
set roles list "people" "patriarche"
if member? "people" roles [
set age 50 random 20
set task-stacked list "death-prob" "createFamilly"
]
]
reset-ticks
end
to go
ask turtles[
update-task-stacked
run next-task
]
end
to update-task-stacked
let string-next-task first task-stacked
set next-task [ -> string-next-task ]
end
to createFamilly
end
to death-prob ; turtle context
set age age 1
if member? "people" roles [
if 80 - (random age) <= 0 [
die
]
]
end
Это не работает:
RUN expected input to be a string or anonymous command but got the
anonymous reporter (anonymous reporter: [ -> string-next-task ]) instead.
Ответ №1:
Основная проблема здесь:
to update-task-stacked
let string-next-task first task-stacked
set next-task [ -> string-next-task ]
end
Так task-stacked
как это список строк, string-next-task
то это строка. Но затем мы приступили next-task
к задаче, которая сообщает строку. Поэтому при выполнении run next-task
он выдает ошибку , которую вы видите — run
не будет работать с задачей, которая сообщает значение. Чего вы, вероятно, хотите, так это:
to update-task-stacked
let string-next-task first task-stacked
set next-task string-next-task
end
Теперь next-task
это строка, поэтому, когда вы это делаете run next-task
, вы запускаете строку, которая скомпилирует эту строку в виде кода NetLogo и запустит ее.
Однако вы можете полностью избежать строк с помощью еще одного небольшого изменения (запуск строк, как правило, не рекомендуется, за исключением редких ситуаций):
set task-stacked (list [ -> death-prob ] [ -> createFamilly ])
Теперь мы задаем списку задач фактический список значений задач , с которыми можно работать напрямую run
, вместо строковых значений, которые необходимо скомпилировать. Преимущество здесь в том, что NetLogo может сообщить вам во время компиляции, когда вы пишете свой код, если вы допустили опечатку или синтаксическую ошибку (например dearth-prob
). При использовании строковых значений вы получаете ошибку только во время выполнения, что может значительно затруднить устранение неполадок.