はじめに
1対1で行う処理を$n$クライアントで行う時、$_nC_2$ 回も処理を行う必要があり、計算時間がかなりかかってしまう。そこで、並列処理をすることで計算時間を短縮しようと考えたが、適当に組み合わせを考えると重複がでてしまい、非効率である。また、$n$の値が固定されていない場合予め組み合わせを作成しておくことができない。
そのため、総当たりの試合表を作成するアルゴリズムを利用することで、この問題を解決した。
作成した関数
def Round_robin(N):
"""
関数の概要:一度に行う試合数を最大にしつつ
総当たり戦の試合を組む。
@param N:チーム数
@return :試合の組み合わせのリスト
"""
match = [] # 試合の組み合わせを入れるリスト
M=[i for i in range(N)]
center = int(N/2)
if N%2==0: # 偶数の時
for i in range(N-1):
match.append([(M[0+i],M[-1-i]) for i in range(center)])
M = M[:1] + M[2:] + M[1:2] # 先頭を固定して1つずつずらす
else: # 奇数の時
for i in range(N):
match.append([(M[i],M[-i+1]) for i in range(1,center+1)])
M = M[1:] + M[:1] # 1つずつずらす
return match
実例
奇数の場合
Round_robin(5)
>>>[[(1, 0), (2, 4)],
[(2, 1), (3, 0)],
[(3, 2), (4, 1)],
[(4, 3), (0, 2)],
[(0, 4), (1, 3)]]
偶数の場合
Round_robin(4)
>>>[[(0, 3), (1, 2)],
[(0, 1), (2, 3)],
[(0, 2), (3, 1)]]