n
の数が与えられると、私はH
を見つける必要があります。各タプルが連合の組み合わせであるすべてのタプルのリスト(例えば(1,2,3)は選手1,2、および3の連合です。この規則を尊重する((1,2,3)、(4,5)、(6、))は、連合の組み合わせであり、これはタプルでもある):各選手は、連合)。 P.P.連合の各組み合わせは、コード内のレイアウトと呼ばれます。PythonでPythonインタープリタよりもコードが遅いのはなぜですか?
私はすべての連合のすべての組み合わせを計算したスニペットを書き、ルールをチェックした各組み合わせについてスニペットを書きました。問題は、5-6人のプレイヤーのために、連合の組み合わせの数がすでに大きかったために、私のコンピュータがプットしたことです。 は、計算(すべての可能な組み合わせ、ループおよびIFS)のAA大きな部分を避けるために、私は(私がテストし、それが前のスニペットと同等だもの)以下を書いた:
from itertools import combinations, combinations_with_replacement, product, permutations
players = range(1,n+1)
coalitions = [[coal for coal in list(combinations(players,length))] for length in players]
H = [tuple(coalitions[0]),(coalitions[-1][0],)]
combs = [comb for length in xrange(2,n) for comb in combinations_with_replacement(players,length) if sum(comb) == n]
perms = list(permutations(players))
layouts = set(frozenset(frozenset(perm[i:i+x]) for (i,x) in zip([0]+[sum(comb[:y]) for y in xrange(1,len(comb))],comb)) for comb in combs for perm in perms)
H.extend(tuple(tuple(tuple(coal) for coal in layout) for layout in layouts))
print H
説明:nと言います= 3
まず、私はすべての可能な連合を作成します。
coalitions = [[(1,),(2,),(3,)],[(1,2),(1,3),(2,3)],[(1,2,3)]]
その後、私は明白な組み合わせでHを初期化:自分の連立政権内の各選手との最大の連合内のすべてのプレーヤー。
H = [((1,),(2,),(3,)),((1,2,3),)]
そしてIは、レイアウトのすべての可能な形態を計算する:
combs = [(1,2)] #(1,2) represents a layout in which there is
#one 1-player coalition and one 2-player coalition.
Iの順列(パーマ)を計算します。 最後に、各パーマと各くしごとに、考えられるさまざまなレイアウトを計算します。
python script.py
- 4:0.000520944595337秒
- 5:0.18219秒私は重複を削除し、H.に
H = [((1,),(2,),(3,)),((1,2,3),),((1,2),(3,)),((1,3),(2,)),((2,3),(1,))]
を追加するために、ここでの比較だ(
layouts
)の結果をset
- 6:0.0408189296722秒
- 7:0.431486845016秒
- 8:6.05224680901秒
- 9:76.4520540237秒
pypy script.py
- 4:0.00342392921448秒
- 5:0.0668039321899秒
- 6:0.311077833176秒
- 7 :1.13124799728秒
- 8:11。5973010063秒
- 9:
プット行ったのはなぜpypy遅くということでしょうか?私は何を変えるべきですか?
通常のitertoolsは、より高速なコンパイル済みコードを使用する場合があります。 – hpaulj
申し訳ありませんが、定期的にはどういう意味ですか? – Pigna
あなたのデフォルト通訳者 – hpaulj