C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[9]: リーグ戦のマトリックスロジック(言語は何でも可)


(過去ログ 124 を表示中)

[トピック内 10 記事 (1 - 10 表示)]  << 0 >>

■74101 / inTopicNo.1)  リーグ戦のマトリックスロジック(言語は何でも可)
  
□投稿者/ ぼぼ (1回)-(2014/12/01(Mon) 00:16:41)

分類:[Java] 

こんにちは。

Javaで書いてますが、処理事態の話なので、
どんな言語でも条件ロジックは同じだと思います。

いま、リーグ戦のマトリックスのようなX個のチームの
総当りロジックを組みたいのですが、頭がこんがらがって
なかなか実現できません。

もちろん、以下はうまく行っていないのですが、
流れとしてはチーム数が可変でも対応できればと思い、
以下のようにしてます。


for (int j = 0; j < list.size(); j++) {
 System.out.println((j+1)+"節");
 for (int i = 0; i < list.size()/2; i++) {
  Integer idx1 = i + j;
  if (idx1 > list.size() - 1) {
   idx1 = list.size() - 1 - idx1;
  }
  Integer idx2 = list.size() - 1 - i ;
  if (idx2 < 1) {
   idx2 = list.size() - 1 + idx2;
  }
  System.out.println(list.get(idx1).teamname + "-" + list.get(idx2).teamname);
 }
}

どなたか経験がありましたら、ご教示頂ければ幸いです。

引用返信 編集キー/
■74102 / inTopicNo.2)  Re[1]: リーグ戦のマトリックスロジック(言語は何でも可)
□投稿者/ shu (634回)-(2014/12/01(Mon) 07:51:22)
No74101 (ぼぼ さん) に返信

 i0 1 2 3 4 5
j
0 / O O O O O
1 X / O O O O
2 X X / O O O
3 X X X / O O
4 X X X X / O
5 X X X X X /

O:処理する分
/:処理しない
X:Oでの処理の逆なので処理しない

この図からj毎のiの範囲を見つけるとよいです。

引用返信 編集キー/
■74112 / inTopicNo.3)  Re[2]: リーグ戦のマトリックスロジック(言語は何でも可)
□投稿者/ ぼぼ (3回)-(2014/12/01(Mon) 14:22:45)
No74102 (shu さん) に返信

> この図からj毎のiの範囲を見つけるとよいです。

ありがとうございます。

確かに単純なマトリックスを作るのであれば、
1チームを固定に全チームループさせ、インクリメントして
以降の全チームをループで対戦はカバーできるのですが、

第1節〜みたいな形でロジックを組みたいです。
Jリーグでは「日程くん」なるものがあり、色々なルールを
組み込めるようです(ホームは3連続はだめなど)が、
ルールは全く無く、全チームの総当り日程を組みたいです。

ちなみにチームは常に偶数なので、あまりが出る事はありません。
よろしくお願いします。
引用返信 編集キー/
■74121 / inTopicNo.4)  Re[3]: リーグ戦のマトリックスロジック(言語は何でも可)
□投稿者/ ぼぼ (5回)-(2014/12/02(Tue) 02:29:36)
規則性はわかりませんでしたが、一応16チームで総当り
15節うまく割り当たったと思います。

ロジックに落とすのはかなり大変そう。。
最悪、これをテンプレートに該当チーム分を置換させるようにします。

1
日本1-日本16
日本2-日本15
日本3-日本14
日本4-日本13
日本5-日本12
日本6-日本11
日本7-日本10
日本8-日本9

2
日本1-日本15
日本2-日本14
日本3-日本13
日本4-日本12
日本5-日本11
日本6-日本10
日本7-日本9
日本8-日本16

3
日本1-日本14
日本2-日本13
日本3-日本12
日本4-日本11
日本5-日本10
日本6-日本9
日本7-日本8
日本15-日本16

4
日本1-日本13
日本2-日本12
日本3-日本11
日本4-日本10
日本5-日本9
日本6-日本8
日本7-日本16
日本14-日本15

5
日本1-日本12
日本2-日本11
日本3-日本10
日本4-日本9
日本5-日本8
日本6-日本7
日本13-日本15
日本14-日本16

6
日本1-日本11
日本2-日本10
日本3-日本9
日本4-日本8
日本5-日本7
日本6-日本16
日本12-日本15
日本13-日本14

7
日本1-日本10
日本2-日本9
日本3-日本8
日本4-日本7
日本5-日本6
日本11-日本15
日本12-日本14
日本13-日本16

8
日本1-日本9
日本2-日本8
日本3-日本7
日本4-日本6
日本5-日本15
日本10-日本14
日本11-日本13
日本12-日本16

9
日本1-日本8
日本2-日本7
日本3-日本6
日本4-日本5
日本9-日本16
日本10-日本15
日本11-日本14
日本12-日本13

10
日本1-日本7
日本2-日本6
日本3-日本5
日本4-日本16
日本8-日本15
日本9-日本14
日本10-日本13
日本11-日本12

11
日本1-日本6
日本2-日本5
日本3-日本4
日本7-日本15
日本8-日本14
日本9-日本13
日本10-日本12
日本11-日本16

12
日本1-日本5
日本2-日本4
日本3-日本15
日本6-日本14
日本7-日本13
日本8-日本12
日本9-日本11
日本10-日本16

13
日本1-日本4
日本2-日本3
日本5-日本16
日本6-日本15
日本7-日本14
日本8-日本13
日本9-日本12
日本10-日本11

14
日本1-日本3
日本2-日本16
日本4-日本14
日本5-日本13
日本6-日本12
日本7-日本11
日本8-日本10
日本9-日本15

15
日本1-日本2
日本3-日本16
日本4-日本15
日本5-日本14
日本6-日本13
日本7-日本12
日本8-日本11
日本9-日本10

引用返信 編集キー/
■74123 / inTopicNo.5)  Re[4]: リーグ戦のマトリックスロジック(言語は何でも可)
□投稿者/ shu (636回)-(2014/12/02(Tue) 10:21:38)
No74121 (ぼぼ さん) に返信

> 規則性はわかりませんでしたが、一応16チームで総当り
> 15節うまく割り当たったと思います。
マトリックスにそのまま展開するとこんな感じですかね。


	1	2	3	4	5	6	7	8	9	10	11	12	13	14	15	16
1		15_1	14_1	13_1	12_1	11_1	10_1	9_1	8_1	7_1	6_1	5_1	4_1	3_1	2_1	1_1
2			13_2	12_2	11_2	10_2	9_2	8_2	7_2	6_2	5_2	4_2	3_2	2_2	1_2	14_2
3				11_3	10_3	9_3	8_3	7_3	6_3	5_3	4_3	3_3	2_3	1_3	12_3	15_2
4					9_4	8_4	7_4	6_4	5_4	4_4	3_4	2_4	1_4	14_3	15_3	10_4
5						7_5	6_5	5_5	4_5	3_5	2_5	1_5	14_4	15_4	8_5	13_3
6							5_6	4_6	3_6	2_6	1_6	14_5	15_5	12_4	13_4	6_6
7								3_7	2_7	1_7	14_6	15_6	12_5	13_5	11_4	4_7
8									1_8	14_7	15_7	12_6	13_6	11_5	10_5	2_8
9										15_8	12_7	13_7	11_6	10_6	14_8	9_5
10											13_8	11_7	10_7	8_6	9_6	12_8
11												10_8	8_7	9_7	7_6	11_8
12													9_8	7_7	6_7	8_8
13														6_8	5_7	7_8
14															4_8	5_8
15																3_8
16																


以下の部分は規則性があるので残りの部分だけ情報を持つようにしてみてはどうでしょう?
	1	2	3	4	5	6	7	8	9	10	11	12	13	14	15	16
1		15_1	14_1	13_1	12_1	11_1	10_1	9_1	8_1	7_1	6_1	5_1	4_1	3_1	2_1	1_1
2			13_2	12_2	11_2	10_2	9_2	8_2	7_2	6_2	5_2	4_2	3_2	2_2	1_2	
3				11_3	10_3	9_3	8_3	7_3	6_3	5_3	4_3	3_3	2_3	1_3		
4					9_4	8_4	7_4	6_4	5_4	4_4	3_4	2_4	1_4			
5						7_5	6_5	5_5	4_5	3_5	2_5	1_5				
6							5_6	4_6	3_6	2_6	1_6					
7								3_7	2_7	1_7						
8									1_8							
9																
10																
11																
12																
13																
14																
15																
16																

引用返信 編集キー/
■74126 / inTopicNo.6)  Re[5]: リーグ戦のマトリックスロジック(言語は何でも可)
□投稿者/ ぼぼ (6回)-(2014/12/02(Tue) 12:29:20)
No74123 (shu さん) に返信
> 以下の部分は規則性があるので残りの部分だけ情報を持つようにしてみてはどうでしょう?

ありがとうございます!
ここまでしていただき、非常に感謝しています!

確かに昨日もんもんと手であれこれ試しましたが、何とかロジックに落とせるように規則性を意識して確認していましたが、
やっぱりどうしても明記頂いた右横△部分の規則性は難しかったです。

どうしても他の「節」に影響を受けるので、無限ループに陥りそうなロジック。
もう少し、シンプルになりそうな、ならなさそうな・・。規則性を探りたいと思います。

ありがとうございます!
引用返信 編集キー/
■74128 / inTopicNo.7)  Re[6]: リーグ戦のマトリックスロジック(言語は何でも可)
□投稿者/ ainax (5回)-(2014/12/02(Tue) 13:27:56)
No74126 (ぼぼ さん) に返信

		1節	2節	3節	4節	5節	6節	7節	8節	9節	10節	11節	12節	13節	14節	15節
1	VS	  15	  14	  13	  12	  11	  10	    9	    8	    7	    6	    5	    4	    3	    2	  16
2	VS	  14	  13	  12	  11	  10	    9	    8	    7	    6	    5	    4	    3	  16	    1	  15
3	VS	  13	  12	  11	  10	    9	    8	    7	    6	    5	    4	  16	    2	    1	  15	  14
4	VS	  12	  11	  10	    9	    8	    7	    6	    5	  16	    3	    2	    1	  15	  14	  13
5	VS	  11	  10	    9	    8	    7	    6	  16	    4	    3	    2	    1	  15	  14	  13	  12
6	VS	  10	    9	    8	    7	  16	    5	    4	    3	    2	    1	  15	  14	  13	  12	  11
7	VS	    9	    8	  16	    6	    5	    4	    3	    2	    1	  15	  14	  13	  12	  11	  10
8	VS	  16	    7	    6	    5	    4	    3	    2	    1	  15	  14	  13	  12	  11	  10	    9

組み合わせってこの組み合わせでいいのかな。
対戦の左側固定の、右側は15→1チームまで回し、もし同じチームナンバーだった場合のみ、16チーム目を入れてやる。

まちがってたらごめんなさい。

引用返信 編集キー/
■74129 / inTopicNo.8)  Re[7]: リーグ戦のマトリックスロジック(言語は何でも可)
□投稿者/ ぼぼ (7回)-(2014/12/02(Tue) 14:09:12)
No74128 (ainax さん) に返信

ありがとうございます!
違った視点でなるほどと感じました。

ただ、3節の6と8が重複し、14、15の試合が無いなど、軸にするチームを完全8個固定は
難しいのではと思います。

ただ、この考えを元にロジックを組んで例外部の条件を見直せば、近づけそうな気がしてきました。

ありがとうございます!
引用返信 編集キー/
■74138 / inTopicNo.9)  Re[8]: リーグ戦のマトリックスロジック(言語は何でも可)
□投稿者/ ainax (6回)-(2014/12/02(Tue) 21:52:13)
No74129 (ぼぼ さん) に返信
間違っててすみませんでした。
きちんと調べて C# ですが、組んでみました。

   static void Main(string[] args)
   {
       const int TEAM_COUNT = 8; // 2 の倍数以外では未検証です。

       int[] cell = new int[TEAM_COUNT];
       cell[0] = TEAM_COUNT;

       for (int round = 1; round < TEAM_COUNT; round++)
       {
           Console.WriteLine("Round {0}", round);

           for (int team = 1; team < TEAM_COUNT; team++)
           {
               cell[team] = (round + team) % (TEAM_COUNT - 1);
               if (cell[team] == 0)
               {
                   cell[team] = TEAM_COUNT - 1;
               }
           }
           for (int i = 0; i < TEAM_COUNT / 2; i++)
           {
               Console.WriteLine("\tTeam{0} vs Team{1}", cell[i], cell[TEAM_COUNT - i - 1]);
           }

       }

       Console.ReadKey();
   }

/*  結果
Round 1
	Team8 vs Team1
	Team2 vs Team7
	Team3 vs Team6
	Team4 vs Team5
Round 2
	Team8 vs Team2
	Team3 vs Team1
	Team4 vs Team7
	Team5 vs Team6
Round 3
	Team8 vs Team3
	Team4 vs Team2
	Team5 vs Team1
	Team6 vs Team7
Round 4
	Team8 vs Team4
	Team5 vs Team3
	Team6 vs Team2
	Team7 vs Team1
Round 5
	Team8 vs Team5
	Team6 vs Team4
	Team7 vs Team3
	Team1 vs Team2
Round 6
	Team8 vs Team6
	Team7 vs Team5
	Team1 vs Team4
	Team2 vs Team3
Round 7
	Team8 vs Team7
	Team1 vs Team6
	Team2 vs Team5
	Team3 vs Team4
*/

参考元は英語版 wikipedia です。
http://en.wikipedia.org/wiki/Round-robin_tournament

結果を見て貰うと分かると思いますが、最後のチームを固定し
その他のチームを時計回りに 1 週させています。
(英語の読解とアルゴリズムの反映があっていれば、これで問題ないはず・・・)

# ソース組んでいるとき結構混乱してましたので、
# またまた間違っていたらごめんなさい m( _ _ )m

引用返信 編集キー/
■74141 / inTopicNo.10)  Re[9]: リーグ戦のマトリックスロジック(言語は何でも可)
□投稿者/ ぼぼ (8回)-(2014/12/02(Tue) 23:15:11)
No74138 (ainax さん) に返信

ありがとうございます!
正に求めていたロジックです!

そうですね。全チームを時計回りに回し、インクリメントで1周すれば全体戦の網羅と
節を割り出せますね。

数式が分かって初めて納得するんですが、考えた人は頭が柔軟ですね。
また、ainaxさんもこういう仕様に当たった時、これを的確に探し出す事も凄いですね!

本当に勉強になりました。心からありがとうございます!
自分はまだまだだな・・。。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -