我使用的是Mathematica 5.2。我使用命令Tuples来生成如下排列:
In[1]:=Tuples[{0,1},3]
Out[1]={{0,0,0},{0,0,1},{0,1,0},{0,1,1},{1,0,0},{1,0,1},{1,1,0},{1,1,1}}但问题是,当我想通过将0和1放在20多个位置来生成所有可能的排列时,Tuples命令由于缺乏内存容量而无法给出输出。例如,如果我想使用0和1生成大量的排列,比如,
Tuples[{0,1},25]命令"Tuples“没有给出输出,它给出了一条消息,没有足够的内存空间来生成如此大量的排列,那么我如何处理这个问题?有没有其他生成更大排列的过程?或者,如果我想逐个生成每个排列,而不是在像output1这样的数组中同时生成,我该怎么做呢?
发布于 2011-03-21 18:29:56
在单个评估中生成这些排列的列表需要3 GB以上的内存。以下是使用Mathematica 8生成的输出:
In[1]:= NumberForm[ ByteCount [ Tuples[{0, 1}, 25] ], DigitBlock -> 3]
Out[1]//NumberForm= 3,355,443,368Mathematica 5.2内核是32位可执行文件,无法处理所需的内存量。您可以使用Do循环来一次生成一个排列:
With[{n = 4}, Do[Print[IntegerDigits[i, 2, n]], {i, 0, 2^n - 1}]]发布于 2011-03-22 05:34:19
具体地说,回答这个问题“或者,如果我想逐个生成每个排列,而不是在像output1这样的数组中同时生成,我该怎么做?”
Mathematica 5.2使用了用于NextPermutation的Combinatorica附加软件包。
In[1]:= <<"DiscreteMath`Combinatorica`"
In[2]:= somepermutation={0,1,2}; NextPermutation[somepermutation]
Out[3]= {0,2,1}
In[4]:= NextPermutation[%]
Out[4]= {1,0,2}
In[5]:= NextPermutation[%]
Out[5]= {1,2,0}等等,但是NextPermutation只正确地置换集合,而不是多集合。下面的书解释了这一点,并有解决办法。
In[6]:= somepermutation={0,1,0};NextPermutation[somepermutation]
Out[7]= {0,0,1}
In[8]:= NextPermutation[%]
Out[8]= {0,1,0}如果你计划在Mathematica中使用Combinatorica,那么在你旁边有一本Pemmaraju和Skiena的“计算离散数学,组合数学和图论与数学”将是必不可少的。其中的一部分可以更好地编写为参考,但如果没有它,您可能会发现使用Combinatorica要困难得多
https://stackoverflow.com/questions/5374700
复制相似问题