netlogo中形成子集的局限性

netlogo中形成子集的局限性,netlogo,Netlogo,尊敬的Netlogo社区: 上周,我在同一论坛上发布了一个问题,关于从netlogo中的集合中形成子集。这里是链接 上述线程的问题是,如果集合包含的元素超过21个,它就不会给出子集。它将java堆空间抛出内存异常。我相信这是因为上面的线程将所有子集存储在一个列表中,最终列表达到其最大范围,并将java堆空间抛出内存异常。这方面的任何帮助都是有价值的。一个包含N个元素的集合有2^N个子集。从计算上讲,一旦N变大,你就不能对所有的元素都做任何事情,但你仍然可以从中随机选取。假设N个元素在一个列表中

尊敬的Netlogo社区:

上周,我在同一论坛上发布了一个问题,关于从netlogo中的集合中形成子集。这里是链接


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

一个包含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

下面的代码在生成每个子集后立即在每个子集上运行任务,而不会在内存中累积所有子集:

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中的任务记录在。

为了回答,我认为我们需要了解更多关于为什么首先生成子集以及如何处理它们的信息。@seth我想生成任何集合的所有可能子集,然后检查哪个子集将产生最佳结果。