我有一个模型,其中分散的雄性动物挑战居民的雄性为其领土。分散的男性有一定的获胜概率,这取决于他的年龄和受到挑战的常驻男性的年龄。换句话说,我要求模型比较男性代理人的年龄与受到挑战的男性的年龄,然后选择获胜的概率。例如:
let d random-float 1
if [age] of resident-male < [age] of dispersing-male
[
set prob-winning 0.7
]
if [age] of resident-male = [age] of dispersing-male
[
set prob-winning 0.5
]
if [age] of resident-male > [age] of dispersing-male
[
set prob-winning 0.3
]
if d < prob-winning
[
ask resident-male
[
die
]
]
我有数据(见下文)提供了在分散男性(3列)和男性(13行)年龄的年龄(年)矩阵中获胜的概率。
4 5 6
3 1 1 1
4 0.5 0.55 0.65
5 0.45 0.5 0.55
6 0.4 0.45 0.5
7 0.35 0.4 0.45
8 0.4 0.45 0.5
9 0.45 0.5 0.55
10 0.5 0.55 0.6
11 0.7 0.75 0.8
12 1 1 1
13 1 1 1
14 1 1 1
15 1 1 1
使用一堆if
语句确定男性是否获胜似乎效率低下。有没有人知道是否有办法输入矩阵与我在挑战过程中可以参考的概率值?或者从二维矩阵中选择特定值的任何其他更有效的方法?
答案 0 :(得分:1)
您可以随时使用NetLogo array or table extensions for that,但在您的情况下,列表列表也可以解决问题:
to-report prob-winning [ age-res age-dis ]
let probabilities [
[ 3 1 1 1 ]
[ 4 0.5 0.55 0.65 ]
[ 5 0.45 0.5 0.55 ]
[ 6 0.4 0.45 0.5 ]
[ 7 0.35 0.4 0.45 ]
[ 8 0.4 0.45 0.5 ]
[ 9 0.45 0.5 0.55 ]
[ 10 0.5 0.55 0.6 ]
[ 11 0.7 0.75 0.8 ]
[ 12 1 1 1 ]
[ 13 1 1 1 ]
[ 14 1 1 1 ]
[ 15 1 1 1 ]
]
report item (age-dis - 3) first filter [ first ? = age-res ] probabilities
end
最后一行使用first
和filter
的组合来查找与常驻男性年龄相对应的行,然后映射替代男性的年龄(即{{1} })到右边&#34;列&#34;在表中。
你可以像这样使用它:
age-dis - 3
代码中没有验证,所以如果你给它一个不属于表格的年龄,你就会收到错误。