我有以下代码示例
import itertools
import random
set_size = 2
schedule = set()
teams = range(10)
for comb in itertools.product(teams, repeat=set_size):
comb = sorted(list(comb))
if len(set(comb)) == set_size:
schedule.add(tuple(comb))
schedule = list(schedule)
random.shuffle(schedule)
home = {}
for game in schedule:
if home.has_key(game[0]):
home[game[0]] += 1
else:
home[game[0]] = 1
print home
它产生了一个有效的时间表,但问题是一些球队对主场比赛非常不平衡。
例如,打印出家是
{0: 5, 1: 3, 2: 5, 3: 5, 4: 5, 5: 5, 6: 5, 7: 5, 8: 4, 9: 3}
关键是团队,价值是主场比赛的数量。如果我在一个联赛中有10支球队,我希望有些球队可以获得5个主场,其他球队只有4个,但有些球队得到5个,而其他球队只得到3个
答案 0 :(得分:1)
这是一个开始:
from itertools import combinations
def balance(teams):
home_count = dict.fromkeys(teams,0)
max_homes = len(teams)//2
matches = []
for a,b in combinations(teams,2):
if home_count[a] >= max_homes:
matches.append((b,a))
home_count[b] += 1
else:
matches.append((a,b))
home_count[a] += 1
return matches
def home_games(matches):
counts = {}
for (a,b) in matches:
counts[a] = counts.get(a,0) + 1
return counts
然后
>>> matches = balance(range(10))
>>> home_games(matches)
{0: 5, 1: 5, 2: 5, 3: 5, 4: 5, 5: 4, 6: 4, 7: 4, 8: 4, 9: 4}
你应该将传递给balance
的球队顺序洗牌,因为最后几支球队的主场比赛将会更少。
您可能还需要分发比赛,以便任何一支球队在最后一场比赛后不会太快进行比赛,但这取决于同时举行多少场比赛。并且值得另一个SO问题。
答案 1 :(得分:1)
另一个例子:
import random
data = range(10)
home_games = len(data)/2
home = {}
schedule = []
for d in data:
home[d] = 0
random.shuffle(data)
for i in range(len(data)):
for j in range(1,len(data)-i):
if j < home_games:
schedule.append((data[i], data[j+i]))
home[data[i]]+=1
else:
schedule.append((data[i+j], data[i]))
home[data[j+i]]+=1
print home
输出:
{0:5,1:5,2:4,3:4,4:4,5:5,6:5,7:5,8:4,9:4}
您可以在计划表上使用random.shuffle来更改配对顺序