ARCHIVE  ENTRY  COMMENT  TRACKBACK  CATEGORY  PROFILE  OTHERS
<< November 2017 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 >>

ねんどたにあんシリーズ [NDS] サガ2・プレイ日記 Diablo HD MOD 週刊 ちょうさを作る

ダブルス組合せ表

  〜 2017/04/15 〜


テニスなんかのダブルス競技で、試合の時に使う組合せ表(乱数表)。毎回異なった人数で試合することが多いので、印刷して持っておけば便利ですよね。ということで、自分も印刷してラケットバッグに入れておこうと思ったのですが、いざインターネットで探してみても、あまり出てこないんですよね…。単純に「n人の組合せ」なんで、数学でいう順列・組合せで決まりきった解(表)があるのかなーっと思っていたのですが、いくつか見つかった組合せ表を見ても十人十色。そういえば、うちのテニス仲間の間でも、持っている表にパターンが存在していたような気がします。

そこで「無いなら自分で作ればいいじゃない、サクッといけるでしょ!」と思っていたのですが、いざちゃんと考えてみるとこれがまた以外に奥が深い…。ここ数日間色々試してみて、ロジックの組み方で色んなパターンの組合わせが生まれたのですが、「まぁ、プログラムで重み付けとか自動で計算させて出た結果なのでそれを信じよう(;´Д`)」と最後は妥協して印刷。ただ、せっかく作ったのを個人だけで使用するのも勿体ないので公開しようと思います。

【ダブルス組合せ表(乱数表)】
ダブルス組合せ表(プレイヤー4人〜15人、全試合)(PDFファイル)
ダブルス組合せ表(プレイヤー4人〜20人、50試合まで)(PDFファイル)

・ 特定のプレイヤーが超優先されないに考慮(番号が若い方が優先)
・ 同じペアが連続して試合に登場しないように考慮
・ 同じメンツでの試合が連続して出ないように考慮

もし使えそうなら自由に使って頂ければ幸いですが、下記はお約束です。
・ この表は完全な組み合わせを保証しているものではありません。
・ この表を利用して如何なる不利益が生じたとしても、当方は一切関知しません。
・ この表を改変しての再配布は問題ありませんが、その際は当方の著作権表示は外して下さい。

あ…、ちなみに↑の組合せ表は「コート1面版のみ」です。n面対応版も出来なくはないと思いますが、1面でも結構あーでもないこーでもないってなったのと、主に自分で使うように作ったもので、利用シーンがほぼ1面だけなので…(;´Д`)



ちなみにちなみに、組合せ表は適当な大きさに整形・印刷して、↑のようなハードカードケースに入れて、実際に使う時は100均の磁石で「どこまで進んだか」を目印するようにしています。カードケースは普通の文房具屋さんで100円くらいで買えますし、磁石もCan★Do製なので勿論ワンコインです。そしてこの磁石、ネオジム磁石なのでかなり強力(ハードカードケース越しでも両方向からガッチリ挟めます!)なのと、ボタン電池より薄いので出っ張りが気にならず、とても使い勝手が良いです。この組合さはコスパ的に想像以上に良かったので、お勧めです(*‘ω‘ *) (ただ、ラケットバッグなどに忍び込ませておいた場合、磁力が電子機器に影響するかもしれないので、そこは自己責任でお願いします)

ここから先(続きを読む)は、表を生成した際のプログラムについてのお話です。
興味のある方だけ見て頂ければと思います(ソースのポロりもあるよ!!)
実はこのブログエントリも、カテゴリーが「PROGRAMING」になってるっていう(笑
さてさて、ダブルスの組合せ表を生成するプログラミングですが、「単純に組合せ調べていって、今までの試合数とかで重み付けして、最適組合せを選んでいけばいいんでしょ?」と思った人いますよね?はい、まぁ、その通りだったんですが…。

プログラム組んでみて、意外や意外、最適解って1つになるのかなーって思ってましたが、きっちり決まらないものなんですね。いや、自分の組み方が甘いのかな?重要なのは「何を使って重み付け(優先度決定)するか」だと思うのですが、ここが検討しきれてないのかもしれませんね。

今回自分が使った重み付け項目は、

1.プレイヤーの試合出場回数(試合数が少ない人ほど優先度が上がる)
  ⇒このお陰で、誰かが超優遇されることが起き難くなる(はず)
2.ペアの試合出場回数(試合数が少ないペアほど優先度が上がる)
  ⇒このお陰で、同じペアで連続して登場することが起き難くなる(はず)
3.グループの試合出場回数(試合数が少ないグループ(=4人)ほど優先度があがる)
  ⇒このお陰で、同じ4人で連続して登場することが起き難くなる(はず)

まずはこの1〜3を共通項目とし、さらに追加項目として、

パターンA:プレイヤー番号が若い方が優先+ペア番号も若い方が優先
パターンB:プレイヤー番号が若い方が優先
パターンC:特になし

で重み付け計算させてみて、最終的にパターンBを採用することにしました。

パターンAは、プレイヤー番号の優先は良いのですが、ペア番号の優先が微妙な結果でした。というのも、普段実際に試合をする時の慣例として「第一試合は(1−2)(3−4)」が定着しているのですが、このペア番号優先を入れるとまさかの「(1−3)(2−4)」になっちゃうんですよね。これはペア番号の順位の付け方が「1−2<1−3<2−3<2−4<3−4<…」みたいな感じなので、どうしても仕方ない結果な訳です。流石にこれは現場で受け入れにくい(混乱を招きそう)なので、独断と偏見で却下にしました。

パターンCは、プレイヤー番号の優先が無いので、「トータル的に見たプレイヤー毎の優先順位が逆転しているところが一番多い」結果になりました。その半面、「各プレイヤー毎の優先度のバラツキ(標準偏差)は一番小さい」というメリットもあったのですが、やはり「プレイヤー番号が若い人が優先」という特色を出したかったので、こちらも最後まで迷いましたが泣く泣く却下にしました。

一応このパターン比較をした際の資料を置いときますね、誰得?って感じですが…(苦笑
パターン比較(PDFファイル)

そんなこんなで組み上げたプログラムですが、折角なので公開しておこうと思います。もしかしたら、より良いロジックで改良してくれる方がいらっしゃるかもしれませんしね!ソース公開は、オンラインプログラミングサイトの「paiza.IO」さんをお借りしました。サクッとコードを試したいっていう時には非常に良いサイトですね。そして、共有だけでなく、↓のように埋め込み&実行ができるのも良い感じです。

<実行方法>
下段の「入力」タブの所にプレイヤー数を入力して、実行ボタンを押すことで「出力」タブに組合せを表示します。ただ、サイト側の制限として「実行時間2秒でタイムアウト!」があるので、300試合くらいで打ち切りにしています。プレイヤー数を増やすと、16人目くらいからタイムアウトしちゃうので、、、。(ショボくてすみません(´・ω:;.:... )



そして、特に理由もなくJavaでプログラミングしたのですが、ふと「Perlあたりの方が実行速度早いんじゃ?」と思って、同じロジックで言語換装してみたんですが…、あ、あれ?(;´Д`)



少ないプレイヤー数では断然Perlの方が早いんですが、指数関数的に増加していって、あっという間にJavaよりパフォーマンス悪くなっちゃいました。今回、ソース公開もしようと思っていたので「パフォーマンス<可読性」でコーディングしたこともあり、まぁ、その辺もパフォーマンス劣化につながってそうですね。ハッシュでデータ管理するより、配列でガッチリ管理した方が早そうですし…。まぁ、実際に必要となる試合数なんて多くて10数試合だと思うので、その辺は特に拘りないですが(笑

後、今回のプログラミングの際に「プレイヤーn人の場合の総組合わせ数」っていくつなんだろーって、考えてみました。結論からすると「nP4 / 8」という公式を導き出したので書いておきますね。考え方は「n人の順列総数(nP4)の内、1人目と2人目の重複除去(/2)、2人目と3人目の重複除去(/2)、3人目と4人目の重複除去(/2)」みたいな感じです。一応、プログラムで出力した組合わせ数と公式計算値が一致していたので多分合ってるかと!(*‘ω‘ *)

おしまい。

コメント
コメントする








 
この記事のトラックバックURL
トラックバック
トップへ




ウルティマ ゲームタイム 180 をAmazonで購入する ウルティマ ゲームタイム 90 をAmazonで購入する ウルティマ ゲームタイム 30 をAmazonで購入する
ウルティマ ゲームタイムの価格推移はこちら!
more...