หนึ่งในระบบลงคะแนนที่ใช้กันมากที่สุดสำหรับการเลือกตั้งผู้ชนะเพียงคนเดียวคือวิธีการลงคะแนนส่วนใหญ่ เพียงแค่ใส่ผู้สมัครที่มีคะแนนโหวตมากที่สุดชนะ การออกเสียงลงคะแนนส่วนใหญ่ แต่เป็นคณิตศาสตร์ที่ไม่มั่นคงและมีแนวโน้มที่จะสร้างสถานการณ์ที่ผู้มีสิทธิเลือกตั้งจะถูกผลักดันให้ลงคะแนนให้ "น้อยกว่าสองชั่วร้าย" เมื่อเทียบกับผู้สมัครที่พวกเขาต้องการอย่างแท้จริง
ในเกมนี้คุณจะเขียนโปรแกรมที่ใช้ประโยชน์จากระบบการลงคะแนนส่วนใหญ่ มันจะลงคะแนนให้หนึ่งในสามของผู้สมัครในการเลือกตั้ง ผู้สมัครแต่ละคนมีความเกี่ยวข้องกับผลตอบแทนที่แน่นอนสำหรับตัวคุณเองและเป้าหมายของคุณคือเพิ่มผลตอบแทนที่คุณคาดหวังให้สูงสุด
ผลตอบแทนคือ "สม่ำเสมอ" กระจายสุ่มเปลี่ยนการเลือกตั้งในแต่ละครั้งและเพิ่ม 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(...)
วิธีเป็นหลักในการช่วยให้การดำรงอยู่ของกลยุทธ์ที่ซับซ้อนมากขึ้นที่ใช้ข้อมูลทางประวัติศาสตร์- คุณได้รับอนุญาตให้สร้างวิธี / ตัวแปรอินสแตนซ์อื่น ๆ ที่คุณต้องการบันทึกและประมวลผลข้อมูลที่คุณมอบให้
รอบการแข่งขันขยาย
- ผู้เข้าแต่ละ instantiated
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;
}
กฎเพิ่มเติม
ต่อไปนี้เป็นกฎทั่วไปที่เพิ่มเติม
- โปรแกรมของคุณจะต้องไม่เรียกใช้ / แก้ไข / สร้างอินสแตนซ์ส่วนใด ๆ ของคอนโทรลเลอร์หรือผู้เข้าร่วมอื่น ๆ หรือความทรงจำของพวกเขา
- เนื่องจากโปรแกรมของคุณยังคง "สด" ตลอดทัวร์นาเมนต์อย่าสร้างไฟล์ใด ๆ
- อย่าโต้ตอบช่วยเหลือหรือกำหนดเป้าหมายโปรแกรมผู้เข้าร่วมอื่น ๆ
- คุณอาจส่งผู้เข้าร่วมหลายคนตราบใดที่พวกเขาแตกต่างกันอย่างสมเหตุสมผลและตราบใดที่คุณปฏิบัติตามกฎข้างต้น
- ฉันยังไม่ได้ระบุกำหนดเวลาที่แน่นอน แต่ฉันจะขอบคุณมาก runtimes ที่มีอย่างมีนัยสำคัญน้อยกว่าที่สองต่อการโทร ฉันต้องการที่จะจัดการเลือกตั้งให้ได้มากที่สุด
ผู้ควบคุม
ควบคุมสามารถพบได้ที่นี่ 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.
ฉันยังใช้การแข่งขัน 10 ม. สองเพื่อยืนยันการเป็นผู้นำของ 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
นับประกอบด้วยคะแนนเสียงทั้งหมด ฉันถูกไหม?