单赢者选举最常见的投票系统之一是复数投票法。简而言之,得票最多的候选人获胜。但是,从数学上讲,多元投票是不合理的,并且容易造成选民被驱使投票赞成“两个邪恶中的较小者”,而不是他们真正喜欢的候选人。
在这个游戏中,您将编写利用多个投票系统的程序。它将在选举中为三名候选人之一投票。每个候选人都为自己带来一定的回报,而您的目标是使您的预期回报最大化。
收益是“均匀地”随机分布的,随每次选举而变化,并增加到100。候选人A可以拥有40收益,候选人B可以拥有27收益,候选人C可以拥有33收益。每个玩家都有一组不同的收益。
轮到您投票时,您将获得不完整的信息。下面列出的是您将可以使用的信息。由于您不知道其他玩家的个人收益是多少,因此根据当前的投票结果预测他们如何投票将是您的挑战。
- 到目前为止的部分选举结果
- 尚未投票的参与者(不包括您自己)的数量
- 您为每位候选人的个人收益
- 每个候选人的团体总收益
在给每个玩家投票的机会之后,投票最多的候选人将按照多次投票获胜。然后,每个玩家都会收到与该候选人的收益相对应的积分数。如果票数相等,则分配的分数将是并列候选人的平均值。
比赛结构
首次实例化时,将告知参赛者在锦标赛中举行的选举次数。我将尝试进行大量的选举。然后,每次选举将一一进行。
参加者洗牌后,每个人都有投票权。他们只能获得上面列出的有限信息,并返回一个数字表示他们的投票。每次选举结束后,将为每个漫游器提供最终的民意调查结果,并从该选举中增加其得分。
在举行了许多次选举之后,得奖者将是总分最高的人。控制器还通过将每个参赛者的得分与为随机投票机器人预测的得分分布进行比较来计算每个参赛者的“标准化”得分。
提交内容
提交将采用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
作为参数,该参数将代表将举行的选举次数。 - 该
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)的分布,并且该分布能够产生非常高和非常低的收益。我检查了三个收益中的每一个都有相同的分布。
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;
}
更多规则
这是一些更通用的规则。
- 您的程序不得运行/修改/实例化控制器或其他进入者或其记忆的任何部分。
- 由于您的程序在整个锦标赛中都保持“实时”运行,因此请勿创建任何文件。
- 请勿与其他任何参与程序互动,提供帮助或定位。
- 您可以提交多个参赛者,只要它们之间存在合理差异,并且您遵守上述规则即可。
- 我还没有指定一个确切的时间限制,但我将不胜感激那些运行时间显著低于每通话一秒钟。我希望能够举行尽可能多的选举。
控制器
控制器可以在这里找到。 主程序是Tournament.java
。还有两个简单的漫游器,分别为RandomBot
和竞争PersonalFavoriteBot
。我将在答案中发布这两个机器人。
排行榜
看起来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.
我还进行了第二次10m锦标赛,确认了ExpectantBot的领先优势。
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
包含所有票数的。我对么?