プロが教えるわが家の防犯対策術!

バドミントンのダブルスの対戦表をエクセルで作ろうと思っているのですが、どうやって作ったらいいのかわからず、どなたか知恵を貸していただけないでしょうか?

バドミントンのダブルスは1コート4人で行われるため、4人でバドミントンを行ったりする場合は簡単に組合せが作れます。4人に1番~4番の番号を振り分けると、1番と2番がペアで3番と4番がペア。その次は1番と3番がペアで2番と4番がペア。というふうになります。

しかし、それが例えば2コート、10人でダブルスをやろうとすると、8人がコートに入り、2人が休みになります。
同じペアで組まないようにしたいので、全員が違うペアと組んで試合をするには、何試合も試合を行わなければいけなくて、その組み合わせを考えるのが自力ではできませんでした。

3コートで14人とかなってくるともっと複雑で、どうやって組み合わせを考えたらいいかわかりません。

プログラムに詳しい方がおりましたら、どうすればエクセルで計算できるか、ご助力願えませんでしょうか。お願い致します。

A 回答 (3件)

エクセルである必要はあるのでしょうか?


完全にランダムでいいのであれば、以下のサイトが携帯からも見えるようですので、コートサイドで使用できると思います。

http://sports.geocities.jp/doubles_pair_site/

ただ、人数によって同じペアと組むことがあったり、全員とペアを組めなかったりしてます。

スマホをお持ちであれば、今はアプリがいくつかあるようです。

参考URL:http://sports.geocities.jp/doubles_pair_site/
    • good
    • 1

単純な組合せを作るなら以下のマクロで作れます。



Sub 組合作成(ByVal 人数 As Long)
Dim 表 As Worksheet
Dim 人1&, 人2&, 人3&, 人4&, 列&, 行&, 終&

Set 表 = ThisWorkbook.Worksheets(1) '第1シートに記録する
表.Cells.ClearContents
If 人数 < 4 Then Exit Sub '4人未満なら何もしない
終 = 人数 - 1
For 人1 = 1 To 終
  For 人2 = 人1 + 1 To 人数
    行 = 行 + 1
    列 = 1
    For 人3 = 人1 + 1 To 人数
      If 人3 <> 人2 Then
        For 人4 = 人3 + 1 To 人数
          If 人4 <> 人2 Then
            If 列 = 1 Then
              表.Cells(行, 列).NumberFormat = "@"
              表.Cells(行, 列) = CStr(人1) & "-" & CStr(人2)
            End If
            列 = 列 + 1
            表.Cells(行, 列).NumberFormat = "@"
            表.Cells(行, 列) = CStr(人3) & "-" & CStr(人4)
          End If
        Next
      End If
    Next
  Next
Next
End Sub

厄介なのが、コートと対戦ペアの割り当てです。現在、考慮中です。
    • good
    • 0

ちょっと難しい問題だと思います。



結論から言うと、2コート10人ダブルスの場合は、全員が他の人と必ず1回だけペアになるような組み合わせは存在しません。
どのような組み合わせを考えても、必ず同じペアになる2人が出てくるかまたはペアにならない2人が出てきます。

理由を簡単に説明すると、
1人がペアを組むのは残り9人ですから、試合をする延べ人数は10×9=90人
1試合4人ですから、試合数は90÷4=22.5
0.5の試合というのはありえないですからそういう組み合わせは不可能ということになります。

なお、2コート9人や3コート13人のように1人だけ休みの場合は存在します。

同じペアにならない組み合わせでの最大の試合数は22試合、
必ず1回はペアになる組み合わせでの最小の試合数は24試合(1回に2試合するとして)、
また、10人が平等に同じ回数だけ試合をするというなら20試合(1人8試合)か30試合(1人12試合)
ですが、その組み合わせは無数にあります。
実際には、その中でなるべく同じ人との対戦が少なくなる(1~2回、24,30試合の場合は2~3回)ような組み合わせが理想だと思います。
これはプログラミングというより数学の組み合わせ理論の問題です。
詳しく知りたい場合はいったん締め切って問題を整理してから、学問&教育の数学カテゴリーで質問してみてはどうでしょうか。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!