Netlogo:使用概率分配变量
Netlogo: Assign variable using probabilities
如何使用 group/list 中变量的概率将字符串或整数变量分配给 turtle?例如,从特定 group/list 中使用一个特定变量的概率为 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
我在 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
不要忽略 rnd
扩展名:
https://github.com/NetLogo/Rnd-Extension
但是基本上可以按照您的建议进行。我会在这里,但最好使用显式参数。
to-report random-pick
let _r random-float 1
let _ps [0.1 0.2 0.4 0.3]
let _lst ["String1" "String2" "String3" "String4"]
let _i 0
while [_r >= item _i _ps] [
set _r (_r - item _i _ps)
set _i (_i + 1) ]
report item _i _lst
end
is there a better way?
是的。
NetLogo 6.0 附带了早期版本的 rnd
extension bundled. (You can also download the extension separately。)
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
让我稍微解开最后一个表达式:
(map list some_list probabilities)
的作用是将两个列表"zip"放在一起,从而得到一个列表对,形式为:[["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
然后随机选择一对,然后 returns 整对。但是因为我们只对第一项感兴趣,所以我们使用 first
来提取它。
要了解该代码的工作原理,有助于了解 Anonymous procedures 的工作原理。请注意我们如何使用简洁的语法将 list
传递给 map
以及将 last
传递给 rnd:weighted-one-of-list
.
如何使用 group/list 中变量的概率将字符串或整数变量分配给 turtle?例如,从特定 group/list 中使用一个特定变量的概率为 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
我在 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
不要忽略 rnd
扩展名:
https://github.com/NetLogo/Rnd-Extension
但是基本上可以按照您的建议进行。我会在这里,但最好使用显式参数。
to-report random-pick
let _r random-float 1
let _ps [0.1 0.2 0.4 0.3]
let _lst ["String1" "String2" "String3" "String4"]
let _i 0
while [_r >= item _i _ps] [
set _r (_r - item _i _ps)
set _i (_i + 1) ]
report item _i _lst
end
is there a better way?
是的。
NetLogo 6.0 附带了早期版本的 rnd
extension bundled. (You can also download the extension separately。)
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
让我稍微解开最后一个表达式:
(map list some_list probabilities)
的作用是将两个列表"zip"放在一起,从而得到一个列表对,形式为:[["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
然后随机选择一对,然后 returns 整对。但是因为我们只对第一项感兴趣,所以我们使用first
来提取它。
要了解该代码的工作原理,有助于了解 Anonymous procedures 的工作原理。请注意我们如何使用简洁的语法将 list
传递给 map
以及将 last
传递给 rnd:weighted-one-of-list
.