如何在使用ParallelTable时阻止这些警告

时间:2013-03-13 16:49:00

标签: parallel-processing wolfram-mathematica

我有这段代码来查找形成合法词汇的一组字母的所有排列。

>>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!}]]

我已经验证过,如果我用Table替换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 个答案:

答案 0 :(得分: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]]
祝你好运!