如何动态更改netlogo代理的变量数?

时间:2015-09-18 10:40:38

标签: netlogo

我有一个模型,其中代理或补丁对A和B两件事有意见:

patches-own[
OpinionA
OpinionB
]

然后在开始时随机设置这些值。

我怎么能改变它以便可能有两件以上的东西?实际上,我希望通过滑块设置该数字。如何动态更改代理或补丁的变量数量?

2 个答案:

答案 0 :(得分:4)

我认为不可能动态创建新的代理变量,但您可以只使用一个代理变量并使用列表来存储多个意见。您可以通过滑块定义该列表的长度,并将列表的每个位置随机设置为特定的意见。 例如,如果您希望补丁具有x个不同的意见(由滑块x定义),其中包含“a”,“b”或“c”,您可以按如下方式执行此操作:

patches-own[
  opinion
]

to setup
  ... (some setup procedure stuff)

  let opinion-options (list "a" "b" "c")

  ask patches[
    set opinion n-values x [one-of opinion-options]
  ]

答案 1 :(得分:1)

您可以使用table扩展程序:

extensions [table]

patches-own[
  opinions
]

to setup
  ask patches [
    set opinions table:make
  ]
  ; ... 
end

用“键值”对设置意见,其中键是意见类型,并重视实际态度。例如:

ask n-of 5 patches [
  table:put opinions "favorite-color" "blue"
  table:put opinions "food" "pizza"
]

您可以为另一组补丁设置不同数量的意见:

ask n-of 5 patches [
  table:put opinions "favorite-color" "red"
  table:put opinions "food" "chocolate"
  table:put opinions "age" 5
]

显示关于食物的意见(对食物有意见的补丁):

ask patches with [ table:has-key? opinions "food" ] 
  [ show table:get opinions "food ]

动态版

示例,如何随机设置n意见:

 let number-of-opinions 3
 ask n-of 5 patches [
   (foreach n-values 3 [?] n-values 3 [random 10]
     [ table:put opinions ?1 ?2 ])
 ]

这里有3个意见(名称为0,1和2)已经设置了随机数(从0到9)。检查意见1使用:

ask patches with [ table:has-key? opinions 1 ] 
  [ show table:get opinions 1 ]

请注意with在询问价值之前检查是否设置了特定的意见类型。

另见documentation中的表格示例。