20
戦略的投票、ゲーム
単一勝者選挙の最も一般的な投票システムの1つは、複数投票方法です。簡単に言えば、投票数が最も多い候補者が勝ちます。しかし、複数の投票は数学的には不健全であり、有権者が本当に好む候補者とは対照的に、「2つの悪の少ない方」に投票するように駆り立てられる状況を作り出しがちです。 このゲームでは、複数投票システムを活用するプログラムを作成します。選挙で3人の候補者の1人に投票します。各候補者は、あなた自身の特定の見返りに関連付けられており、あなたの目標は、期待される見返りを最大化することです。 ペイオフはランダムに「均一に」分配され、選挙ごとに変更され、100に加算されます。候補者Aはペイオフ40、候補者Bはペイオフ27、候補者Cはペイオフ33を持ちます。 投票する番になると、情報が不完全になります。以下は、利用できる情報です。他のプレイヤーの個々のペイオフが何であるか分からないので、現在の投票結果を考慮して彼らがどのように投票するかを予測するのはあなたの挑戦です。 これまでの選挙の部分的な結果 まだ投票していない参加者(自分を除く)の数 各候補者の個人的な報酬 各候補者の合計グループペイオフ 各プレイヤーに投票の機会が与えられた後、最も投票数の多い候補者が複数の投票に従って勝ちます。各プレイヤーは、その候補者からのペイオフに対応するポイント数を受け取ります。票に同点がある場合、割り当てられるポイントの数は、同点の候補者の平均になります。 トーナメント構造 最初にインスタンス化されると、参加者にはトーナメントで行われた選挙の回数が通知されます。私は非常に多くの選挙を実施しようとします。その後、各選挙は1つずつ実施されます。 参加者がシャッフルされた後、それぞれに投票の順番が与えられます。彼らは上記の限られた情報を与えられ、彼らの投票を意味する数を返します。各選挙が終わると、各ボットに最終的な投票結果が与えられ、その選挙から得点が上がります。 勝利した参加者は、多数の選挙が行われた後、合計スコアが最も高い参加者になります。また、コントローラーは、そのスコアをランダム投票ボットについて予測されたスコア分布と比較することにより、各競技者の「正規化された」スコアを計算します。 提出の詳細 提出は、Java 8クラスの形式を取ります。 各参加者は、次のインターフェイスを実装する必要があります。 public interface Player { public String getName(); public int getVote(int [] voteCounts, int votersRemaining, int [] payoffs, int[] totalPayoffs); public void receiveResults(int[] voteCounts, double result); } コンストラクターはintパラメーターとして1つを取る必要があります。これは、行われる選挙の数を表します。 このgetName()メソッドは、リーダーボードで使用される名前を返します。これにより、適切に書式設定された名前を使用できます。 getVote(...)メソッドが返す0、1または2投票を受け取ることになりますどの候補意味します。 このreceiveResults(...)方法は、主に履歴データを使用するより複雑な戦略の存在を可能にすることです。 与えられた情報を記録および処理する他のメソッド/インスタンス変数を作成することができます。 トーナメントサイクル、拡張 参加者はそれぞれでインスタンス化されnew …