【问题标题】:Netlogo adding to list of listsNetlogo 添加到列表列表
【发布时间】:2015-11-25 05:03:18
【问题描述】:

我希望将补丁变量值添加到空列表列表中。补丁分为不同的区域,我试图查看某些补丁变量如何因区域而异。 我有一个空列表(实际上包含 12 个列表,但为简单起见):

set mylist [[] [] [] []]

以及对应不同区域的列表:

set zone-list [1 2 3 4]

这是我尝试构建列表的方式:

(foreach mylist zone-list [set ?1 lput (sum-zone-variable ?2) ?1])

to-report sum-zone-variable [ n ]
  report (sum [patch-variable] of patches with [zone = n])
end

当我运行它时,mylist 保持为空(即不变)。我认为问题出在 foreach 语句上,但我不知道它是什么。有什么帮助吗?

【问题讨论】:

    标签: list iteration netlogo


    【解决方案1】:

    我可以看到foreach mylist [ set ?1 ... ] 背后的想法,但NetLogo 不是这样工作的。 set ?1 ... 对原始列表没有影响。 NetLogo 列表是不可变的,?1 不是对列表中可更新位置的引用——它只是一个临时变量,其中已复制了一个值。所以set ?1 ... 是你基本上永远不会写的东西。

    如果我正确理解您的问题,这里的相关原语是map。这应该可以完成工作:

    set mylist (map [lput (sum-zone-variable ?2) ?1] mylist zonelist)
    

    【讨论】:

    • 您的解决方案奏效了!我对此还比较陌生,而且我过去只使用过 foreach,但我正在寻找 map 。感谢您的输入! (是的,我的原始代码中有 ?1 和 ?2 ,这是一个错误 - 我将编辑我的原始问题)。
    【解决方案2】:

    您的基本方法是可以的,只是您必须指定一个名称。例如,

    globals [mylist zone-list n-zones]
    
    patches-own [zone zone-variable]
    
    to setup
      set n-zones 4
      set zone-list n-values n-zones [?]
      ask patches [set zone one-of zone-list]
      set mylist n-values n-zones [[]]
    end
    
    to go
      ask patches [set zone-variable random-float 1]
      foreach zone-list [
        let total sum [zone-variable] of patches with [zone = ?]
        let oldvals item ? mylist
        set mylist replace-item ? mylist (lput total oldvals)
      ]
    end
    

    但是,您可能希望为此使用表格扩展名。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-11-28
      • 1970-01-01
      • 2018-08-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多