Как изменить переменную агента, передав в функцию имя и значение переменной?

Как можно изменить конкретную переменную агента, передав имя переменной функции?

например, у меня есть черепахи с переменной ДЕНЬГИ и следующей функцией:

to setVariable [varname varvalue]
[
   ask one-of turtles [ set varname varvalue ]
]
end

Теперь хочу запустить:

наблюдатель> спроси одну из черепах [setVariable MONEY 100] ;; Мне нужно спросить через другую черепаху, так как я не могу использовать ДЕНЬГИ непосредственно в контексте наблюдателя.

И он не устанавливает мою переменную без ошибок.

Интересно, что вы можете читать переменную аналогичным образом:

to showVariable [varname ]
    [
       ask one-of turtles [ show varname ]
    ]
end

Итак, вопрос здесь в том, как «преобразовать» ввод моей функции в имя переменной черепахи, которое она могла бы хорошо распознать для целей SET.

PS: Я не хочу использовать функцию запуска, так как это замедлит работу модели.


person Denis    schedule 28.11.2013    source источник
comment
Вы ошибаетесь насчет того, что интересно, вы можете читать переменную аналогично части; это не работает.   -  person Seth Tisue    schedule 28.11.2013


Ответы (2)


В аналогичной ситуации, когда есть несколько возможных вариантов, я создаю задачу для каждого и помещаю их в таблицу поиска (используя расширение таблицы) со строковым ключом для каждого. Тогда я могу найти подходящую задачу по любому ключу. Это избавляет от вложенных структур if / else, но я не исследовал эффективность поиска в таблице.

person Charles    schedule 28.11.2013

Вы правы, что run со строками замедлит вашу модель, но если вы используете run с задачами, этого не произойдет.

Вот ваша setVariable процедура, переписанная для использования задач:

to setVariable [setter value]
   ask one-of turtles [ (run setter value) ]
end

Когда вы его вызовете, вызов будет выглядеть так:

setVariable task [ set money ? ] 100

Но это вам не поможет, если на месте звонка нет возможности избежать использования строк.

Если вы должны использовать строки, и это должно быть быстро, тогда у вас нет другого выбора, кроме как написать большую цепочку ifelse, в которой перечислены все переменные, которые вам нужно поддерживать:

to setVariable [varname varvalue]
  ask one-of turtles [
    ifelse varname = "money"
      [ set money varvalue ]
      [ ifelse varname = "food"
        [ set food varvalue ]
        ...
  ]
end

Для чтения переменных вместо установки вы можете безопасно использовать runresult со строкой, содержащей имя переменной, не беспокоясь о производительности, поскольку runresult кэширует скомпилированные строки, поэтому это будет быстро, поскольку вы будете передавать те же строки поверх и более. (Случай настройки отличается, потому что строки, которые вы передадите run, будут все время разными.)

person Seth Tisue    schedule 28.11.2013