【问题标题】:Access turtle data from matrix in netlogo从 netlogo 中的矩阵访问海龟数据
【发布时间】:2016-08-22 03:11:04
【问题描述】:

我正在尝试让海龟在带有 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

【问题讨论】:

    标签: netlogo


    【解决方案1】:

    在 netlogo 中以这种方式使用矩阵是最好的方法吗?

    一句话:没有。您试图使用矩阵表示的实际上是一个加权的战斗赔率网络。 NetLogo 内置了对网络建模的支持,所以最好使用它。

    有关网络的更多详细信息,请参阅NetLogo Programing GuideNetLogo 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 数字的代码通常很脆弱且容易出错。

    【讨论】:

    • 太棒了-谢谢。也感谢您的文档参考。
    猜你喜欢
    • 1970-01-01
    • 2020-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多