• 締切済み

対戦結果の並び替えを行いたいのですが

1000人程度が対戦をしてその勝敗をCSVファイルで記録しています。 そのCSVファイルにはスコアなどはなく、横列に 対戦番号,勝者名,敗者名 というような形で記録しており、このCSVに基づいて強い順に並び替えたいと思っています。 対戦は総当たりではなく対戦回数も各自バラバラで何度もいろいろな人と戦った人もいれば 1度しか誰かと戦ったことがない人もいます。ただし、同じ人同士の対戦は全くありません。 スクリプトかなにか(pearlなど)で、並び替えの処理を行ってみたいのですが いいアイデア・サンプルがあれば教えてください。

みんなの回答

  • mpro-gram
  • ベストアンサー率74% (170/228)
回答No.3

グループ分けするなら、とりあえず、実対戦数をみて対戦数の多い群は、勝率で並べてもいいんじゃないかな。「対戦数が多い」基準をどの辺とするかは、実際にどれくらいの対戦数分布なのかも調べておく必要があります。5戦か10戦してれば、勝率で並べてもあまり文句は出ないと思う。 1対戦のみの人同士は、そのgroup 内対戦なら、そのgroup 内で並べる、3つ巴になってたら同順にしておく。相手が他の group の人だったら、その相手のgroup の並べ順の脇にダッシュ番号みたいにして位置づける。 「2対戦から「多いの基準」未満」の場合、さて、どうしましょう? 相手がこのgroup内の人のみなら、group 内での勝ち負けで並べられそうだが、 他のgroup の人が混ざっていた場合にどう順位付けるか? 相手が自分との1対戦のみなら、先の1対戦者の定義から、こちらのgroup内順位をつければよい。 相手が、「対戦数が多い」groupの場合、、、さて? どのgroupとの対戦が多いかによっても細かいgroup分けしてしまうか?メンバーが 1000人もいるなら、初期には、100group以上になるくらいの場合わけがいるだろう。 となると、excel でやるのは、面倒。VBや perl, phpなどで連想配列にいれて、ごりごり? RDBでSQL文の方が、調査(対戦数、勝ち数、負け数)は速そうだけど。

  • mpro-gram
  • ベストアンサー率74% (170/228)
回答No.2

強さの定義が不十分です。 1.沢山勝った数順なのか(沢山試合した人に有利) 2.ある人(A)に勝ったらその人(A)としか試合してなくても、Aより上位とするのか?しかしその場合、Aより強い人が複数いたら試合してない人同士はどういう順位付けするのか? 3.勝率順とするのか?一つしか試合してなくて勝ったら勝率100% 、負けたら0%というのは、沢山試合した人や負けた人からブーイングが来そうだ。一番強い人に負けただけなのにビリというのもね。 ま、それでも、1か3ならそれなりにプログラムは組めるだろう。2は、もっといろいろ定義づけ必要。 1ならexcel の集計機能でも出せそう。勝者名にでてくる回数を数えるだけだから。

aiokw
質問者

お礼

ご返答ありがとうございます。 確かに、強さの定義づけが不十分だと思いました^^; 挙げていただいた例の中では2番目のものが一番理想に近いと思います。 結果としては対戦結果が拾い集められる中での順列が複数個できるような感じになればいいかなぁと思います。 結果1:A,L,C,G,K,N,E,I 結果2:L,D,H,M,F 結果3:J,B という感じに、結果1、2、3 の間では強弱関係はデータ不足で判定はできなくてもよい。 現在も対戦が続いていて、今後結果のデータが増えてきたらスクリプトで再集計して結果の制度を上げていく感じ。 ただ、これを書いていて上に書いた結果のように出てくる名前がuniqueにはならない可能性が高くなりますねぇ・・・。 仮にZさんがいてLさんには負けたけどCさんとは戦っていなければ結果1の順列に入れなくなりそうですね。さらにGさんには勝っている場合などはLさんとGさんの間ではあるが、Cさんとの比較ができないのでその場合の処理も考えないといけないんですね。 うぅ・・・。思ったよりややこしいですね><

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.1

RDBという選択肢は?

aiokw
質問者

お礼

ご返答ありがとうございます。 最初はデータベースも考えたのですが、データの項目が見ての通りすごくシンプルで、Excelで開いてフィルタする程度で十分だったので除外していました。 この項目数だと、それ程扱うアレンジ処理もないだろうから、簡単なスクリプトで処理できればいいかなぁと思ってました。

関連するQ&A