2012-04-05 9 views
0

私は、次のコードサンプルPythonのバランススポーツスケジュール生成

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} 

あるキーは、チームであり、値はホームゲームの数です。 Iリーグで10のチームを持っている場合、私はいくつかのチームはわずか4を得るために5自宅や他の人を得ることを期待が、いくつかは、5を取得する他の人が取得している間だけ3

答えて

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

別の例:

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使用することができ
関連する問題