2013-03-13 54 views
0

我有此代碼可以查找構成合法單詞的一組字母的所有排列組合。如何在使用ParallelTable時防止這些警告

>>Combinatorica` 
Module[{str = "abc", chars, len, r, check}, 
chars = Characters[str]; 
len = StringLength[str]; 
r = Range[len]; 
check[n_Integer] := 
    DictionaryLookup[{"BritishEnglish", 
    StringJoin[chars[[UnrankPermutation[n, r]]]]}, 1]; 
DistributeDefinitions[check, chars, r]; 
ParallelTable[check[i], {i, 1, len!}]] 

我驗證過,如果我用表代替ParallelTable,我得到這個:

{{}, {}, {}, {"cab"}, {}, {}} 

隨着ParallelTable,但是,除了這一結果,我也得到警告,這樣的:

Part::pspec: Part specification Combinatorica`UnrankPermutation[1,{1,2,3}] is neither a machine-sized integer nor a list of machine-sized integers. 

Part::pspec: Part specification Combinatorica`UnrankPermutation[2,{1,2,3}] is neither a machine-sized integer nor a list of machine-sized integers. 

StringJoin::string: String expected at position 1 in StringJoin[{a,b,c}[[Combinatorica`UnrankPermutation[1,{1,2,3}]]]]. 

StringJoin::string: String expected at position 1 in StringJoin[{a,b,c}[[Combinatorica`UnrankPermutation[2,{1,2,3}]]]]. 

這些警告似乎來自內核7及更高版本。我的猜測是計算達到了這些內核,並且沒有任何數據,因爲只有6個排列,並且導致它們吐出這些警告。

我的理解是否正確?我如何防止這些警告?

回答

1

我不認爲這就是它 - 如果它的情況下,這個簡單的測試會失敗過:

ParallelTable[k^2,{k,3}] (* Assuming more than 3 kernels *) 

...它運行得很好。

相反,在我看來,該功能UnrankPermutations [] ParallelTable下表現不好,你可以從運行簡化版本(也沒有)看到:

ParallelTable[Part[chars, UnrankPermutation[n, r]], {n, len!}] 

我不知道該蠻力你的做法與此同時是一個很好的(考慮當字長度超過10個字符會發生什麼),但一個解決以下這種想法是這樣的:

list = LexicographicPermutations[chars] 
ParallelMap[DictionaryLookup[{"BritishEnglish", #}] &, 
Map[StringJoin[#] &, list]] 

祝你好運!

相關問題