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