如何通过将变量名称和值传递给函数来更改代理程序的变量?

时间:2013-11-28 12:07:04

标签: netlogo

如何通过将变量名称传递给函数来更改代理的特定变量?

例如我有变量MONEY和以下函数的海龟:

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

现在我要跑:

观察者GT;问一只海龟[setVariable MONEY 100] ;;我需要通过另一只乌龟询问,因为我不能直接在观察者环境中使用MONEY

并且它没有设置我的变量而没有给出任何错误。

有趣的是,您可以用类似的方式读取变量:

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

所以这里的问题是如何将我的函数输入“转换”为turtle的变量名,它可以很好地识别SET。

PS:我不想使用run函数,因为它会减慢模型的速度。 感谢您的任何建议

2 个答案:

答案 0 :(得分:2)

在类似的情况下,有许多可能的选项,我为每个选项创建一个任务,并将它们放在查找表中(使用表扩展名),每个查询表都有一个字符串键。然后我可以为任何键查找适当的任务。它节省了嵌套的if / else结构,但我还没有调查表查找的效率。

HTH, 查尔斯

答案 1 :(得分:1)

你是正确的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的字符串会一直不同。)