단일 당선자 선거를위한 가장 일반적인 투표 시스템 중 하나는 복수 투표 방법입니다. 간단히 말해, 가장 많은 표를 얻은 후보자가 승리합니다. 그러나 복수 투표는 수학적으로 건전하지 않으며 유권자들이 자신이 선호하는 후보자에 반대하여 "두 가지 악의 적은"투표를하게되는 상황을 만들게됩니다.
이 게임에서는 복수 투표 시스템을 활용하는 프로그램을 작성하게됩니다. 선거에서 3 명의 후보 중 하나에 투표 할 것입니다. 각 후보는 자신에 대한 특정 보수와 관련이 있으며 목표는 예상 보수를 극대화하는 것입니다.
후보는 "균일하게"무작위 배분되고 각 선거에 따라 변경되며 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.
또한 ExpectantBot의 리드를 확인하면서 두 번째 10m 토너먼트를 진행했습니다.
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
는 모든 투표 수를 포함합니다. 제가 맞습니까?