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 しか獲得しないチームもあると予想します。

4

2 に答える 2

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 に答える
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 に答える