0

我有以下代码示例

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 支球队

4

2 回答 2

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

于 2012-04-06T05:12:50.230 回答
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 问题。

于 2012-04-05T22:21:34.630 回答