亲爱的Netlogo社区,
上周我在同一个论坛上发布了关于在netlogo中创建一个集合子集的问题。这是链接。
How to form subset form a set of numbers in Netlogo
上述主题的问题在于,如果集合包含超过21个元素,它将不会给出子集。它抛出java堆空间内存异常。我相信这是因为上面的线程将所有子集存储在一个列表中,最终列表列表达到了它的最大范围,并抛出了java堆空间内存异常。在这方面的任何帮助都是有价值的。
答案 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。