Netlogo:使用概率分配变量

Net*_*ety 7 random variables list probability netlogo

如何使用组/列表中变量的概率将字符串或整数变量分配给turtle?例如,从特定组/列表中使用一个特定变量的概率为0.4。函数根据概率随机选择变量。之后,我需要使用相同的方法根据概率从列表中选择一个变量(字符串)。在python中应该是:

import random
def random_value(probability_list, values):
    r = random.random()
    index = 0
    while(r >= 0 and index < len(probability_list)):
      r -= probability_list[index]
      index += 1
    value=values[index - 1]
    value_index=index-1
    return value,value_index
Run Code Online (Sandbox Code Playgroud)

我在Netlogo中尝试了如下所示(出现索引为-1的错误),但是有更好的方法吗?

globals [random_nr probabilities some_list index]
to initialize-variables
  set some_list[]
  set probabilities[]
end
to random_pick
  set random_nr random-float 1
  set probabilities [0.1 0.2 0.4 0.3]
  set some_list ["String1" "String2" "String3" "String4"]
  set index 0
  while [(random_nr >= 0) and (length probabilities < index)] [
   set random_nr random_nr - item index probabilities
   set index index + 1 ]
  set index index - 1
end
Run Code Online (Sandbox Code Playgroud)

Nic*_*tte 8

有没有更好的办法?

就在这里。

NetLogo 6.0附带了rnd扩展名。(您也可以为早期版本的NetLogo 单独下载扩展。)

rnd扩展提供了rnd:weighted-one-of-list原语,它确实可以完成您要执行的操作:

extensions [ rnd ]

to-report pick
  let probabilities [0.1 0.2 0.4 0.3]
  let some_list ["String1" "String2" "String3" "String4"]
  report first rnd:weighted-one-of-list (map list some_list probabilities) last
end
Run Code Online (Sandbox Code Playgroud)

让我稍微整理一下最后一个表达式:

  • 的作用(map list some_list probabilities)是将两个列表“压缩”在一起,以获得以下形式的成对列表:[["String1" 0.1] ["String2" 0.2] ["String3" 0.4] ["String4" 0.3]]

  • 该对列表作为第一个参数传递给rnd:weighted-one-of-list。我们通过last作为的第二个参数rnd:weighted-one-of-list来告诉它,它应该使用每对中的第二个作为概率。

  • rnd:weighted-one-of-list然后随机选择一对,然后返回整个对。但是由于我们只对这对中的第一项感兴趣,因此我们first可以提取它。

要了解该代码的工作方式,有助于了解匿名过程的工作方式。请注意,我们如何利用简洁的语法传递listmap和传递lastrnd:weighted-one-of-list