在netlogo

时间:2015-06-24 06:36:48

标签: netlogo

亲爱的Netlogo社区,

上周我在同一个论坛上发布了关于在netlogo中创建一个集合子集的问题。这是链接。

How to form subset form a set of numbers in Netlogo

上述主题的问题在于,如果集合包含超过21个元素,它将不会给出子集。它抛出java堆空间内存异常。我相信这是因为上面的线程将所有子集存储在一个列表中,最终列表列表达到了它的最大范围,并抛出了java堆空间内存异常。在这方面的任何帮助都是有价值的。

2 个答案:

答案 0 :(得分:1)

具有N个元素的集合具有2 ^ N个子集。在计算上,一旦N很大,你就无法对所有这些做任何事情,但你仍然可以随机选择它们。我们假设您的N个元素在列表中。然后你可以选择一个随机子集:

to-report random-subset [#lst]
  let _result []
  foreach #lst [
    if (one-of [true false]) [
      set _result lput ? _result
    ]
  ]
  report _result
end

请注意,这相当于在[0 ..(2 ^ N-1)]中选择一个随机数,然后选择与该数字相对应的子集。

如果您更喜欢更实用的方法,可以使用

to-report random-subset02 [#lst]
  report filter (task [one-of [true false]]) #lst
end

答案 1 :(得分:0)

以下是生成该子集时在每个子集上运行任务的代码,而不会累积内存中的所有子集:

to foreach-subset [xs fn]
  foreach-subset-helper [] xs fn
end

to foreach-subset-helper [prefix xs fn]
  ifelse empty? xs
    [ (run fn prefix) ]
    [ foreach-subset-helper prefix butfirst xs fn
      foreach-subset-helper lput (first xs) prefix butfirst xs fn ]
end

示例运行:

observer> foreach-subset [1 2 3] task print
[]
[3]
[2]
[2 3]
[1]
[1 3]
[1 2]
[1 2 3]

NetLogo中的任务记录在http://ccl.northwestern.edu/netlogo/docs/programming.html#tasks