
まずはクイズ。8人集まってテニスか何かのダブルスを2面展開でやるとします。どれだけ異なった組み合わせがあると思いますか?プレイヤーを仮にAさん、Bさん…Hさんの8人として、ABペア対CDペア更にEFペア対GHペアが組み合わせの一例です。少しでも違っていたら(たとえばAB対CEとDF対GH)別の組み合わせとします。ちなみにもっとも単純な、4人1面のケースだと、組み合わせは3通り。プレイヤーをABCDとして、AB対CD、AC対BD、AD対BC、以上で終わりです。
この手の組み合わせ計算は大抵数式で表せます。この場合でいうと4の倍数の人数から組み合わせの数を求める式ですね。よくある式の一つだろうと思いきや思いの外ややこしくたどり着くまでに数日、いや一週間くらいは考え込んでしまいました。そんなのすぐわかるという人もおありでしょうが恐らく(望むらく?)少数でしょうから、以下の4択ではどうでしょう
- 20以下
- 20 〜100
- 100〜1000
- 1000以上
正解は3、数でいうと315です。多いと思う人もまあこんなものかと思う人もいることでしょう。ただ最初の1面4人3通りから2面8人だと100倍くらいになったということですね。では、3面12人ではどうなると思いますか。これをクイズにしたほうがいいのかもしれませんが、大体15万ほどです。これには驚く人も多い気がします。ちなみに4面16人では2000万位。ものすごい加速度で増えていくということですね。
コンセプト的には単純ですが実はこの問題、いくらコンピュータの性能が上がっても手に負えない類のものなんです。たとえばウィンブルドンにはコートが20ありますがじゃあ80人集めてダブルスしましょう、せっかくだから全ての組み合わせを比べてみましょうか、となると、可能な限り最大のメモリと最強プロセッサを装備した超絶強力マシンで何万年かかるかしらとかそんな話です。コンピュータさえ強力になれば解けない問題はない、というのは神話です。世の中にはどんなコンピュータにも解けない、少なくとも時間的に人の一生程度のスケールでは到底解けない問題があって、ダブルスの組み合わせを網羅するのはそういう問題なんです。
もちろんウィンブルドンのドロー担当者は数万年待つわけにはいきません。誰もこういうとき「網羅」はしないし、それを避けるトリックは沢山あって、アルゴリズムと呼ばれるものの中にはどれだけ計算をはしょって、しかもなるべく大事なものを犠牲にしない方法、的なものがかなりあります。
goodMatchesは色んな組み合わせを比べて力の拮抗するものを選びます。コート上で使う以上そんなに待たせることはできませんしそもそも携帯とにらめっこしながら待つ時間というのは永遠に感じられるものです。そこで1分というしばりを設け、その範囲内でどう「賢く計算量を減らす」かになかなか苦労しました。ファーストバージョンの16という上限は現段階での妥協点です。16でも通常1分はかかりませんし数が減れば一瞬の感覚に近づきます。さらに、待つのは最初だけで次の組み合わせを表示するのは一瞬です。
ちなみに既存のアプリは大方ランダム、いわゆる「乱数表」を基本に設計されています。2面展開で使って、片方だけバランス悪くあっという間に終わってしまったことはありませんか。色々(315です!)組み合わせがあるのにわざわざ悪いものを選んでしまった感覚です。2時間だと4ゲーム制でもせいぜい一人あたり4試合位しかできませんから、短いテニス人生いい組み合わせを選びたいものです。
数撃ちゃ当たるは易し、ピンポイント選択は難し、パートナー選びなら尚更です。時間がかかっても仕方ない、と言いたいところですが16はまだまだ少ないです。スケールアップを図ってクラブ大会レベルにも耐えられるよう改善を図ります。アイディアはあります!