とっておきの「まかない飯」を教えて下さい!

教えてください!

AからKの11チームがあり、各チームが5試合をした場合総当たりになります。
AはBからKまでの任意のチームと5試合行ったときに、B以下のチームにおいて総当たりになるような組み合わせ表はエクセル作成できますか。

どうぞよろしくお願いします。

質問者からの補足コメント

  • 3026kiku様

    回答いただきありがとうございました。補足させていただきます。

    ・7チームの場合、総当たりの最小合計試合数は21試合
     1チームあたりの試合数(3試合)を行えば添付図のようになると思われます

    ・11チームの場合総当たりの最小合計試合数は55試合
     1チームあたりの試合数(5試合)
     この55試合を重複しないように添付図のようになるような組み合わせ抽出方法を教えていただきた
     いです。

    宜しくお願い致します。

    「エクセルでの重複しない抽出方法について」の補足画像1
      補足日時:2015/04/15 09:44
  • 質問が上手くお伝えできてなくてすみません。
    再度、補足致します。

    Aチームが任意で5チームと総当たり試合すると252通りの方法があると思います。
    (₁₀C₅=10x9x8x7x6x5/5x4x3x2x1=30240/120=252)

    Aチームが任意で252通りの中の1通りで試合をした場合、252通りの内どの組み合わせでもBチーム以下の総当たりパターン抽出はエクセルで作成可能ですか?

    相当な数の組み合わせ数になるとは思っているのですが 。。。

    例えば、
    ・AチームがB,C,D,E,Fと先に試合を行った場合の、Bチーム以下の総当たりパターン
    ・AチームがG,H,I,J,Kと先に試合を行った場合の、Bチーム以下の総当たりパターン…
    上記のように条件をいれたときに、Bチーム以下の全パターン抽出がエクセルで作成可能でしょうか?

    どうぞ宜しくお願いします。

    No.2の回答に寄せられた補足コメントです。 補足日時:2015/04/16 15:35
  • 回答いただきありがとうございます。
    毎回、言葉足らずで申し訳ありません。

    再度、図を添付致しますので参照お願いします。

    わかりやすくする為に5チームにしています。(総当たり数10)
    総当たりするためには、各々が2試合ずつ行う必要があります。

    添付図のAチームが試合を行った(黄色塗り)箇所を入力したときにB・C・D・Eの総当たりパターンは自動で抽出できるのでしょうか?

    宜しくお願いします。

    「エクセルでの重複しない抽出方法について」の補足画像3
      補足日時:2015/04/17 17:53

A 回答 (4件)

#3です



> わかりやすくする為に5チームにしています。(総当たり数10)
> 総当たりするためには、各々が2試合ずつ行う必要があります。

この考え方がわかりません。

A・B・C・D・E の5チームがあったとして、総当たりするには
Aを基準に考えると
A-B,A-C,A-D,A-E の4試合
Bを基準に考えると
B-A,B-C,B-D,B-E の4試合
Cを基準に考えると
C-A,C-B,C-D,C-E の4試合
D,E も同様に基準として考えると 各4試合

4試合 x 5チーム = 20

ただ、
A-B,B-A は同じ試合
A-C,C-A は同じ試合
B-C,C-B は同じ試合
・・・・
を指すので

20 ÷ 2 = 10

総試合数は 10試合となると思います。
※ あくまでも、1チームの試合数4試合は変わらず

この総試合数をチーム数で割ってしまった(10 ÷ 5 = 2)から
以下の様な記述になったのでしょうか

>・7チームの場合、総当たりの最小合計試合数は21試合
>  1チームあたりの試合数(3試合)を行えば添付図のようになると思われます

>・11チームの場合総当たりの最小合計試合数は55試合
>  1チームあたりの試合数(5試合)

1チームあたり、これを求めて何の意味があるのかわかりません。
偶数チーム数、
例えば8チームなら 3.5 に・・・ 0.5の試合ってどんな試合?

総当たりを見易く表にしたもの(サッカーの試合で良く見る図)が、
#1、#2に添付した図の様になります。(縦・横にチーム名を並べただけ)
#2の添付図を例にすると、
D2のAが対戦するのは、赤線右側のチームと
D3のBが対戦するのは、赤線右側のチームと
※ 赤線左側の対戦は既にAでの対戦のものを指すから試合数から除外
D4のCが対戦するのは、赤線右側のチームと
※ 赤線左側の対戦は既にA、Bでの対戦のものを指すから試合数から除外
以下同様・・・・
とすると、総試合数を求めるのは、
表赤線左側のものを1段あげて四角形にして面積を求めて2で割る
(赤線左側のものは、赤線右側のものと同じ組合せを指すから)
※ 赤線右側を左に1つずらしても同じ

チーム数 x (チーム数 - 1) ÷ 2

そこで、A-C,A-D,A-E を先に試合したとしても、
試合を消化しただけなので、他の組み合わせに影響はないと思います。

今回の添付図(左上)
Aチームが B・C・F・H・I と先に試合をした・・・
これをグループ分けと捉えるのなら
A~Kを(A・B・C・F・H・I)(D・E・G・J・K)とするなら
A~Kの表内A・B・C・F・H・Iの縦・横に色を付けて、
色がつかなかった部分が残った組合せになると思います。
5チーム残ったので 5 x 4 ÷ 2 = 10 の試合数

#3は、グループ分けと解釈し、
残ったチームの組合せを求めたものになります。

#1、#2では、試合進行をどのような組合せ順ですれば・・・
というものでしたが


※ 1チームあたり・・・
この考え方を推測、また無理やりこじつけると
Aチームが B・C・F・H・I と試合をする時には、Aがホーム開催
Aチームが D・E・G・J・K と試合をする時には、相手がホーム開催
このホーム開催を求めたい・・・になるのでしょうか?

そうであれば、縦・横のチーム記述を(添付図右側)
A・B・D・C・E・F・G・H・J・I・K の順
(Aと、ホーム、相手がホーム、ホーム、相手がホーム・・・)にして
A段の赤線右側の B・C・F・H・I に色を付けます
A列の赤線左側は 色を付けなかったチームに色を付けます
B段の赤線右側は、上段Aの色が付いていない部分に色を付けます
B列の赤線左側は 色を付けなかったチームに色を付けます
これを繰り返していくと、結構綺麗なチェック柄になると思います。
出来上がったら、縦・横入れ替えれば・・・・
色が付いている所がホーム開催・・・
これをコード化すれば良いと思います。
(求め方の一例ですが)
「エクセルでの重複しない抽出方法について」の回答画像4
    • good
    • 2
この回答へのお礼

回答ありがとうございました☆彡
拙い質問の仕方にも関わらず、根気よく向き合っていただき本当に感謝しております。

お礼日時:2015/04/20 10:00

#2です



解釈が苦手です
Aチーム内にBがある/ない場合での、Bチーム以下ってどのチームが対象?
Aチームの方も総当たりが必要??

あ~だこ~だ云っても、先に進まないと思うので
部品として使えるかどうか・・・・という記述にしてみました。

A1~A最終行まで、チーム名を入れて以下を実行してみてください
(A1には A を入れておいてください)

実行すると
・チーム数の入力になります
 A を含むチーム数で、6では、A 以外に5チームをランダムで抽出
(★ 部分をコメントにすると、 A を必ず選ぶとは限らない)
・残ったチームで、組合せを作成します
(リーグ戦での表示はやめて、ベタで)
・結果は最終列に追加していきます

※ 同じチーム数を入力しても、ランダムで抽出するので結果は同じにはならない??
(添付図では、チーム数に 6, 5, 7 を入力した時の例)


Option Explicit

Public Sub Samp1()
  Dim vA As Variant
  Dim sA() As String, sB() As String
  Dim sS As String
  Dim iHdn As Long, iCnt As Long
  Dim i As Long, j As Long

  vA = WorksheetFunction.Transpose( _
      Range("A1", Cells(Rows.Count, "A").End(xlUp)))
  sS = UBound(vA) & " チーム中、何チームを選ぶ?" & vbCrLf _
      & "( A1 に記述したチーム含みで)"
  sS = InputBox(sS, , UBound(vA) \ 2)
  iCnt = Val(sS)
  If ((iCnt < 1) Or (iCnt >= UBound(vA) - 1)) Then
    iCnt = UBound(vA) \ 2
  End If
  ReDim sA(1 To iCnt)
  Randomize

  ' 指定数のチーム抽出
  iHdn = 0
  While (iHdn < iCnt)
    j = UBound(vA) - iHdn
    i = Int(j * Rnd()) + 1
    If (iHdn = 0) Then i = 1 ' ★
    iHdn = iHdn + 1
    sA(iHdn) = vA(i)
    vA(i) = vA(j)
  Wend

  ReDim Preserve vA(1 To UBound(vA) - iHdn)

  ' チーム名昇順が必要なら
  ' sA、vA の2つを対象に、この場所で

  ' 残ったチームの組合せ
  iCnt = 0
  For i = 1 To UBound(vA) - 1
    For j = i + 1 To UBound(vA)
      iCnt = iCnt + 1
      ReDim Preserve sB(1 To iCnt)
      sB(iCnt) = vA(i) & " - " & vA(j)
    Next
  Next

  ' 結果の表示
  i = Cells(1, Columns.Count).End(xlToLeft).Column + 1
  If (i = 2) Then i = 3
  With Cells(1, i)
    .Value = "選択チーム"
    With .Offset(1).Resize(UBound(sA))
      .Value = WorksheetFunction.Transpose(sA)
      .Borders.LineStyle = xlContinuous
    End With
    With .Offset(UBound(sA) + 2)
      .Value = "他組合せ"
      With .Offset(1).Resize(iCnt)
        .Value = WorksheetFunction.Transpose(sB)
        .Borders.LineStyle = xlContinuous
      End With
    End With
    With .EntireColumn
      .HorizontalAlignment = xlCenter
      .AutoFit
    End With
  End With
End Sub
「エクセルでの重複しない抽出方法について」の回答画像3
    • good
    • 0

#1です



リーグ戦の表?っていうのは、添付図のように
斜めに引いた赤の線を境に、右上と左下は対称になっていると思います。

・右上のどこかを消したら、左下の対称部分は消さない。
・右上のどこかを残すのなら、左下の対称部分は消す。

という操作が必要でしょうか?
どちらを消す/残すルールはありますか?

> ※ 図内の数字は、何試合目・・・
と記述していましたが、見方として
D2のAでは、1試合目はBと、2試合目はCと・・・
D3のBでは、1試合目はAと、2試合目はDと・・・

こっちの方がわかり易い?
今週の土曜日は、数字1のチームが試合してください。
来週の土曜日は、数字2のチームが試合してください・・・

部分的に消えていると見難い様な気がしますが?
「エクセルでの重複しない抽出方法について」の回答画像2
この回答への補足あり
    • good
    • 0

具体的に、こんな感じというサンプルはありませんか?



一応、添付図の様な総当たり(リーグ戦?)を求めてみたのですが、違うのですよね。

例えば、
A~Kの中で、AがB~Fの5試合したとして、
残りはどういった感じになるのでしょうか?

※ 記述してみた総当たり処理では、19チームの時には後半求められず。
チーム数が多くなると、それなりに遅くなる・・・
(処理を端折っている部分もあって・・・・)

※ 図内の数字は、何試合目・・・
「エクセルでの重複しない抽出方法について」の回答画像1
    • good
    • 0

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


おすすめ情報