Một trong những hệ thống bỏ phiếu phổ biến nhất cho các cuộc bầu cử một người chiến thắng là phương thức bỏ phiếu đa số. Nói một cách đơn giản, ứng cử viên có nhiều phiếu nhất sẽ chiến thắng. Tuy nhiên, bỏ phiếu đa số là không chắc chắn về mặt toán học và có khả năng tạo ra các tình huống trong đó các cử tri bị buộc phải bỏ phiếu cho "ít tệ hơn hai tệ nạn" trái ngược với ứng cử viên họ thực sự thích.
Trong trò chơi này, bạn sẽ viết chương trình tận dụng hệ thống bỏ phiếu đa số. Nó sẽ bỏ phiếu cho một trong ba ứng cử viên trong một cuộc bầu cử. Mỗi ứng viên được liên kết với một mức chi trả nhất định cho chính bạn và mục tiêu của bạn là tối đa hóa mức chi trả dự kiến của bạn.
Số tiền chi trả được phân bổ ngẫu nhiên "đồng đều", thay đổi theo từng cuộc bầu cử và thêm vào 100. Ứng cử viên A có thể có số tiền thưởng 40, Ứng viên B có thể có khoản chi trả 27 và Ứng viên C có thể có số tiền chi trả 33. Mỗi người chơi có một bộ số tiền chi trả khác nhau.
Khi đến lượt bạn bỏ phiếu, bạn sẽ có thông tin không đầy đủ. Dưới đây là thông tin mà bạn sẽ có sẵn cho bạn. Vì bạn không biết mức chi trả cá nhân của người chơi khác là gì, sẽ là thách thức của bạn để dự đoán cách họ sẽ bỏ phiếu cho kết quả cuộc thăm dò hiện tại.
- Kết quả một phần của cuộc bầu cử cho đến nay
- Số lượng người đăng ký (không bao gồm chính bạn), người chưa bỏ phiếu
- Tiền thưởng cá nhân của bạn cho mỗi ứng cử viên
- Tổng số tiền chi trả cho mỗi ứng cử viên
Sau khi mỗi người chơi đã có cơ hội bỏ phiếu, ứng cử viên có nhiều phiếu nhất sẽ chiến thắng theo tỷ lệ bỏ phiếu đa số. Mỗi người chơi sau đó nhận được số điểm tương ứng với mức thưởng của họ từ ứng cử viên đó. Nếu có một sự ràng buộc trong phiếu bầu, thì số điểm được chỉ định sẽ là trung bình của các ứng cử viên bị ràng buộc.
Cơ cấu giải đấu
Khi lần đầu tiên được thông báo, người đăng ký sẽ được cho biết số lượng cuộc bầu cử được tổ chức trong giải đấu. Tôi sẽ cố gắng để chạy một số lượng lớn các cuộc bầu cử. Sau đó, mỗi cuộc bầu cử sẽ được tiến hành từng cái một.
Sau khi những người tham gia được xáo trộn, mỗi người được lần lượt bỏ phiếu. Họ được cung cấp thông tin hạn chế được liệt kê ở trên và trả về một số biểu thị phiếu bầu của họ. Sau khi mỗi cuộc bầu cử kết thúc, mỗi bot được đưa ra kết quả thăm dò cuối cùng và số điểm của họ tăng lên từ cuộc bầu cử đó.
Người chiến thắng sẽ là người có tổng số điểm cao nhất sau khi một số lượng lớn các cuộc bầu cử đã được tổ chức. Bộ điều khiển cũng tính điểm "bình thường hóa" cho mỗi thí sinh bằng cách so sánh điểm của nó với phân phối điểm được dự đoán cho một bot bỏ phiếu ngẫu nhiên.
Chi tiết nộp
Đệ trình sẽ có dạng các lớp Java 8. Mỗi người đăng ký phải thực hiện giao diện sau:
public interface Player
{
public String getName();
public int getVote(int [] voteCounts, int votersRemaining, int [] payoffs, int[] totalPayoffs);
public void receiveResults(int[] voteCounts, double result);
}
- Nhà xây dựng của bạn nên lấy một
int
tham số làm tham số, sẽ đại diện cho số lượng các cuộc bầu cử sẽ được tổ chức. - Các
getName()
phương thức trả về tên được sử dụng trên bảng. Điều này cho phép bạn có những cái tên được định dạng độc đáo, đừng phát điên. - Các
getVote(...)
trở về phương pháp0
,1
hoặc2
để biểu thị mà ứng cử viên sẽ nhận được phiếu bầu. - Các
receiveResults(...)
phương pháp chủ yếu là để cho phép sự tồn tại của chiến lược phức tạp hơn sử dụng dữ liệu lịch sử. - Bạn được phép tạo ra khá nhiều biến phương thức / thể hiện khác mà bạn muốn ghi lại và xử lý thông tin được cung cấp cho bạn.
Chu kỳ giải đấu, mở rộng
- Những người tham gia được mỗi ngay lập tức với
new entrantName(int numElections)
. - Đối với mỗi cuộc bầu cử:
- Bộ điều khiển xác định ngẫu nhiên số tiền chi trả cho mỗi người chơi cho cuộc bầu cử này. Mã cho điều này được đưa ra dưới đây. Sau đó, nó xáo trộn người chơi và bắt họ bỏ phiếu.
- Phương pháp này của dự thi
public int getVote(int [] voteCounts, int votersRemaining, int [] payoffs, int[] totalPayoffs)
được gọi, và người dự thi trả về bỏ phiếu của họ0
,1
hoặc2
cho các ứng cử viên mà họ lựa chọn. - Những người tham gia có
getVote(...)
phương thức không trả lại phiếu bầu hợp lệ sẽ được chỉ định một phiếu bầu ngẫu nhiên. - Sau khi mọi người đã bỏ phiếu, kiểm soát viên xác định kết quả bầu cử bằng phương pháp đa số.
- Những người tham gia được thông báo về số phiếu bầu cuối cùng và mức chi trả của họ bằng cách gọi phương thức của họ
public void receiveResults(int[] voteCounts, double result)
.
- Sau khi tất cả các cuộc bầu cử đã được tổ chức, người chiến thắng là người có số điểm cao nhất.
Phân phối ngẫu nhiên của tiền chi trả
Việc phân phối chính xác sẽ có ảnh hưởng đáng kể đến lối chơi. Tôi đã chọn một phân phối có độ lệch chuẩn lớn (khoảng 23,9235) và có khả năng tạo ra cả hai mức chi trả rất cao và rất thấp. Tôi đã kiểm tra rằng mỗi trong số ba khoản chi trả có phân phối giống hệt nhau.
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;
}
Thêm quy tắc
Dưới đây là một số quy tắc tổng quát hơn.
- Chương trình của bạn không được chạy / sửa đổi / khởi tạo bất kỳ phần nào của bộ điều khiển hoặc những người tham gia khác hoặc ký ức của họ.
- Vì chương trình của bạn vẫn "trực tiếp" cho toàn bộ giải đấu, không tạo bất kỳ tệp nào.
- Không tương tác với, giúp đỡ hoặc nhắm mục tiêu bất kỳ chương trình nào khác.
- Bạn có thể gửi nhiều người đăng ký, miễn là họ khác nhau một cách hợp lý và miễn là bạn tuân theo các quy tắc trên.
- Tôi chưa chỉ định giới hạn thời gian chính xác, nhưng tôi sẽ đánh giá rất cao thời gian chạy ít hơn đáng kể so với một giây trên mỗi cuộc gọi. Tôi muốn có thể điều hành càng nhiều cuộc bầu cử càng khả thi.
Bộ điều khiển
Bộ điều khiển có thể được tìm thấy ở đây . Chương trình chính là Tournament.java
. Ngoài ra còn có hai bot đơn giản, sẽ cạnh tranh, có tiêu đề RandomBot
và PersonalFavoriteBot
. Tôi sẽ đăng hai bot này trong một câu trả lời.
Bảng xếp hạng
Có vẻ như ExpectantBot là nhà lãnh đạo hiện tại, tiếp theo là Monte Carlo và sau đó là 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.
Dưới đây là một số giải đấu cũ hơn, nhưng không có bot nào thay đổi chức năng kể từ khi những lần chạy này.
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.
Tôi cũng đã chạy một giải đấu 10m thứ hai, xác nhận sự dẫn đầu của 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
một số lượng tất cả các phiếu. Tôi có đúng không?