NetLogo,加权随机抽取列表:如何使用rnd扩展?
我在NetLogo中有一个包含值的列表,以及每个值的概率列表。现在我想根据概率绘制一个随机值(加权随机绘制)。我想用这个,但我不太明白如何获得正确的重量,请帮助NetLogo,加权随机抽取列表:如何使用rnd扩展?,netlogo,Netlogo,我在NetLogo中有一个包含值的列表,以及每个值的概率列表。现在我想根据概率绘制一个随机值(加权随机绘制)。我想用这个,但我不太明白如何获得正确的重量,请帮助 set values [1 2 3] set probabilities [0.2 0.3 0.5] set state ( rnd:weighted-one-of agentset reporter-task ) 如果您想/需要为您的值和概率使用两个单独的列表,方法是让扩展选择一个索引,并使用此索引访问传递给rnd:weighte
set values [1 2 3]
set probabilities [0.2 0.3 0.5]
set state ( rnd:weighted-one-of agentset reporter-task )
如果您想/需要为您的值和概率使用两个单独的列表,方法是让扩展选择一个索引,并使用此索引访问传递给
rnd:weighted of
的报告中的概率和列表中的值。这是下面代码中的example1
但是,如果您可以将值和概率放在同一个列表中,那么扩展就更容易使用。这是通过构建一个“对”列表(即,每个子列表中有两个项目的列表列表)来实现的。当您拥有该项时,您可以在reporter中使用该项对中的第二项(项1
),并使用该项对中的第一项(项0
)设置您的状态<代码>示例2显示了如何执行此操作
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
编辑:
正如Seth在评论中提到的,您可以使用(映射列表值概率)
从两个单独的列表中构建成对列表。他还提到,代码可能“使用first
和last
而不是item 0
和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
如果您想使用任何概率,而不仅仅是那些加起来等于一的概率,您可以在不使用rnd扩展的情况下这样做。例如,如果您希望根据投票数选择候选人1、2或3:
to-report weighted-rand
let values [1 2 3]
;let probabilities [0.2 0.3 0.5]
let votes [5 7 9]
; calculate the cumulative probability list
let cum reduce [
lput (?2 + (ifelse-value (empty? ?1) [0] [last ?1])) ?1
] (fput [] votes)
; Roll a uniform random number weighted by the cumulative probability vector
let x random-float sum votes
let j -1
let found false
while [(not found) and (j < (length cum))]
[
set j (j + 1)
if (x <= item j cum) [set found true]
]
report item j values
end
报告加权兰德
让值[1 2 3]
;let概率[0.2 0.3 0.5]
让我们投票[5 7 9]
; 计算累积概率列表
让cum减少[
lput(?2+(ifelse值(空?1)[0][last?1])?1
](fput[]票)
; 滚动由累积概率向量加权的均匀随机数
让x随机浮点数和投票数
让j-1
让被发现是假的
而[(未找到)和(j<(长度和))]
[
集合j(j+1)
如果(x)如何进行配对
,给定值
和概率
:(映射列表值概率)
也许用第一个
和最后一个
而不是第0项
和第1项
更清楚一点?非常感谢,这非常有用!因为我使用每小时的时间步长,一天中每小时的概率都不同,所以我使用示例3,让概率根据小时变化。