0

私はこのコードを持って、合法的な単語を形成する一連の文字のすべての順列を見つけます。

>>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をTableに置き換えると、次のようになることを確認しました。

{{}, {}, {}, {"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つしかないため、警告を吐き出す原因になるためです。

私の理解は正しいですか?これらの警告を防ぐにはどうすればよいですか?

4

1 に答える 1

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

幸運を!

于 2013-03-19T03:35:27.347 に答える