从 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 数字的代码通常很脆弱且容易出错。