There is another way to calculate
Permutations [{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11}]
without triggering an error, I have 3 GB of RAM with WIN 7
Edit:
This short code is the one that broke my head for a while, are 11 variables that must meet a very specific condition, their difference must be 1. either can take the 11 values, hence all permutations, this code is an adaptation of another code I saw here, which helps me to what I need.
juan[{a_, b_, c_, d_, e_, f_, g_, h_, i_, j_, k_}] :=
Abs[Differences /@ ({{a, b}, {a, c}, {b, c}, {b, f}, {b, e}, {c,
e}, {c, f}, {c, g}, {d, f}, {d, g}, {e, b}, {e, a}, {e, f}, {e,
i}, {e, h}, {f, g}, {f, j}, {f, i}, {f, h}, {g, i}, {g,
j}, {h, i}, {h, k}, {i, j}, {i, k}, {j, k}})] // Flatten
*(*per = Permutations[Range@11]*) (this line is calculated as 799 consecutive files in HD thanks to the collaboration of rasher)
(*per=Import["C:\\Users\\M\\Desktop\\per.txt"]*)(as I upload the files sequentially and that its securities are passing the variable "per" and will be prosecuted.?)
Select[per, FreeQ[juan@#, 1] &]
Answer
This will write the permutations to permutations.txt
in list blocks of ~50,000 each.
Quiet@Block[{$ContextPath}, Needs["Combinatorica`"]]
len = 11
numchunk = 1000
chunks = Partition[Clip[FindDivisions[{0, len! - 1, 1}, numchunk],
{0, len! - 1}, {0,len! - 1}], 2, 1] //
(# + Join[{{0, 0}}, ConstantArray[{1, 0}, Length@# - 1]]) &;
Monitor[(chunk = #; (Combinatorica`UnrankPermutation[#, 11] & /@
Range @@ chunk) >>
"permutations-" <> ToString[First@#] <> "-" <>
ToString[Last@#] <> ".txt") & /@ chunks;, chunk]
Will take about an hour, I'd ventue...
If you must have equal sized files, you'll want to create your own chunks
, since FindDivisions
uses a heuristic that usually won't meet that criteria, e.g. in your case for 11 length:
p = Partition[Range[1, 102089*392, 102089] - 1, 2, 1];
p[[1]] = p[[1]] - {0, 1};
p[[2 ;;, 1]] = p[[2 ;;, 1]] + 1;
chunks = p;
Will create files all with same # of permutations (about 100k).
Comments
Post a Comment