LoginSignup
1
4

More than 5 years have passed since last update.

pythonで総当たりの試合表を作成する(並列処理)

Posted at

はじめに

 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)]]

参考

世界一簡単な、総当たり戦の試合の組み合わせの方法

1
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
4