gpt4 book ai didi

netlogo - 从 netlogo 中的矩阵访问海龟数据

转载 作者:行者123 更新时间:2023-12-04 04:52:44 27 4
gpt4 key购买 nike

我正在尝试让海龟在带有 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,但是海龟无法与自己战斗。随着时间的推移,海龟会因战斗而失去能量 - 但这尚未添加到模型中。

到目前为止,这是我的代码。当我选择海龟来寻找“受害者”时,我希望能够从该矩阵中选择一对获胜概率。例如如果我选择 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

最佳答案

Is using a matrix in this way the best way to do this in 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 数字的代码通常很脆弱且容易出错。

关于netlogo - 从 netlogo 中的矩阵访问海龟数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39070880/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com