歴史に基づいて公正なチームを分割するための戦略/アルゴリズム


20

私たちは定期的にフロアボールをしている人々のグループです。すべてのセッションは、チームを分割するという困難なタスクから始まります...

では、チームを自動的に選択するアプリケーションよりも優れているのは何でしょうか?

したがって、チームの組み合わせと結果の履歴、およびこの特定のセッションに参加する人々のリストを考えると、最適なチームを見つけるための良い戦略は何でしょうか?最適とは、チームが可能な限り平等であることを意味します。

何か案は?

編集:明確にするために、ピッキングの基礎となるデータは次のようになります。

[{ team1: ["playerA", "playerB", "playerC"],
   team2: ["playerD", "playerE", "playerF"],
   goals_team1: 10,
   goals_team2:  8 
 },
 { team1: ["playerD", "playerB", "playerC"],
   team2: ["playerA", "playerE", "playerG"],
   goals_team1:  2,
   goals_team2:  5
 },
 { team1: ["playerD", "playerB", "playerF"],
   team2: ["playerA", "playerE", "playerC"],
   goals_team1:  4,
   goals_team2:  2
 }]

4
フロアボールとは何ですか?
ダイナミック

1
あなたはチームのスコアしか持っておらず、個人の貢献スコアは持っていないと思いますか?
ロボットをゲット

1
@Dynamic:Floor Hockeyの別名だと思います-ホッケーは、パックの付いた氷の上ではなく、ジムの床で小さなゴムのボールでプレーしました(もちろん、スケートはしません)。
FrustratedWithFormsDesigner

2
このアルゴリズムで使用される唯一の情報は、各プレイヤーが勝ち負けたチームの数だけであることを明確にしたいかもしれません。
-TehShrike

2
@TehShrike対戦した各試合について、誰がどのチームでプレーしたか、そしてエンドスコアが何であったかについての情報があります。例えば。{Team1:[ ""、 "B"、 "C"]、Team2:[ "D"、 "E"、 "F"]、スコア: "10-5"}
Vegar

回答:


6

最初に考慮すべきことは、これは何かカジュアルなことです。フロアボールのワールドカップのラウンドを決定するシステムを設計していません。片方の勝ちではなく、良いゲームを楽しむ人々のグループとのカジュアルなピックアップゲームです。

Googleがフーズボールオッズジェネレーターを持っていることを思い出します。これに関しては、私がやっていることよりもかなり多くの作業が行われました。その参考資料を探して、SOの記事と、Microsoftがxboxに使用しているTrue Skill計算機を見つけまし

より単純なアプローチを採用し、各プレイヤーはチームがゲームに対して持っているポイントの比率のスコアを取得します。ゲーム1では、プレーヤーAは1.25(10/8)、プレーヤーDは0.8ポイント(8/10)を獲得します。すべての数字の平均を見つけ、それがプレーヤーのスコアです。

説明されているゲームのセットについて、これは以下を提供します。

  A 1.42
  B 1.22
  C 0.72
  D 1.07
  E 1.27
  F 1.40
  G 2.50

この時点で、パーティションの問題と同様の問題が発生します。各チームには同じ人数のプレーヤーが必要であり、値は正確である必要はありません(ただし、できるだけ近い)という制約があります。


プレイヤーの数が同じ、または奇数のプレイヤーが表示された場合と同程度になります
;

パーティションの問題への参照をありがとう!あなたがロック、@ user40980
エリック

3

迅速で汚れたアプローチ:

すべてのプレーヤーのスコアを計算します。これは、プレーヤーが参加したサイドの合計ポイントを、参加したすべてのゲームのゲームの合計ポイントで割ったものです。その後、プレーヤーをスコアで並べ替えます。最初のプレーヤーをチームAに配置します。次に、各プレーヤーについて、半数のプレーヤーが1つのチームに参加するまで、最低スコアのチームに追加します。残りのすべてのプレーヤーは他のチームに参加します。


与えられた人々の組み合わせがまったく新しい場合でも、このアプローチはうまくいくかもしれません。
ベガー

より良くすることは、ナップザック問題の変形のように見えます。重みも関連する可能性があります-私の記憶では、最も重いプレーヤー(私)が常に最後に選ばれました。
Steve314

この貪欲なアプローチは、最適なソリューション
Radek

3

ベイジアン事前分布(pdf)などの厄介な世界を掘り下げたくない場合は、興味深いアプローチはすべてのプレイヤーに合計順序を割り当て(勝ち負け率、累積ポイントなどに基づいて)、次に分割することです次のようにパリティ機能を使用するチーム。

並べ替えられたプレーヤーのリスト(最高から最低)を取得し、インデックスの1ビットの数(0から開始)に基づいてチームを偶数と奇数に分けます。これにより、次の分布が得られます。

  • 0000(最高)-偶数
  • 0001-奇数
  • 0010-奇数
  • 0011-偶数
  • 0100-奇数
  • 0101-偶数
  • 0110-偶数
  • 0111-奇数

...等。

パリティ機能により、偶数チームのプレーヤーに対して、各チームのプレーヤー数が等しくなります。その後、交互に、奇数番号のプレーヤーの利点を一方のチームまたは他方のチームに与え、効果が時間の経過とともにバランスする傾向があるようにします。

この関数は、プレーヤーのスキルの分布がフラットな場合に最適に機能します。現実には、プレイヤースキルは「ランダム値の合計」分布、つまりガウス分布に従う傾向があります(ただし、TruSkillなどのシステムでは、この仮定のブランケットアプリケーションに注意してください)。

大きなスキルのギャップを補うために、このリストに順列を適用できます。たとえば、非常に強力なトッププレーヤー0000に対抗するために、プレーヤー0011を0100などの下位ランクの奇数プレーヤーと交換できます。絶対的なスキルの正確な測定が必要ですが、相対的なスキルに基づいた単純な順序付けが必要です。


2

時間に応じて、チームキャプテンをランダムに選択して最初の数セッションを開始し、各ゲームの前にドラフトを用意します。プレイヤーがどれを選ぶかを追跡します。以前のピックはより高い評価を得ます:

Round #1 = 8 pts, Round #2 = 6 pts, Round #3 = 4 pts, etc

Winning a game = 5 pts

これらはすべて、チームごとのプレーヤー数に依存します。合計点が参加に大きな相違がある場合、毎日またはゲーム平均値に変換する必要があるかもしれません。また、チームに大きな勝利のマージンを与えることもできます。

早く選ばれ、優勝チームでプレーしたプレーヤーは、最も多くのパワーポイントを獲得します。

次に、各チームのパワーポイントのバランスをとり、ほぼ同等の評価を持つチームを相互に配置することにより、コンピューターにドラフト(チームの選択)を実行させます。早く選ばれたが、負けたチームでプレーし続けているプレイヤーはランキングに落ちます。


素晴らしい答えです!これは平均的なチームには有効ですが、一部のチームは戦略的です。たとえば、チーム全体をディフェンダーにしたい場合は、全体的なプレイヤーがより高いラウンドに進むことになります。しかし、私は正規の:Pを要求しなかったと思います。ありがとう!
ダイナミック

それは開始するのに最適な方法です。最初の数ラウンドでは、チームスコアに基づくものは個別に適用されません。各ラウンドでチームメンバーが一緒にプレーするからです。
ロボットを取得

1

最も簡単な解決策は、推定スキルのグレード/ウェイトを提供し、各チームのスコアのバランスをとることです。

そこから、これらの値を使用してベイジアンネットワークにシードし、取得した履歴データの各マッチアップの観測結果に基づいて逆方向に推論できます。

私の興味のある点として、Infer.NETはこれを比較的簡単に想像し、実装することができます。また、チームの対戦で勝つ可能性を予測できます。Infer.NETは、私が本当に最近始めようとしているものです。


ほんの一握りのゲームしかないことを示す意味のある十分なデータがありますか?
ロボット

私はこれをjavascriptまたはrubyで解決したいと思っていましたが、とにかくinfer.netは面白そうです。
ベガー

@StevenBurnap:最初の推測がプレイヤーの能力に関してどれだけ良いか正確であるかに依存します-これはほとんどまたはすべてのシステムで行う必要があります。ネットワークを使用する利点は、時間の経過とともに各プレーヤーの新しいスコアを推測してその値を改善できることです。
スティーブンエバーズ

1

議論のために、各プレイヤーに整数値を割り当て、それらの値を合計できると仮定しましょう。つまり、スコアXのプレイヤーは、スコアA、B、Cの3人のプレイヤーと同じくらい価値があります。 X.目標は、グループを2つのチームに分け、両方のチームの合計値がほぼ等しくなるようにすることです。

これは、NP完全な有名なPARTITION問題の最適化バージョンです。したがって、あなたの問題は私たちが解決するの難しいと知っているすべてのものです。しかし、PARTITIONはNP完全ではなく、いくつかの合理的な近似戦略を認めています。

1つの例は、Stevenが提案するものと同様の貪欲なアプローチです。これは4/3の概算です。つまり、より強いチームは最適な分割よりも約33%以上強くなることはありません。

おそらく、チームごとに少なくとも一定量のプレーヤーが必要になるなど、追加の制約があることに注意してください。したがって、マイケルジョーダンを未就学児のクラスに入れた場合、フル数のほぼ公平なチームを作成することはできません。このような(一定の)チームサイズの下限は、根本的な問題の難易度に影響を与えるべきではありませんが、一般的な問題に有効な近似境界を破壊する可能性があります。


1
体育館の床にはあまり多くの選手を入れることができません。最大20人のプレイヤーで、片側に10人がいると仮定すると、チェックする組み合わせは92378のみです。しかし、組み合わせの数が徹底的な検索を非実用的にするまで、それほど多くのプレーヤーは必要ありません。
ケビンクライン

@kevincline:そうです。私は暗黙のうちにブルートフォースはオプションではないと仮定しました(そうでなければ、なぜ尋ねるのですか?)。
ラファエル

各チームに6人以上の人がいることはありません。より頻繁に4。
e食

@Vegar:あなたの質問は、チームスコアを活用してプレーヤーの価値をモデル化する方法の方が多く、アルゴリズムについてではありませんか?
ラファエル

1
才能によって人々を正確に採点する方法を理解できない限り、アルゴリズムの精度はおそらくそれほど重要ではありません。問題が手元にあるので、チームスコアといくつかのトライアルしかありません。プレーヤーの評価は、予想外のものになります。
ロボット

0

あなたはどのようにばかげたいですか?常に複数の線形回帰を使用して、以前のゲームのチームのスコアに基づいて各プレーヤーの係数を生成できます。次に、リストをソートして選択します。

現実には、プレーヤー間のダイナミックをモデル化していないため、おそらく機能しませんが、Rをいじる理由がわかります。(<-参照してください、私はそれをプログラミング関連に保ちました)


1
週に2回2分間のタスクを回避するアプリケーションを作成することを検討しており、将来の計算のために結果の記録にほぼ同じ時間を費やすことを余儀なくされています。とてもばかげていると思います
...-Vegar

-1

アルゴリズムを合理的にしたい場合、単純なアルゴリズムではそれを削減できません。彼らはしばしばあなたに奇妙な結果を与えます

ELOやTrueskillシステムのようなものを使用する必要があります(ただし、ELOは変更しないとチームには機能しません)。


1
これは真実ではありません。機能するアルゴリズムが必要です。
ダイナミック
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.