NetLogo,从列表中加权随机抽取:如何使用rnd-extension?

Mad*_*lon 5 netlogo

我在NetLogo中有一个列表,其中包含值和每个值的概率列表.现在我想基于其概率(加权随机抽取)绘制随机值.我想过使用Rnd扩展,但我不知道如何正确地获得权重,请帮助

set values [1 2 3]
set probabilities [0.2 0.3 0.5]

set state ( rnd:weighted-one-of agentset reporter-task )
Run Code Online (Sandbox Code Playgroud)

Nic*_*tte 3

如果您想要/需要为您的值和概率使用两个单独的列表,则方法是让扩展程序选择一个索引并使用该索引来访问传递给报告器的概率rnd:weighted-one-of,一旦选择,您列表中的值。那是example1在下面的代码中。

但是,如果您可以将值和概率放在同一个列表中,则该扩展会更容易使用。这是通过构建“对”列表(即每个子列表中包含两个项目的列表列表)来完成的。当您有了它时,您可以在报告器中使用该对 ( item 1) 中的第二个项目,并使用该对 ( item 0) 中的第一个项目设置您的状态。example2展示了如何执行此操作。

extensions [ rnd ]

to example1
  let values [1 2 3]
  let probabilities [0.2 0.3 0.5]
  let indices n-values length values [ ? ]
  let index rnd:weighted-one-of indices [ item ? probabilities ]
  let state item index values
end

to example2
  let pairs [[1 0.2] [2 0.3] [3 0.5]]
  let state item 0 rnd:weighted-one-of pairs [ item 1 ? ]
end
Run Code Online (Sandbox Code Playgroud)

编辑:

正如 Seth 在评论中提到的,您可以使用 来从两个单独的列表构建对列表(map list values probabilities)。他还提到,代码可能“用firstandlast代替item 0and更清晰item 1”。

example3综合了这两个建议:

to example3
  let values [1 2 3]
  let probabilities [0.2 0.3 0.5]
  let pairs (map list values probabilities)
  let state first rnd:weighted-one-of pairs [ last ? ]
end
Run Code Online (Sandbox Code Playgroud)