我是计算机编程的新手。
我想从一个偶数编号的球员名单(最多32个)创建连续的2人球队,但在所有可能的球队成立之前没有重复。
例如对于6名玩家(通过f)我可以使用itertools.combinations 15个不同的团队生成。然后我可以手动,在纸上,在矩阵中创建5组3个独特的团队(即[['a','b'],['c','d'],['e','f'] ]和类似的ac,bf,de; ae,bc,df; af,bd,ce和ad,be,cf)。但我一直无法在python 3.5中编写程序(许多不同的尝试)来执行此操作。经过5次或更少的迭代后,我得到了重复,并且根本没有创建一些可能的团队。
我进行了搜索,但无法确定哪种解决方案适用于我的特定情况。
答案 0 :(得分:0)
如果您只需要某些完整的循环配对,那么请使用"循环赛锦标赛计划"查找解决方案。您可以在Wikipedia上使用久经考验的解决方案。
将玩家分为两行,每行一半,如下:
A B C
D E F
你的第一对配对是AD,BE,CF。接下来,钉上 A ,并将其他人视为戒指:
A B C
D F
E
将环顺时针旋转一个位置......
A D B
E C
F
...再将下三部分压成一行:
A D B
E F C
你的第二轮配对是AE,DF,BC。 继续进行共五次旋转;最后一个恢复原来的配对。
答案 1 :(得分:0)
这是我想要完成的典型场景: 名单上约有26名球员 第1周:第26周出现。我组建了9支球队 第2周:第26周出现。我组建了11支队伍,但第1周没有重复 第3周:第26周出现。我组建了5支队伍,但没有从第1周或第2周开始重复,等等。
以下作品虽然没有应用过去的球队过滤器,但最多可以有12名球员(需要25秒),但超过12名球员的时间长得令人难以忍受,而且我预计大约有24名球员。 该程序选择第一组有效的团队然后结束。随着应用额外的past__teams过滤器 - 程序的整个点 - 它将不得不运行更长时间。 是否有另一种方法可以解决这个问题或者加速它的方法呢?
from itertools import combinations, chain
import pickle, random
'''the'past__teams.py' file was previously created as follows:
output = open('past__teams.pkl', 'wb')
pickle.dump(past__teams, output)
output.close()'''
players = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j']
random.shuffle(players)
#load the past__teams file into the program
pkl_file = open('past__teams.pkl', 'rb')
past__teams = pickle.load(pkl_file)
pkl_file.close()
all_pair_combinations= []
tonights_teams = []
for c in combinations(players, 2):
c = list(c)
all_pair_combinations.append(c)
def dupe_test(L):
if len(L) != len(set(L)):
return True
return False
y = 0
for t in combinations(all_pair_combinations, int(len(players)/2)):
t = list(t)
tt =list(chain(*t))
y = y +1
if dupe_test(tt) == False:
tonights_teams =t
break
print ()
print ("Tonights_teams: ",y,tonights_teams)