Tek kazanan seçimler için en yaygın oylama sistemlerinden biri, çoğulculuk oylama yöntemidir. Basitçe söylemek gerekirse, en çok oy alan aday kazanır. Ancak çoğulculuk oylaması matematiksel olarak sağlam değildir ve seçmenlerin gerçekten tercih ettikleri adayın aksine "iki kötülüğün altında oyu" için oy kullanmaya zorlandığı durumlar yaratmakla yükümlüdür.
Bu oyunda, çoğul oy kullanma sisteminden yararlanan bir program yazacaksınız. Bir seçimdeki üç adaydan birine oy verecek. Her aday kendiniz için belirli bir ödeme ile ilişkilidir ve amacınız beklenen getirinizi en üst düzeye çıkarmaktır.
Kazançlar rasgele dağıtılır, her seçimde değişiklik yapılır ve 100'e eklenir. A adayı 40 kazanabilir, B adayı 27 kazanabilir ve C adayı 33 kazanabilir.
Oy verme sırası geldiğinde, eksik bilgileriniz olacaktır. Aşağıda listelenen, sizin için mevcut olacak bilgilerdir. Diğer oyuncuların bireysel kazançlarının ne olduğunu bilmediğinizden, mevcut anket sonuçları göz önüne alındığında nasıl oy kullanacaklarını tahmin etmek sizin göreviniz olacaktır.
- Şimdiye kadar yapılan seçimin kısmi sonuçları
- Henüz oy vermemiş olan katılımcı sayısı (kendin hariç)
- Her aday için kişisel kazancınız
- Her aday için toplam grup kazancı
Her oyuncuya oy kullanma şansı verildikten sonra, en fazla oy alan aday, çok oylamaya göre kazanır. Ardından her oyuncu, adayın kazancına karşılık gelen puan sayısını alır. Oylarda eşitlik varsa, atanan puanların sayısı bağlı adayların ortalaması olacaktır.
Turnuva Yapısı
İlk başlatıldığında, katılımcıya turnuvada yapılan seçim sayısı söylenir. Çok fazla sayıda seçim yapmaya çalışacağım. Daha sonra her seçim birer birer gerçekleştirilecektir.
Katılanlar karıştırıldıktan sonra, her birine oy kullanma sırası verilir. Yukarıda listelenen sınırlı bilgi verilir ve oylarını gösteren bir sayı verilir. Her seçim bittikten sonra, her botta son anket sonucu verilir ve puanları bu seçimden artar.
Çok sayıda seçim yapıldıktan sonra muzaffer giriş, toplam puanı en yüksek olanı olacak. Kontrolör ayrıca her yarışmacı için puanını rastgele oy veren bir bot için öngörülen puan dağılımıyla karşılaştırarak "normalize" bir puan hesaplar.
Gönderim Detayları
Gönderilenler, Java 8 sınıfı biçiminde olacaktır. Her katılımcının aşağıdaki arayüzü uygulaması gerekir:
public interface Player
{
public String getName();
public int getVote(int [] voteCounts, int votersRemaining, int [] payoffs, int[] totalPayoffs);
public void receiveResults(int[] voteCounts, double result);
}
- Yapıcınız
int
yapılacak seçimlerin sayısını temsil edecek bir parametre olarak tek almalıdır . getName()
Yöntem skor ile kullanılacak adı döndürür. Bu, güzel biçimlendirilmiş adlara sahip olmanıza izin verir, sadece delirmeyin.getVote(...)
Yöntem geri döndüğünde0
,1
ya2
oyu alması hangi aday göstermek için.receiveResults(...)
Yöntem, geçmiş verileri kullanarak daha karmaşık stratejiler varlığını sağlamak için esas olarak.- Size verilen bilgileri kaydetmek ve işlemek istediğiniz hemen hemen başka yöntemler / örnek değişkenleri yaratmanıza izin verilir.
Turnuva Döngüsü, Genişletilmiş
- Katılımcılar her biriyle somutlaştırıldı
new entrantName(int numElections)
. - Her seçim için:
- Kontrolör bu seçim için her oyuncu için kazancı rastgele belirler. Bunun için kod aşağıda verilmiştir. Daha sonra oyuncuları karıştırır ve oy vermeye başlar.
- Katılımcının yöntem
public int getVote(int [] voteCounts, int votersRemaining, int [] payoffs, int[] totalPayoffs)
çağrılır ve katılımcı kendi oyu verir0
,1
ya2
kendi seçtikleri aday için. getVote(...)
Yöntemi geçerli bir oylama yapmayan katılımcılara rastgele bir oy verilecek.- Herkes oy kullandıktan sonra, denetçi seçim sonuçlarını çokluk yöntemiyle belirler.
- Katılımcılar, son oylama sayıları ve yöntemlerini arayarak getirileri hakkında bilgilendirilir
public void receiveResults(int[] voteCounts, double result)
.
- Tüm seçimler yapıldıktan sonra, kazanan en yüksek puana sahip olandır.
Kazançların Rastgele Dağılımı
Kesin dağıtım oyun üzerinde önemli bir etkiye sahip olacaktır. Hem çok yüksek hem de çok düşük getiriler yaratabilen büyük bir standart sapma ile (yaklaşık 23.9235) bir dağıtım seçtim. Her üç kazancının da eşit bir dağılımı olduğunu kontrol ettim.
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;
}
Daha fazla kural
İşte daha genel kurallar.
- Programınız, denetleyicinin herhangi bir bölümünü veya diğer katılımcıları veya anılarını çalıştırmamalıdır / değiştirmemelidir.
- Programınız tüm turnuva için "canlı" kaldığından, hiçbir dosya oluşturmayın.
- Diğer katılımcı programlarla etkileşime girmeyin, yardım etmeyin veya hedeflemeyin.
- Sen olabilir sürece yukarıdaki kurallara uyun sürece onlar makul farklıdır olarak, çoklu girenleri göndermek, vb.
- Ben tam bir zaman sınırı belirtilmemiş, ama ben çok olan çalıştırıcıları takdir ediyorum anlamlı çağrı başına bir saniyeden az. Mümkün olduğu kadar çok seçim yapabilmek istiyorum.
Kontrol eden, denetleyici
Kontrolör burada bulunabilir . Ana program Tournament.java
. Ayrıca yarışacak, başlıklı RandomBot
ve iki basit bot var PersonalFavoriteBot
. Bu iki botu cevap olarak göndereceğim.
Liderler Sıralaması
Mevcut lider ExpectantBot gibi görünüyor, ardından Monte Carlo ve ardından StaBot geliyor.
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.
İşte bazı eski turnuvalar, ancak bu yarışlardan bu yana hiçbir robot işlevinde değişiklik yapmadı.
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.
Ayrıca ExpectantBot'un liderliğini doğrulayan ikinci bir 10 milyon turnuva yaptım.
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
, tüm oyların sayımını içeren bir oyundur. Doğrumuyum?