【问题标题】:Set variable in Map Netlogo在 Map Netlogo 中设置变量
【发布时间】:2021-06-17 09:58:23
【问题描述】:

我试图弄清楚如何使用 Netlogo 中的地图根据海龟的随机选择将年龄组(从年龄组列表中)分配给海龟。

首先我将他们的选择与选择范围列表进行比较,然后分配到相应的年龄组。

let choice random-float 1
  show ( map [ [ x y ] -> choice < x   
    ask turtles [set age-group y] ] [0.11 0.25 0.36 0.48 0.55] [1 2 3 4 5])

但是,我收到一条错误消息:预期的右括号。似乎无法弄清楚问题是什么


我觉得上面的代码比我下面写的代码更好,这似乎是重复的:

ask turtles [
    let choice random-float 1
         (ifelse
               choice < 0.11 [ set age-group 1 ]
               choice < 0.25 [ set age-group 2 ]
               choice < 0.36 [ set age-group 3 ]
               choice < 0.48 [ set age-group 4 ]
               choice < 0.55 [ set age-group 5 ]
               ...
               ...

               [ set age-group 100 ])
  ]

第二种方法有效,但随着年龄组数量的增加,会变得更长且重复。任何有关使用地图执行此操作的见解将不胜感激。

【问题讨论】:

    标签: list dictionary iteration netlogo


    【解决方案1】:

    我不完全确定你为什么会收到括号错误,但我看不出这个函数是如何工作的,因为你只绘制了一次随机数,然后对所有海龟使用相同的随机数.在 rnd 扩展中的 NetLogo 中有一个加权绘制原语,请参阅 http://ccl.northwestern.edu/netlogo/docs/index2.html

    但是,我有一个不使用扩展的模型,而是使用了一个实用程序,因为我需要做很多基于列表的随机加权绘制。它看起来像这样:

    to-report draw-wtd [#vals #wts]  ; weighted draw from list of values
      if length #vals != length #wts [ print "ERROR: weighted random draw" report -1 ]
      let draw random-float sum #wts
      let idx 0
      while [draw > 0]
      [ set draw draw - item idx #wts
        set idx idx + 1
      ]
      report item (idx - 1) #vals
    end
    

    它本质上是您的代码的ifelse 版本,只是它内置在一个while 循环中,因此您可以为其提供不同的列表。然后你可以简单地拥有:

    ask turtles
    [ set age-group draw-wtd [1 2 3 4 5] [0.11 0.25 0.36 0.48 0.55]
    ]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-17
      • 1970-01-01
      • 2012-03-01
      • 1970-01-01
      相关资源
      最近更新 更多