単一勝者選挙の最も一般的な投票システムの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 entrantName(int numElections)
ます。 - 選挙ごとに:
- コントローラーは、この選挙の各プレーヤーのペイオフをランダムに決定します。このためのコードを以下に示します。次に、プレイヤーをシャッフルし、投票を開始させます。
- 参加者の方法が
public int getVote(int [] voteCounts, int votersRemaining, int [] payoffs, int[] totalPayoffs)
呼び出され、参加者は自分の投票を返す0
、1
または2
自分の好きな候補者のために。 getVote(...)
メソッドが有効な投票を返さない参加者には、ランダム投票が割り当てられます。- 全員が投票した後、コントローラーは複数の方法で選挙結果を決定します。
- 参加者は、メソッドを呼び出すことにより、最終投票数とその支払いを通知され
public void receiveResults(int[] voteCounts, double result)
ます。
- すべての選挙が行われた後、勝者は最高の得点を持つものです。
ペイオフのランダム分布
正確な分布は、ゲームプレイに大きな影響を持つことになります。標準偏差が大きい(約23.9235)分布を選択しました。これは、非常に高いペイオフと非常に低いペイオフの両方を作成することができます。3つのペイオフのそれぞれが同じ分布であることを確認しました。
public int[] createPlayerPayoffs()
{
int cut1;
int cut2;
do{
cut1 = rnd.nextInt(101);
cut2 = rnd.nextInt(101);
} while (cut1 + cut2 > 100);
int rem = 100 - cut1 - cut2;
int[] set = new int[]{cut1,cut2,rem};
totalPayoffs[0] += set[0];
totalPayoffs[1] += set[1];
totalPayoffs[2] += set[2];
return set;
}
その他のルール
以下は、より一般化されたルールです。
- プログラムは、コントローラーまたは他の参加者またはその記憶の一部を実行/変更/インスタンス化してはなりません。
- プログラムはトーナメント全体で「ライブ」のままなので、ファイルを作成しないでください。
- 他の参加プログラムと対話したり、助けたり、ターゲットにしたりしないでください。
- あなたは可能限り、あなたは上記の規則に従っている限り、彼らは合理的に異なっているように、複数の参加者を提出し、そして。
- 正確な時間制限を指定していませんが、呼び出しごとに1秒よりも大幅に短いランタイムを高く評価します。できるだけ多くの選挙を実施できるようにしたい。
コントローラー
コントローラはここにあります。 メインプログラムはTournament.java
です。競合する2つの単純なボットもRandomBot
ありPersonalFavoriteBot
ます。これら2つのボットを回答として投稿します。
リーダーボード
ExpectantBotが現在のリーダーで、Monte Carlo、StaBotがそれに続くようです。
Leaderboard - 20000000 elections:
767007688.17 ( 937.86) - ExpectantBot
766602158.17 ( 934.07) - Monte Carlo 47
766230646.17 ( 930.60) - StatBot
766054547.17 ( 928.95) - ExpectorBot
764671254.17 ( 916.02) - CircumspectBot
763618945.67 ( 906.19) - LockBot
763410502.67 ( 904.24) - PersonalFavoriteBot343
762929675.17 ( 899.75) - BasicBot
761986681.67 ( 890.93) - StrategicBot50
760322001.17 ( 875.37) - Priam
760057860.67 ( 872.90) - BestViableCandidate (2842200 from ratio, with 1422897 tie-breakers of 20000000 total runs)
759631608.17 ( 868.92) - Kelly's Favorite
759336650.67 ( 866.16) - Optimist
758564904.67 ( 858.95) - SometimesSecondBestBot
754421221.17 ( 820.22) - ABotDoNotForget
753610971.17 ( 812.65) - NoThirdPartyBot
753019290.17 ( 807.12) - NoClueBot
736394317.17 ( 651.73) - HateBot670
711344874.67 ( 417.60) - Follower
705393669.17 ( 361.97) - HipBot
691422086.17 ( 231.38) - CommunismBot0
691382708.17 ( 231.01) - SmashAttemptByEquality (on 20000000 elections)
691301072.67 ( 230.25) - RandomBot870
636705213.67 ( -280.04) - ExtremistBot
The tournament took 34573.365419071 seconds, or 576.2227569845166 minutes.
古いトーナメントはいくつかありますが、これらの実行以降、どのボットも機能が変更されていません。
Leaderboard - 10000000 elections:
383350646.83 ( 661.14) - ExpectantBot
383263734.33 ( 659.99) - LearnBot
383261776.83 ( 659.97) - Monte Carlo 48
382984800.83 ( 656.31) - ExpectorBot
382530758.33 ( 650.31) - CircumspectBot
381950600.33 ( 642.64) - PersonalFavoriteBot663
381742600.33 ( 639.89) - LockBot
381336552.33 ( 634.52) - BasicBot
381078991.83 ( 631.12) - StrategicBot232
380048521.83 ( 617.50) - Priam
380022892.33 ( 617.16) - BestViableCandidate (1418072 from ratio, with 708882 tie-breakers of 10000000 total runs)
379788384.83 ( 614.06) - Kelly's Favorite
379656387.33 ( 612.31) - Optimist
379090198.33 ( 604.83) - SometimesSecondBestBot
377210328.33 ( 579.98) - ABotDoNotForget
376821747.83 ( 574.84) - NoThirdPartyBot
376496872.33 ( 570.55) - NoClueBot
368154977.33 ( 460.28) - HateBot155
355550516.33 ( 293.67) - Follower
352727498.83 ( 256.36) - HipBot
345702626.33 ( 163.50) - RandomBot561
345639854.33 ( 162.67) - SmashAttemptByEquality (on 10000000 elections)
345567936.33 ( 161.72) - CommunismBot404
318364543.33 ( -197.86) - ExtremistBot
The tournament took 15170.484259763 seconds, or 252.84140432938332 minutes.
また、ExpectantBotのリードを確認して、2回目の10メートルトーナメントを開催しました。
Leaderboard - 10000000 elections:
383388921.83 ( 661.65) - ExpectantBot
383175701.83 ( 658.83) - Monte Carlo 46
383164037.33 ( 658.68) - LearnBot
383162018.33 ( 658.65) - ExpectorBot
382292706.83 ( 647.16) - CircumspectBot
381960530.83 ( 642.77) - LockBot
381786899.33 ( 640.47) - PersonalFavoriteBot644
381278314.83 ( 633.75) - BasicBot
381030871.83 ( 630.48) - StrategicBot372
380220471.33 ( 619.77) - BestViableCandidate (1419177 from ratio, with 711341 tie-breakers of 10000000 total runs)
380089578.33 ( 618.04) - Priam
379714345.33 ( 613.08) - Kelly's Favorite
379548799.83 ( 610.89) - Optimist
379289709.83 ( 607.46) - SometimesSecondBestBot
377082526.83 ( 578.29) - ABotDoNotForget
376886555.33 ( 575.70) - NoThirdPartyBot
376473476.33 ( 570.24) - NoClueBot
368124262.83 ( 459.88) - HateBot469
355642629.83 ( 294.89) - Follower
352691241.83 ( 255.88) - HipBot
345806934.83 ( 164.88) - CommunismBot152
345717541.33 ( 163.70) - SmashAttemptByEquality (on 10000000 elections)
345687786.83 ( 163.30) - RandomBot484
318549040.83 ( -195.42) - ExtremistBot
The tournament took 17115.327209018 seconds, or 285.25545348363335 minutes.
Array
すべての票の数を含むものです。私は正しいですか?