我正试图让海龟在使用netlogo的ABM中互相争斗。目前,海龟随机移动每个蜱虫。我希望他们在每个蜱虫处随机找到另一只乌龟并与它们作斗争。最终,我会让他们只与邻居打架,但目前配对是随机的。
战斗的胜利者取决于每对海龟之间的获胜概率。我习惯在R中做这些模型,我将这些信息存储在矩阵中。 e.g。
[[ 1 0.95 0.95 ]
[ 0.05 1 0.75 ]
[ 0.05 0.25 1 ]]
在这里,第2行中的乌龟有可能在第2列或第3列中击败乌龟95%。第2行中的乌龟有5%可能赢得对柱A而75%有可能赢得对柱C。我已经把对手放在了对角线上,但是乌龟不能自己打架。随着时间的推移,海龟会因战斗而失去能量 - 但这还没有被添加到模型中。
到目前为止,这是我的代码。当我挑选海龟找到一个受害者时,我希望能够从这个矩阵中选择一对获胜概率。例如如果我选择turtle0和turtle3作为受害者,我想模拟一场战斗'其中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
答案 0 :(得分:5)
以这种方式使用矩阵是在netlogo中执行此操作的最佳方法吗?
总之:不。您尝试使用矩阵表示的内容实际上是战斗赔率的加权网络。 NetLogo内置了对建模网络的支持,因此您可以更好地使用它。
有关网络的更多详细信息,请参阅NetLogo Programing Guide和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
数字的代码通常很脆弱且容易出错。