Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
NetLogo,加权随机抽取列表:如何使用rnd扩展?_Netlogo - Fatal编程技术网

NetLogo,加权随机抽取列表:如何使用rnd扩展?

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

我在NetLogo中有一个包含值的列表,以及每个值的概率列表。现在我想根据概率绘制一个随机值(加权随机绘制)。我想用这个,但我不太明白如何获得正确的重量,请帮助

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,让概率根据小时变化。