从 netlogo 中的矩阵访问海龟数据
Access turtle data from matrix in netlogo
我正在尝试让海龟在带有 netlogo 的 ABM 中互相战斗。目前,海龟随机移动每个滴答声。我希望他们在每次滴答时随机找到另一只乌龟并与他们战斗。最终,我会让他们只打邻居,但目前配对是随机的。
战斗的获胜者取决于每对海龟之间的获胜概率。我习惯在 R 中做这些模型,我会将这些信息存储在矩阵中。例如
[[ 1 0.95 0.95 ]
[ 0.05 1 0.75 ]
[ 0.05 0.25 1 ]]
这里,第一行的乌龟有 95% 的可能性战胜第 2 列或第 3 列的乌龟。第 2 行的乌龟有 5% 的可能性战胜列 A,有 75% 的可能性战胜列 C。我在对角线上放了 1,但是海龟无法与自己战斗。随着时间的推移,海龟会因战斗而失去能量 - 但这还没有添加到模型中。
到目前为止,这是我的代码。当我选择海龟来寻找 'victim' 时,我希望能够从该矩阵中选择一对获胜概率。例如如果我选择 turtle0 和 turtle3 作为受害者,我想模拟一个 'fight',其中 turtleA 是获胜者,获胜概率为 95%。
以这种方式使用矩阵是在 netlogo 中执行此操作的最佳方式吗?还是我对其他编程语言的偏见太多了?
extensions [matrix]
globals []
turtles-own [
energy ;; energy level
]
to setup
ca
let m matrix:from-row-list [[1 .95 .95] [.05 1 .75] [.05 .25 1] ]
print matrix:pretty-print-text m ;;just to check if matrix is correct
crt 3 [
setxy random-xcor random-ycor
set color 11
set shape "mouse side"
set size 2
]
ask patches [
set pcolor 66
]
ask turtles [
set energy 100
]
reset-ticks
end
to go
if ticks >= 5000 [ stop ] ;; stop after 5000 runs.
ask turtles [
fd 5 rt random 90
check-death
check-fight
]
tick
end
;; if energy gets to 0 die.
to check-death
if energy <= 0 [ die ]
end
to check-fight
let victim one-of turtles-here
if victim != nobody
[
;; code in here to get win probabilities from matrix and determine winner.
]
end
Is using a matrix in this way the best way to do this in netlogo?
一句话:没有。你试图用矩阵表示的实际上是一个战斗赔率的加权网络。 NetLogo 内置了对网络建模的支持,所以你最好使用它。
有关网络的更多详细信息,请参阅 NetLogo Programing Guide and of the NetLogo Dictionary 的 链接 部分。
这是您的代码的精简版本,使用链接:
directed-link-breed [ odds odd ]
odds-own [ probability ]
to setup
clear-all
create-turtles 3
ask turtles [
create-odds-to other turtles [
set probability random-float 1.0
hide-link
]
]
reset-ticks
end
to go
ask turtles [
fd 5 rt random 90
fight
]
tick
end
to fight
if any? other turtles-here [
let victim one-of other turtles-here
let p [ probability ] of out-odd-to victim
if random-float 1.0 < p [
print (word self " wins against " victim)
]
]
end
该版本使用随机概率作为战斗几率,但您也可以从列表或矩阵中初始化它们。
这是一个使用原始矩阵的示例(去除了对角线):
to init-odds
let m [
[ 0.95 0.95 ]
[ 0.05 0.75 ]
[ 0.05 0.25 ]
]
(foreach (sort turtles) m [
ask ?1 [
(foreach (sort other turtles) ?2 [
ask out-odd-to ?1 [ set probability ?2 ]
])
]
])
end
我知道所有 ?1
和 ?2
变量使该代码难以理解。您可以依靠 who
数字来编写等效的东西,但我不推荐这样做:使用 who
数字的代码通常很脆弱且容易出错。
我正在尝试让海龟在带有 netlogo 的 ABM 中互相战斗。目前,海龟随机移动每个滴答声。我希望他们在每次滴答时随机找到另一只乌龟并与他们战斗。最终,我会让他们只打邻居,但目前配对是随机的。
战斗的获胜者取决于每对海龟之间的获胜概率。我习惯在 R 中做这些模型,我会将这些信息存储在矩阵中。例如
[[ 1 0.95 0.95 ]
[ 0.05 1 0.75 ]
[ 0.05 0.25 1 ]]
这里,第一行的乌龟有 95% 的可能性战胜第 2 列或第 3 列的乌龟。第 2 行的乌龟有 5% 的可能性战胜列 A,有 75% 的可能性战胜列 C。我在对角线上放了 1,但是海龟无法与自己战斗。随着时间的推移,海龟会因战斗而失去能量 - 但这还没有添加到模型中。
到目前为止,这是我的代码。当我选择海龟来寻找 'victim' 时,我希望能够从该矩阵中选择一对获胜概率。例如如果我选择 turtle0 和 turtle3 作为受害者,我想模拟一个 'fight',其中 turtleA 是获胜者,获胜概率为 95%。
以这种方式使用矩阵是在 netlogo 中执行此操作的最佳方式吗?还是我对其他编程语言的偏见太多了?
extensions [matrix]
globals []
turtles-own [
energy ;; energy level
]
to setup
ca
let m matrix:from-row-list [[1 .95 .95] [.05 1 .75] [.05 .25 1] ]
print matrix:pretty-print-text m ;;just to check if matrix is correct
crt 3 [
setxy random-xcor random-ycor
set color 11
set shape "mouse side"
set size 2
]
ask patches [
set pcolor 66
]
ask turtles [
set energy 100
]
reset-ticks
end
to go
if ticks >= 5000 [ stop ] ;; stop after 5000 runs.
ask turtles [
fd 5 rt random 90
check-death
check-fight
]
tick
end
;; if energy gets to 0 die.
to check-death
if energy <= 0 [ die ]
end
to check-fight
let victim one-of turtles-here
if victim != nobody
[
;; code in here to get win probabilities from matrix and determine winner.
]
end
Is using a matrix in this way the best way to do this in netlogo?
一句话:没有。你试图用矩阵表示的实际上是一个战斗赔率的加权网络。 NetLogo 内置了对网络建模的支持,所以你最好使用它。
有关网络的更多详细信息,请参阅 NetLogo Programing Guide and of the NetLogo Dictionary 的 链接 部分。
这是您的代码的精简版本,使用链接:
directed-link-breed [ odds odd ]
odds-own [ probability ]
to setup
clear-all
create-turtles 3
ask turtles [
create-odds-to other turtles [
set probability random-float 1.0
hide-link
]
]
reset-ticks
end
to go
ask turtles [
fd 5 rt random 90
fight
]
tick
end
to fight
if any? other turtles-here [
let victim one-of other turtles-here
let p [ probability ] of out-odd-to victim
if random-float 1.0 < p [
print (word self " wins against " victim)
]
]
end
该版本使用随机概率作为战斗几率,但您也可以从列表或矩阵中初始化它们。
这是一个使用原始矩阵的示例(去除了对角线):
to init-odds
let m [
[ 0.95 0.95 ]
[ 0.05 0.75 ]
[ 0.05 0.25 ]
]
(foreach (sort turtles) m [
ask ?1 [
(foreach (sort other turtles) ?2 [
ask out-odd-to ?1 [ set probability ?2 ]
])
]
])
end
我知道所有 ?1
和 ?2
变量使该代码难以理解。您可以依靠 who
数字来编写等效的东西,但我不推荐这样做:使用 who
数字的代码通常很脆弱且容易出错。