从netlogo

时间:2016-08-22 03:11:05

标签: netlogo

我正试图让海龟在使用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

1 个答案:

答案 0 :(得分:5)

  

以这种方式使用矩阵是在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数字的代码通常很脆弱且容易出错。