回答此问题可获得 20 贡献值,回答如果被采纳可获得 50 分。
<p>给定若干玩家<code>n</code>,我需要找到<code>H</code>,其中每个元组都是联盟的组合(例如(1,2,3)是玩家1、2和3的联盟。((1,2,3),(4,5),(6,))是一个联盟的组合-也是元组),它尊重这个规则:每个玩家只出现一次,而且只出现一次(即只在一个联盟中出现)。
P、 每一个联盟的组合在代码中称为布局。在</p>
<p>在开始的时候,我写了一段代码,我计算了所有联盟的所有组合,并检查了每个组合的规则。问题是,对于5-6个玩家来说,联盟组合的数量已经太多了,以至于我的电脑出了故障。
为了避免很大一部分的计算(所有可能的组合,循环和ifs),我写了以下内容(我测试了它,它相当于前面的代码片段):</p>
<pre><code>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
</code></pre>
<p>说明:假设n=3</p>
<p>首先,我创建所有可能的联盟:</p>
^{pr2}$
<p>然后我用明显的组合初始化H:每个成员在他自己的联盟中,每个成员在最大联盟中。在</p>
<pre><code>H = [((1,),(2,),(3,)),((1,2,3),)]
</code></pre>
<p>然后计算所有可能的布局形式:</p>
<pre><code>combs = [(1,2)] #(1,2) represents a layout in which there is
#one 1-player coalition and one 2-player coalition.
</code></pre>
<p>我计算排列。
最后,对于每个烫发和每个梳子,我计算出不同的可能布局。I<code>set</code>结果(<code>layouts</code>)以便删除重复项并添加到H</p>
<pre><code>H = [((1,),(2,),(3,)),((1,2,3),),((1,2),(3,)),((1,3),(2,)),((2,3),(1,))]
</code></pre>
<p>比较如下:</p>
<p><code>python script.py</code></p>
<ul>
<li>4: 0.000520944595337秒</li>
<li>5: 0.0038321018219秒</li>
<li>6: 0.0408189296722秒</li>
<li>7: 0.431486845016秒</li>
<li>8: 6.05224680901秒</li>
<li>9: 76.4520540237秒</li>
</ul>
<p><code>pypy script.py</code></p>
<ul>
<li>4: 0.00342392921448秒</li>
<li>5: 0.0668039321899秒</li>
<li>6: 0.311077833176秒</li>
<li>7: 1.13124799728秒</li>
<li>8: 11.5973010063秒</li>
<li>9: 发脾气了</li>
</ul>
<p>为什么pypy那么慢?我该换什么?在</p>