запуск стека процедур в списке в netlogo

#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 ). При использовании строковых значений вы получаете ошибку только во время выполнения, что может значительно затруднить устранение неполадок.