蟒蛇平衡运动时间表生成



我有以下代码示例

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

这是一个开始:

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问题。

另一个例子:

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来更改配对顺序

最新更新