কৌশলগত ভোটদান, খেলা


37

একক-বিজয়ী নির্বাচনের জন্য সর্বাধিক সাধারণ ভোটদানের একটি হল বহুবচন ভোটদান পদ্ধতি। সহজ কথায় বলতে গেলে সর্বাধিক ভোটের প্রার্থী জয়লাভ করে। বহুত্ববোধ ভোটিংটি গাণিতিকভাবে নিরবচ্ছিন্ন এবং এমন পরিস্থিতি তৈরি করতে বাধ্য যে ভোটাররা তাদের সত্যিকারের প্রার্থীর বিপরীতে "দু'দুটির কম" পক্ষে ভোট দিতে পরিচালিত হয়।

এই গেমটিতে আপনি এমন প্রোগ্রাম লিখবেন যা বহুত্বের ভোটদান ব্যবস্থার সুযোগ নেয়। এটি নির্বাচনে তিনজন প্রার্থীর মধ্যে একজনকে ভোট দেবে। প্রতিটি প্রার্থী নিজের জন্য একটি নির্দিষ্ট পরিশোধের সাথে যুক্ত এবং আপনার লক্ষ্য আপনার প্রত্যাশিত শোধকে সর্বাধিক করে তোলা।

ভাতা "অবিশেষে" এলোমেলোভাবে, বিতরণ করা হয় প্রতিটি নির্বাচন দিয়ে পরিবর্তন এবং তা 100 প্রার্থী যোগ একজন 40 প্রতিদান হতে পারে প্রার্থী বি প্রতিদান 27 হতে পারে, এবং প্রার্থীদের সি 33. প্রতিদান প্রতিটি খেলোয়াড় ভাতা একটি ভিন্ন সেট আছে ফেলতে পারে।

যখন আপনার ভোট দেওয়ার পালা হবে তখন আপনার কাছে অসম্পূর্ণ তথ্য থাকবে। নীচে তালিকাভুক্ত তথ্য আপনার কাছে উপলব্ধ থাকবে। যেহেতু আপনি জানেন না যে অন্য খেলোয়াড়ের স্বতন্ত্র অর্থ প্রদানগুলি কী, তাই বর্তমান নির্বাচনের ফলাফলের ফলে তারা কীভাবে ভোট দেবে তা অনুমান করা আপনার চ্যালেঞ্জ হবে।

  • এখনও পর্যন্ত নির্বাচনের আংশিক ফলাফল
  • প্রবেশকারীদের সংখ্যা (নিজেকে বাদ দিয়ে), যারা এখনও ভোট দেয়নি
  • প্রতিটি প্রার্থীর জন্য আপনার ব্যক্তিগত পরিশোধ
  • প্রার্থীদের প্রত্যেকের জন্য মোট গ্রুপ পরিশোধ

প্রতিটি খেলোয়াড়কে ভোট দেওয়ার সুযোগ দেওয়ার পরে, সর্বাধিক ভোটের প্রার্থী বহুবচন ভোটদান অনুসারে জয়লাভ করে। তারপরে প্রতিটি খেলোয়াড় সেই পয়েন্টের সংখ্যা পান যা ওই প্রার্থীর কাছ থেকে তাদের পরিশোধের সাথে সামঞ্জস্য হয়। ভোটে যদি টাই থাকে, তবে নির্ধারিত পয়েন্টের সংখ্যাটি বাঁধা প্রার্থীদের গড় হবে।

টুর্নামেন্ট কাঠামো

প্রথম তাত্ক্ষণিকভাবে প্রবেশ করাতে, প্রবেশকারীকে টুর্নামেন্টে অনুষ্ঠিত নির্বাচনের সংখ্যা জানানো হবে। আমি অত্যন্ত সংখ্যক নির্বাচন পরিচালনা করার চেষ্টা করব। তারপরে, প্রতিটি নির্বাচন একের পর এক অনুষ্ঠিত হবে।

প্রবেশকারীদের রদবদল করার পরে, প্রত্যেককে ভোট দেওয়ার পালা দেওয়া হয়। তাদের উপরে তালিকাভুক্ত সীমিত তথ্য দেওয়া হবে এবং তাদের ভোটের ইঙ্গিত দিয়ে একটি নম্বর ফিরিয়ে দেওয়া হবে। প্রতিটি নির্বাচন শেষ হওয়ার পরে, প্রতিটি বটকে চূড়ান্ত জরিপের ফলাফল এবং সেই নির্বাচন থেকে তাদের স্কোর বৃদ্ধি দেওয়া হয়।

বিপুল সংখ্যক নির্বাচন অনুষ্ঠিত হওয়ার পরে বিজয়ী প্রবেশকারী সর্বোচ্চ স্কোরের সাথে এক হবে। নিয়ামক এলোমেলোভাবে ভোটদানের জন্য ভবিষ্যদ্বাণী করা স্কোর বন্টনের সাথে তার স্কোরকে তুলনা করে প্রতিটি প্রতিযোগীর জন্য একটি "নরমালাইজড" স্কোর গণনা করে।

জমা দেওয়ার বিবরণ

জমাগুলি জাভা 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(...)পদ্ধতি আরো জটিল কৌশল যে ঐতিহাসিক ডেটা ব্যবহার অস্তিত্ব সক্ষম করতে প্রধানত হয়।
  • আপনি প্রদত্ত তথ্য রেকর্ড করতে এবং প্রক্রিয়া করতে চান এমন কোনও অন্য পদ্ধতি / উদাহরণ ভেরিয়েবলগুলি তৈরি করতে আপনাকে অনুমোদিত allowed

টুর্নামেন্ট চক্র, প্রসারিত

  1. প্রবেশকারীদের প্রতিটি সঙ্গে তাত্ক্ষণিক হয় new entrantName(int numElections)
  2. প্রতিটি নির্বাচনের জন্য:
    1. নিয়ামক এলোমেলোভাবে এই নির্বাচনের জন্য প্রতিটি খেলোয়াড়ের প্রদানের পরিমাণ নির্ধারণ করে। এর জন্য কোডটি নীচে দেওয়া হল। তারপরে, এটি খেলোয়াড়দের বদলে দেয় এবং তাদের ভোটদান শুরু করে।
    2. প্রবেশক এর পদ্ধতি public int getVote(int [] voteCounts, int votersRemaining, int [] payoffs, int[] totalPayoffs)প্রার্থনা করা হয়, এবং প্রবেশক তাদের ভোট আয় 0, 1অথবা 2নিজেদের পছন্দের প্রার্থী।
    3. প্রবেশকারীদের getVote(...)পদ্ধতি যা বৈধ ভোট ফেরত দেয় না তাদের এলোমেলো ভোট দেওয়া হবে।
    4. সবাই ভোট দেওয়ার পরে, নিয়ামক বহুত্ব পদ্ধতিতে নির্বাচনের ফলাফল নির্ধারণ করে।
    5. প্রবেশকারীদের চূড়ান্ত ভোটের গণনা এবং তাদের পদ্ধতিটি কল করে তাদের পরিশোধের বিষয়ে অবহিত করা হয় public void receiveResults(int[] voteCounts, double result)
  3. সমস্ত নির্বাচন অনুষ্ঠিত হওয়ার পরে, বিজয়ী হ'ল সর্বোচ্চ স্কোর।

পেওফসের র্যান্ডম বিতরণ

সঠিক বন্টন গেমপ্লের উপর উল্লেখযোগ্য প্রভাব ফেলবে না। আমি একটি বড় স্ট্যান্ডার্ড বিচ্যুতি (প্রায় 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। আমি একটি উত্তরে এই দুটি বট পোস্ট করব।

লিডারবোর্ড

দেখে মনে হচ্ছে এক্সপ্যাক্ট্যান্টবট বর্তমান নেতা, তারপরে মন্টি কার্লো এবং তারপরে স্টাবট।

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.

এক্সপেক্টেন্টবটের নেতৃত্বের বিষয়টি নিশ্চিত করে আমি দ্বিতীয় দশ মিটার টুর্নামেন্টও চালিয়েছিলাম।

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সমস্ত ভোটের একটি গণনা। আমি কি সঠিক?
ইসমাইল মিগুয়েল

1
@ ইসমাইল মিগুয়েল হ্যাঁ
PhiNotPi

1
দ্বিতীয়. এগুলি হ'ল নির্বাচনের আংশিক ফলাফল, যা জনগণের দ্বারা পরিবর্তিত ক্রমে আপনার দ্বারা তৈরি ভোট।
ফিনটপি

2
আপনি যখন ভোটারদের একগুচ্ছ ক্লোন দিচ্ছেন তখন কী হবে তা আপনিও দেখতে চাইতে পারেন। সংক্ষিপ্ত নজরে, sometimesSecondBestBot, NoThirdPartyBot এ সব আশাবাদী বৃহত্তর ভোটিং পুল থেকে সুবিধা হবে বলে মনে হচ্ছে (নিজস্ব পথ, communismBot মধ্যে extremistBot এবং, কিন্তু যে কম গুরুত্বপূর্ণ)।
Saidoro

উত্তর:


10

NoThirdPartyBot

এই বটটি অনুমান করার চেষ্টা করে যে কোন প্রার্থী তৃতীয় হবেন, এবং তিনি যে প্রার্থীকে তিনি সেরা দুই প্রার্থীর মধ্যে সবচেয়ে ভাল পছন্দ করেছেন তাকে ভোট দেয়।

import java.util.Arrays;
import java.util.Collections;
import java.util.List;

public class NoThirdPartyBot implements Player {

    public NoThirdPartyBot(int e) {
    }


    @Override
    public String getName() {
        return "NoThirdPartyBot";
    }

    @Override
    public int getVote(int[] voteCounts, int votersRemaining, int[] payoffs,
            int[] totalPayoffs) {
        List<Integer> order = order(totalPayoffs);

        if (payoffs[order.get(0)] > payoffs[order.get(1)]) {
            return order.get(0);
        } else {
            return order.get(1);
        }
    }

    static List<Integer> order(int[] array) {
        List<Integer> indexes = Arrays.asList(0, 1, 2);
        Collections.sort(indexes, (i1, i2) -> array[i2] - array[i1]);
        return indexes;
    }

    @Override
    public void receiveResults(int[] voteCounts, double result) {
    }
}

CircumspectBot

এই বট তার পছন্দের পক্ষে ভোট দেয় যা গাণিতিকভাবে মুছে ফেলা হয়নি।

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;


public class CircumspectBot implements Player {

    public CircumspectBot(int elections) {
    }

    @Override
    public String getName() {
        return "CircumspectBot";
    }

    @Override
    public int getVote(int[] voteCounts, int votersRemaining, int[] payoffs,
            int[] totalPayoffs) {
        List<Integer> indexes = new ArrayList<>();
        int topVote = Arrays.stream(voteCounts).max().getAsInt();
        for (int index = 0; index < 3; index++) {
            if (voteCounts[index] + votersRemaining + 1 >= topVote) {
                indexes.add(index);
            }
        }
        Collections.sort(indexes, (i1, i2) -> payoffs[i2] - payoffs[i1]);

        return indexes.get(0);
    }

    @Override
    public void receiveResults(int[] voteCounts, double result) {

    }

}

4
আমি বাজেয়াজ করতাম সার্কামস্পেক্ট বট ব্যক্তিগত প্রিয় বটের চেয়ে কঠোরভাবে ভাল। খুশী হলাম।
isaacg

10

ExpectantBot

এই বটটি প্রতিটি ভোটদান বিকল্পের প্রত্যাশিত মানটি গণনা করে ধরে নেয় যে পরবর্তীকালে সমস্ত ভোটার এলোমেলোভাবে ভোট দেবেন।

import java.util.Arrays;

public class ExpectantBot implements Player {

    public ExpectantBot(int elections) {
    }

    @Override
    public String getName() {
        return "ExpectantBot";
    }

    static double choose(int x, int y) {
        if (y < 0 || y > x) return 0;
        if (y > x/2) {
            // choose(n,k) == choose(n,n-k), 
            // so this could save a little effort
            y = x - y;
        }

        double denominator = 1.0, numerator = 1.0;
        for (int i = 1; i <= y; i++) {
            denominator *= i;
            numerator *= (x + 1 - i);
        }
        return numerator / denominator;
    }

    double expectedPayout(int[] voteCounts, int[] payoffs, int votersRemaining) {
        double total = 0.0;
        for (int firstPartyVoters = 0; firstPartyVoters <= votersRemaining; firstPartyVoters++) {
            for (int secondPartyVoters = 0; secondPartyVoters <= votersRemaining - firstPartyVoters; secondPartyVoters++) {
                int thirdPartyVoters = votersRemaining - firstPartyVoters - secondPartyVoters;

                int [] newVoteCounts = voteCounts.clone();
                newVoteCounts[0] += firstPartyVoters;
                newVoteCounts[1] += secondPartyVoters;
                newVoteCounts[2] += thirdPartyVoters;
                int highest = Arrays.stream(newVoteCounts).max().getAsInt();
                int payoff = 0;
                int winCount = 0;
                for (int index = 0; index < 3; index++) {
                    if (newVoteCounts[index] == highest) {
                        payoff += payoffs[index];
                        winCount++;
                    }
                }
                double v = (double)payoff / (double) winCount;
                double value = choose(votersRemaining, firstPartyVoters)*choose(votersRemaining - firstPartyVoters, secondPartyVoters)*v*Math.pow(1/3.0, votersRemaining);
                total += value;
            }
        }
        return total;
    }

    @Override
    public int getVote(int[] voteCounts, int votersRemaining, int[] payoffs,
            int[] totalPayoffs) {

        int bestVote = 0;
        double bestScore = 0.0;
        for (int vote = 0; vote < 3; vote++) {      
            voteCounts[vote]++;
            double score = expectedPayout(voteCounts, payoffs, votersRemaining);
            if (score > bestScore) {
                bestVote = vote;
                bestScore = score;
            }
            voteCounts[vote]--;
        }
        return bestVote;

    }

    @Override
    public void receiveResults(int[] voteCounts, double result) {   
    }

}

অন্য প্রতিপক্ষের কাছ থেকে ভারী মেটাগেমিং না করে আমি যদি কেউ এই লোককে মারধর করে তবে আমি অবাক হই।
ডক্টরহেকল

@ ডক্টরহেকল, আমার স্ট্যাটবোটের আশা ছিল, তবে আমি মনে করি আপনি ঠিক বলেছেন।
উইনস্টন ইওয়ার্ট

9

HipBot

হিপবট অর্থ প্রদানের বিষয়ে চিন্তা করে না। অর্থ সত্যই শিল্পকর্ম যা সত্য শিল্প থেকে বিক্ষিপ্ত হয়।

HipBot কেউ ভোট দিতে চায় বাস্তব শুধুমাত্র কিছু কর্পোরেট শিল নয়, । তিনি তাদের (সম্ভবত) অবমাননাকর পরাজয়ের পরেও তাদের প্রচারণা শার্টটি পরতে চান, তাই যখনই বিজয়ীর কোনও ভুল ঘটে তখন তিনি নিজেকে শ্রেষ্ঠ মনে করেন।

অতএব, হিপবট সর্বনিম্ন ভোট প্রাপ্ত ব্যক্তির পক্ষে ভোট দেয় বা যদি টাই হয় তবে যে যার চেয়ে ভাল বেতন পাবে। কেবল জৈবিক খাবার খাওয়া বিনামূল্যে নয়।

public class HipBot implements Player{

    public HipBot(int rounds){ /*Rounds are a social construct*/ }

    public String getName(){ return "HipBot"; }

    public int getVote(int [] voteCounts, int votersRemaining, int [] payoffs, int[] totalPayoffs){

        int coolest = 0;
        int lowest = 100000000;
        int gains = 0;

        for( int count = 0; count < voteCounts.length; count++ ){

            if( voteCounts[count] < lowest || (voteCounts[count] == lowest && payoffs[count] > gains) ){

                lowest = voteCounts[count];
                coolest = count;
                gains = payoffs[count];

            }

        }

        return coolest;

    }

    public void receiveResults(int[] voteCounts, double result){ /*The past is dead*/ }

}

হিপবটটিও অনির্ধারিত, তাই কিছু চলছে কিনা তা আমাকে জানান।

সম্পাদনা: আরও প্রতিযোগিতামূলক টাইব্রেকিং যোগ, pithy মন্তব্য।


আমার জন্য কাজ করে, যদিও
লুজারের

5
সে মনে মনে জিতেছে, এবং তার পক্ষে,
এটিই

8

PersonalFavoriteBot

এই বটটি কেবলমাত্র সমস্ত কিছু উপেক্ষা করে সর্বোচ্চ ব্যক্তিগত পরিশোধের সাথে প্রার্থীকে ভোট দেয়। এই চ্যালেঞ্জের অন্যতম প্রধান বিষয় হ'ল কীভাবে এটি অনুকূল কৌশল নয় তা প্রদর্শন করা।

import java.lang.Math;
import java.util.Random;
/**
 * This bot picks the candidate with the highest personal payoff, ignoring everyone else's actions.
 * 
 * @author PhiNotPi 
 * @version 5/27/15
 */
public class PersonalFavoriteBot implements Player
{
    Random rnd;
    String name;
    /**
     * Constructor for objects of class PersonalFavoriteBot
     */
    public PersonalFavoriteBot(int e)
    {
       rnd = new Random(); 
       name = "PersonalFavoriteBot" + rnd.nextInt(1000);
    }

    public String getName()
    {
        return name;
    }

    public int getVote(int [] voteCounts, int votersRemaining, int [] payoffs, int[] totalPayoffs)
    {
        //return rnd.nextInt(3);
        int maxloc = 0;
        for(int i = 1; i< 3; i++)
        {
            if(payoffs[i] > payoffs[maxloc])
            {
                maxloc = i;
            }
        }
        return maxloc;
    }

    public void receiveResults(int[] voteCounts, double result)
    {

    }
}

RandomBot

এই বট এলোমেলোভাবে ভোট দেয়। নির্বাচনের সংখ্যা নির্বিশেষে (যতক্ষণ না এটি যুক্তিসঙ্গতভাবে বেশি, যতটা 100 এরও বেশি), এই প্রতিযোগীর স্বাভাবিক স্কোরটি -2 এবং 2 এর মধ্যে ওঠানামা করে।

import java.lang.Math;
import java.util.Random;
/**
 * This bot votes for a random candidate.
 * 
 * @author PhiNotPi 
 * @version 5/27/15
 */
public class RandomBot implements Player
{
    Random rnd;
    String name;
    /**
     * Constructor for objects of class RandomBot
     */
    public RandomBot(int e)
    {
       rnd = new Random(); 
       name = "RandomBot" + rnd.nextInt(1000);
    }

    public String getName()
    {
        return name;
    }

    public int getVote(int [] voteCounts, int votersRemaining, int [] payoffs, int[] totalPayoffs)
    {
        return rnd.nextInt(3);
    }

    public void receiveResults(int[] voteCounts, double result)
    {

    }
}

7

শিষ্য

অনুসরণকারী ফিট করতে চান It এটি সবার পক্ষে ভাগ করে নেওয়ার পক্ষে বা কমপক্ষে এখনও বহুবচন সহকারে ভোটদানের মাধ্যমে এটি সম্পাদন করার সর্বোত্তম উপায় thinks এটি কিছুটা স্বাধীনতা দেখানোর জন্য, নিজের পছন্দের দিকে সম্পর্ক ছিন্ন করবে। তবে খুব বেশি নয়।

public class Follower implements Player
{
    public Follower(int e) { }

    public String getName()
    {
        return "Follower";
    }

    public int getVote(int [] voteCounts, int votersRemaining, int [] payoffs, int[] totalPayoffs)
    {
        int mostPopular = 0;
        int mostVotes = voteCounts[0];
        for (int i = 1; i < voteCounts.length; i++) {
            int votes = voteCounts[i];
            if (votes > mostVotes || (votes == mostVotes && payoffs[i] > payoffs[mostPopular])) {
                mostPopular = i;
                mostVotes = votes;
            }
        }
        return mostPopular;

    }

    public void receiveResults(int[] voteCounts, double result) { }
}

দ্রষ্টব্য: আমি এটি পরীক্ষা করিনি, সুতরাং কোনও ত্রুটি আছে কিনা তা আমাকে জানান।


মনে হচ্ছে এটি কাজ করে।
PhiNotPi

4

মন্টে কার্লো

এটি প্রচুর পরিমাণে এলোমেলো নির্বাচনের অনুকরণ করে। এরপরে এটি এমন পছন্দ চয়ন করে যা সর্বাধিক নিজের লাভ করে।

import java.util.ArrayList;
import java.util.List;

public class MonteCarlo implements Player{

    private static long runs = 0;
    private static long elections = 0;

    public MonteCarlo(int e) {
        elections = e;
    }

    @Override
    public String getName() {
        return "Monte Carlo (difficulty " + (runs / elections) + ")";
    }

    @Override
    public int getVote(int[] voteCounts, int votersRemaining, int[] payoffs, int[] totalPayoffs) {
        elections++;
        double[] predictedPayoffs = new double[3];
        long startTime = System.nanoTime();
        while (System.nanoTime() - startTime <= 200_000){ //Let's give us 200 micro-seconds.
            runs++;
            int[] simulatedVoteCounts = voteCounts.clone();
            for (int j = 0; j < votersRemaining; j++){
                simulatedVoteCounts[((int) Math.floor(Math.random() * 3))]++;
            }
            for (int j = 0; j < 3; j++) {
                simulatedVoteCounts[j]++;
                List<Integer> winners = new ArrayList<>();
                winners.add(0);
                for (int k = 1; k < 3; k++) {
                    if (simulatedVoteCounts[k] > simulatedVoteCounts[winners.get(0)]) {
                        winners.clear();
                        winners.add(k);
                    } else if (simulatedVoteCounts[k] == simulatedVoteCounts[winners.get(0)]) {
                        winners.add(k);
                    }
                }
                for (int winner : winners) {
                    predictedPayoffs[j] += payoffs[winner] / winners.size();
                }
                simulatedVoteCounts[j]--;
            }
        }
        int best = 0;
        for (int i = 1; i < 3; i++){
            if (predictedPayoffs[i] > predictedPayoffs[best]){
                best = i;
            }
        }
        return best;
    }

    @Override
    public void receiveResults(int[] voteCounts, double result) {

    }
}

4

StatBot

স্ট্যাটবট এক্সপ্যাক্ট্যান্টবটের উপর ভিত্তি করে; তবে, প্রতিটি ভোট সমানভাবে সম্ভাব্য বলে ধরে নেওয়ার পরিবর্তে এটি জনগণ কীভাবে ভোট দেয় তার পরিসংখ্যান সংগ্রহ করে এবং সম্ভাব্যতাটি অনুমান করার জন্য এটি ব্যবহার করে।

import java.util.Arrays;


public class StatBot implements Player {

    static private int[][][] data = new int[3][3][3];
    private int[] voteCounts;

    StatBot(int unused) {

    }

    @Override
    public String getName() {
        return "StatBot";

    }

     static double choose(int x, int y) {
            if (y < 0 || y > x) return 0;
            if (y > x/2) {
                // choose(n,k) == choose(n,n-k), 
                // so this could save a little effort
                y = x - y;
            }

            double denominator = 1.0, numerator = 1.0;
            for (int i = 1; i <= y; i++) {
                denominator *= i;
                numerator *= (x + 1 - i);
            }
            return numerator / denominator;
        }

    double expectedPayout(int[] voteCounts, int[] payoffs, int votersRemaining) {
        Integer[] indexes = {0, 1, 2};
        Arrays.sort(indexes, (i0, i1) -> voteCounts[i1] - voteCounts[i0]);
        int [] stats = data[indexes[0]][indexes[1]];
        int total_stats = Arrays.stream(stats).sum();
        double total = 0.0;
        for (int firstPartyVoters = 0; firstPartyVoters <= votersRemaining; firstPartyVoters++) {
            for (int secondPartyVoters = 0; secondPartyVoters <= votersRemaining - firstPartyVoters; secondPartyVoters++) {
                int thirdPartyVoters = votersRemaining - firstPartyVoters - secondPartyVoters;

                int [] newVoteCounts = voteCounts.clone();
                newVoteCounts[0] += firstPartyVoters;
                newVoteCounts[1] += secondPartyVoters;
                newVoteCounts[2] += thirdPartyVoters;
                int highest = 0;
                for (int h : newVoteCounts) {
                    if (h > highest) highest = h;
                }
                int payoff = 0;
                int winCount = 0;
                for (int index = 0; index < 3; index++) {
                    if (newVoteCounts[index] == highest) {
                        payoff += payoffs[index];
                        winCount++;
                    }
                }
                double v = (double)payoff / (double) winCount;
                double value = choose(votersRemaining, firstPartyVoters)*choose(votersRemaining - firstPartyVoters, secondPartyVoters)*v;
                value *= Math.pow((double)stats[0]/(double)total_stats, firstPartyVoters);
                value *= Math.pow((double)stats[1]/(double)total_stats, secondPartyVoters);
                value *= Math.pow((double)stats[2]/(double)total_stats, thirdPartyVoters);

                total += value;
            }
        }
        return total;
    }

    @Override
    public int getVote(int[] voteCounts, int votersRemaining, int[] payoffs,
            int[] totalPayoffs) {

        int bestVote = 0;
        double bestScore = 0.0;
        for (int vote = 0; vote < 3; vote++) {      
            voteCounts[vote]++;
            double score = expectedPayout(voteCounts, payoffs, votersRemaining);
            if (score > bestScore) {
                bestVote = vote;
                bestScore = score;
            }
            voteCounts[vote]--;
        }
        voteCounts[bestVote]++;
        this.voteCounts = voteCounts;

        return bestVote;

    }

    @Override
    public void receiveResults(int[] endVoteCounts, double result) {
        Integer[] indexes = {0, 1, 2};
        Arrays.sort(indexes, (i0, i1) -> voteCounts[i1] - voteCounts[i0]);
        for(int i = 0; i < 3; i++){
            data[indexes[0]][indexes[1]][i] += endVoteCounts[i] - voteCounts[i];
        }
    }
}

4

সেরা সম্ভাব্য প্রার্থী

বেশিরভাগই আমার মূল জমাটির ভারী সংশোধিত সংস্করণ। এটি এখনও এমন কোনও প্রার্থীকে অপসারণ করে যা বাকী ভোট দেওয়ার পরে জিততে পারে না, তবে এরপরে এমন একটি কৌশল ব্যবহার করে যা পরম ভোটের চেয়ে আপেক্ষিক পেওফটিকে অনুকূল করার চেষ্টা করে । প্রথম পরীক্ষাটি হ'ল আমার ব্যক্তিগত বেতন-হারের অনুপাতটি প্রতিটি পরীক্ষার্থীর সামগ্রিক পে-অফে নেওয়া, সেখানে সর্বোত্তম মানের সন্ধান করা। আমি তখন অন্যান্য অনুপাতগুলির সন্ধান করি যা সবচেয়ে ভালের খুব কাছাকাছি থাকে এবং যদি এমন একটি থাকে যা খুব ভালের চেয়ে কম সামগ্রিক পেওফ থাকে তবে আমি তার পরিবর্তে সেইটিকেই বাছাই করি। আশা করি এটি আমার খেলোয়াড়কে যথাযথভাবে উঁচু রেখে অন্য খেলোয়াড়দের বেতন হ্রাস করবে।

এই বটটি প্রায় আমার নিজস্ব পরীক্ষায় মূল হিসাবে কাজ করে তবে বেশ নয়। এটি পুরো ফিল্ডের বিরুদ্ধে কীভাবে কাজ করে তা আমাদের দেখতে হবে।

 /**
  * This bot picks the candidate with the highest relative payoff out of those
  * candidates who are not already mathematically eliminated.
  *
  * @author Ralph Marshall
  * @version 5/28/2015
  */

import java.util.List;
import java.util.ArrayList;


public class BestViableCandidate implements Player
{
    private static int NUM_CANDIDATES = 3;
    private int relativeCount = 0;
    private int relativeCountLowerTotal = 0;
    private int totalRuns;

    public BestViableCandidate(int r) {
        totalRuns = r;
    }

    public String getName() {
        return "BestViableCandidate (" + relativeCount + " from ratio, with " + relativeCountLowerTotal + " tie-breakers of " + totalRuns + " total runs)";
    }

    public int getVote(int [] voteCounts, int votersRemaining, int [] payoffs, int[] totalPayoffs) {

        int i, maxVoteSoFar = 0;

        // First we figure out the maximum possible number of votes each candidate would get
        // if every remaining bot voted for it
        int [] maxPossibleVotes = new int[NUM_CANDIDATES];
        for (i = 0; i < NUM_CANDIDATES; i++) {

            // The voters remaining does not include me, so we need to add one to it
            maxPossibleVotes[i] = voteCounts[i] + votersRemaining + 1;

            if (voteCounts[i] > maxVoteSoFar) {
                maxVoteSoFar = voteCounts[i];
            }
        }

        // Then we throw out anybody who cannot win even if they did get all remaining votes
        List<Integer> viableCandidates = new ArrayList<Integer>();
        for (i = 0; i < NUM_CANDIDATES; i++) {
            if (maxPossibleVotes[i] >= maxVoteSoFar) {
                viableCandidates.add(Integer.valueOf(i));
            }
        }

        // And of the remaining candidates we pick the one that has the personal highest payoff
        // relative to the payoff to the rest of the voters
        int maxCandidate = -1;
        double maxRelativePayoff = -1;
        int maxPayoff = -1;
        int minTotalPayoff = Integer.MAX_VALUE;

        int originalMaxCandidate = -1;
        double originalMaxPayoff = -1;

        double DELTA = 0.01;

        double tiebreakerCandidate = -1;

        for (Integer candidateIndex : viableCandidates) {
            double relativePayoff = (double) payoffs[candidateIndex] / (double) totalPayoffs[candidateIndex];
            if (maxRelativePayoff < 0 || relativePayoff - DELTA > maxRelativePayoff) {
                maxRelativePayoff = relativePayoff;
                maxCandidate = candidateIndex;

                maxPayoff = payoffs[candidateIndex];
                minTotalPayoff = totalPayoffs[candidateIndex];

            } else if (Math.abs(relativePayoff - maxRelativePayoff) < DELTA) {
                if (totalPayoffs[candidateIndex] < minTotalPayoff) {
                    tiebreakerCandidate = candidateIndex;

                    maxRelativePayoff = relativePayoff;
                    maxCandidate = candidateIndex;

                    maxPayoff = payoffs[candidateIndex];
                    minTotalPayoff = totalPayoffs[candidateIndex];

                }
            }

            if (payoffs[candidateIndex] > originalMaxPayoff) {
                originalMaxPayoff = payoffs[candidateIndex];
                originalMaxCandidate = candidateIndex;
            }
        }

        if (tiebreakerCandidate == maxCandidate) {
            relativeCountLowerTotal++;
        }

        if (originalMaxCandidate != maxCandidate) {
            /*                System.out.printf("%nSelecting candidate %d with relative payoff %f (%d/%d) instead of %d with relative payoff %f (%d/%d)%n",
                              maxCandidate, (double) payoffs[maxCandidate]/(double)totalPayoffs[maxCandidate], payoffs[maxCandidate], totalPayoffs[maxCandidate],
                              originalMaxCandidate, (double) payoffs[originalMaxCandidate]/(double)totalPayoffs[originalMaxCandidate], payoffs[originalMaxCandidate], totalPayoffs[originalMaxCandidate]);
            */
            relativeCount++;
        }

        return maxCandidate;
    }
}

1
এটি কি একইরকম নয় CircumspectBot?
TheNumberOne

হ্যাঁ, দেখা যাচ্ছে যে এটি; আমি মুখ্য প্রশ্নে এ বিষয়ে একটি মন্তব্য করেছি। আমি যখন এটি কোডিং শুরু করলাম তখন বুঝতে পারিনি যে সে কীভাবে কাজ করে। যেহেতু সার্কামস্পেক্টবোটটি প্রথমে লেখা হয়েছিল এটি স্পষ্টভাবে ধারণাটির কৃতিত্ব পাওয়া উচিত।
রাল্ফ মার্শাল

আমি মনে করি আপনি আপনার ক্লাসের শেষ মিস করছেন।
উইনস্টন ইওয়ার্ট

ধন্যবাদ। আমি শেষ বন্ধনী হারিয়েছি; সেখানে যা ছিল তার পরে অন্য কোনও কোড ছিল না।
র‌্যাল্ফ মার্শাল

3

আশাবাদী

আশাবাদী অত্যন্ত আশাবাদী এবং ধরে নিয়েছেন যে বাকী ভোটারদের অর্ধেকই সেই প্রার্থীকে ভোট দেবেন যা এটিকে সেরা বেতন প্রদান করবে।

import java.lang.Integer;
import java.lang.String;
import java.util.Arrays;
import java.util.Comparator;

public class Optimist implements Player
{
    public Optimist(int _) { }
    public String getName() { return "Optimist"; }
    public int getVote(int[] curVotes, int rem, final int[] payoffs, int[] _)
    {
        Integer[] opt = new Integer[] { 0, 1, 2 };
        Arrays.sort(opt, new Comparator<Integer>() { public int compare(Integer i1, Integer i2) { return payoffs[i1] > payoffs[i2] ? -1 : payoffs[i1] == payoffs[i2] ? 0 : 1; } });
        int a = curVotes[opt[0]], b = curVotes[opt[1]], c = curVotes[opt[2]];
        double rest = (double)rem / 4;
        if (b <= a + rest && c <= a + rest)
            return opt[0];
        else if (c <= b)
            return opt[1];
        else
            return opt[0];
    }
    public void receiveResults(int[] _, double __) { }
}

3

ABotDoNotForget

তার লক্ষ্যটি সহজ: মোট বেতনগুলি ব্যবহার করে সামগ্রিক প্রবণতাগুলি নির্ধারণ করে এবং নিম্ন / মাঝারি / উচ্চতর কতগুলি জয়ী হয়েছিল তার সংখ্যা গণনা করে। তারপরে তিনি যা জয়ের সম্ভাবনা সবচেয়ে বেশি তার পক্ষে ভোট দেবেন।

import java.util.ArrayList;

public class ABotDoNotForget implements Player
{
    private int nbElec;
    private int countElec=0;
    private int[] currPayoffs=new int[3];
    private int[] lmh=new int[3];
    private int[] wins=new int[3];

    public ABotDoNotForget(int nbElec)
    {
        this.nbElec=nbElec;
    }

    public String getName() {return "ABotDoNotForget";}

    public int getVote(int[] voteCounts, 
                        int votersRemaining, 
                        int[] payoffs,
                        int[] totalPayoffs) 
    {
        countElec++;
        System.arraycopy(totalPayoffs, 0, currPayoffs, 0, totalPayoffs.length);

        if(countElec<=nbElec/20&&countElec<=20)
        {
            int best=0;
            for(int i=1;i<payoffs.length;i++)
                if(payoffs[i]>=payoffs[best])
                    best=i;
            return best;
        }

        for(int i =1;i<totalPayoffs.length;i++)
        {
            if(totalPayoffs[i]<totalPayoffs[i-1])
            {
                int tmp= totalPayoffs[i];
                totalPayoffs[i]=totalPayoffs[i-1];
                totalPayoffs[i-1]=tmp;
                if(i==2&&totalPayoffs[i-1]<totalPayoffs[i-2]){
                    tmp= totalPayoffs[i-1];
                    totalPayoffs[i-1]=totalPayoffs[i-2];
                    totalPayoffs[i-2]=tmp;
                }
            }
        }
        lmhDist(currPayoffs,totalPayoffs);
        int best=0;
        for(int i=1;i<wins.length;i++)
            if(wins[i]>=wins[best]){
                best=i;
            }
        int ownH=0;
        for(int i=1;i<payoffs.length;i++)
            if(payoffs[i]>=payoffs[ownH])
                ownH=i;
        int ownM=0;
        for(int i=1;i<payoffs.length;i++)
            if(payoffs[i]>=payoffs[ownM]&&i!=ownH)
                ownM=i;

        int persBest=(voteCounts[ownH]-voteCounts[ownM]+(votersRemaining/3)>=0
                &&voteCounts[ownH]-voteCounts[best]<(votersRemaining/3))?ownH:ownM;

        return persBest;

    }

    public void receiveResults(int[] voteCounts, double result) 
    {
        int best=0,bestV=voteCounts[best];
        for(int i=1;i<voteCounts.length;i++)
            if(voteCounts[i]>=bestV){
                best=i;
                bestV=voteCounts[i];
            }
        wins[lmh[best]]++;

    }

    private void lmhDist(int[] a,int[] s)
    {
        ArrayList<Integer> al = new ArrayList<Integer>();
        al.add(a[0]);al.add(a[1]);al.add(a[2]);
        lmh[0]=al.indexOf(s[0]);
        lmh[1]=al.indexOf(s[1]);
        lmh[2]=al.indexOf(s[2]);

    }
}

সম্পাদনা করুন:

সিদ্ধান্তের অ্যালগরিদমে কিছু পরিবর্তন হয়েছে, এখন তার নিজের সেরা বেতনটি অ্যাকাউন্টে নেওয়া হয়। যখন বর্তমান বন্টন তাকে তার নিজের লোয়ারের পক্ষে ভোট দেওয়ার সময় আরও ভাল ভোট দিতে সক্ষম হয় যখন অন্যরা যেখানে উচ্চতর বেতন প্রদানের পক্ষে ভোট দেয়।


3

প্রিয়াম

প্রীম পুনরাবৃত্তি ঘৃণা করে। তিনি মোট পেওফের উপর ভিত্তি করে প্রতিটি অবশিষ্ট বটের সম্ভাবনা অনুমান করে এবং তারপরে তার বেতনটি সর্বাধিকতর করার সর্বোত্তম উপায় গণনা করে।

public class Priam implements Player {
    private static double[] smallFactorials = {1,1,2,6,24,120,720,5040,40320,362880,3628800,39916800,479001600,6227020800.,87178291200.,1307674368000.,20922789888000.,355687428096000.,6402373705728000.,121645100408832000.,2432902008176640000.};
    @Override
    public String getName() {
        return "Priam";
    }

    @Override
    public int getVote(int[] voteCounts, int votersRemaining, int[] payoffs,
            int[] totalPayoffs) {
        int totalPayoff = totalPayoffs[0] + totalPayoffs[1] + totalPayoffs[2];
        double p0 = ((double)totalPayoffs[0])/totalPayoff;
        double p1= ((double) totalPayoffs[1])/totalPayoff;
        double p2 = ((double)totalPayoffs[2])/totalPayoff;
        double[] expectedPayoffs = {0,0,0};
        for(int myChoice=0;myChoice<3;myChoice++)
        {
            for(int x0 = 0; x0 <= votersRemaining; x0++)
            {
                for(int x1 = 0; x1 <= (votersRemaining-x0); x1++)
                {
                    int x2 = votersRemaining - (x1 + x0);
                    double probability =
                            Math.pow(p0, x0)
                            * Math.pow(p1, x1)
                            * Math.pow(p2, x2)
                            * Choose(votersRemaining, x0)
                            * Choose(votersRemaining-x0, x1);
                    int votes0 = voteCounts[0];
                    int votes1 = voteCounts[1];
                    int votes2 = voteCounts[2];
                    if(myChoice == 0)
                    {
                        votes0++;
                    }
                    else if(myChoice==1)
                    {
                        votes1++;
                    }
                    else
                    {
                        votes2++;
                    }

                    votes0+=x0;
                    votes1+=x1;
                    votes2+=x2;
                    if(votes0>votes1 && votes0>votes2)
                    {
                        expectedPayoffs[myChoice]+=probability*payoffs[0];
                    }
                    else if(votes1>votes2)
                    {
                        expectedPayoffs[myChoice]+=probability*payoffs[1];
                    }
                    else
                    {
                        expectedPayoffs[myChoice]+=probability*payoffs[2];
                    }
                }
            }
        }
        if(expectedPayoffs[0]>expectedPayoffs[1] && expectedPayoffs[0]>expectedPayoffs[2])
        {
            return 0;
        }
        else if(expectedPayoffs[1]>expectedPayoffs[2])
        {
            return 1;
        }
        else
        {
            return 2;
        }
    }

    private long Choose(int source, int team) {
        return Factorial(source)/(Factorial(team)*Factorial(source-team));
    }

    private long Factorial(int n) {
        if(n<=20)
        {
            return (long)smallFactorials[n];
        }
        double d=(double)n;
        double part1 = Math.sqrt(2*Math.PI*d);
        double part2 = Math.pow(d/Math.E, d);
        return (long)Math.ceil(part1 * part2);
    }

    @Override
    public void receiveResults(int[] voteCounts, double result) {


    }
    public Priam(int i)
    {

    }
}

কোনও পুনরাবৃত্তি না হওয়ার কারণে ওডিসিয়াসের চেয়ে অনেক বেশি দ্রুত (সময় নেমে আসে ও (এন runs 2)) এবং প্রায় 15 সেকেন্ডের মধ্যে দশ লক্ষ নির্বাচন করতে পারে।


"আমি মনে করি এটি নিজের বেনিফিটের জন্য মোট পেওফের প্যারামিটারটি ব্যবহার করার জন্য প্রথম বট :) :) আমার বটটি দেখুন (অ্যাবোটডনোটফরজেট), তিনি ইতিমধ্যে এটি ব্যবহার করছেন, দুঃখিত: ডি
ক্যাটেনকিয়ো

আমার সাম্প্রতিক বট, এক্সপ্যাক্ট্যান্টবটের সাথে খুব সাদৃশ্য, আপনি সম্ভাব্যতার পূর্বাভাস দেওয়ার জন্য টোটাল পেওফ ব্যবহার করেন এবং আমি মনে করি প্রতিটি ভোট সমানভাবে সম্ভাব্য prob আমি কোন কৌশলটি সবচেয়ে ভাল কাজ করে তা দেখার জন্য আমি আগ্রহী।
উইনস্টন ইওয়ার্ট

@ উইনস্টনওয়ার্ট আমার মনে হয় আপনার কাজটি করে, আপনি শেষ তিনটি পরীক্ষা জিতেছেন।
ইয়ানজেট


সত্যি কথা বলতে, আমি ওডিসিয়াস দ্বারা আমার পদ্ধতির গ্রহণে অনুপ্রাণিত হয়েছি।
উইনস্টন এওয়ার্ট

2

NoClueBot

NoClue আসলে জাভা বা গণিত খুব ভাল জানেন না, সুতরাং এই ওয়েটিং-রেশিও-জিনিস তাকে জিততে সহায়তা করবে কিনা তার কোনও ধারণা নেই। তবে সে চেষ্টা করছে।

import java.lang.Math;
import java.util.*;
/**
 * Created by Admin on 5/27/2015.
 */
public class NoClueBot implements Player {

    public NoClueBot(int e) { }

    public String getName() {
        return "NoClueBot";
    }

    public int getVote(int [] voteCounts, int votersRemaining, int [] payoffs, int[] totalPayoffs) {
        double x = 0;
        int y = 0;
        for (int i=0; i<3; i++) {
            double t = (double) voteCounts[i] * ((double) payoffs[i]/(double) totalPayoffs[i]);
            if (x<t) {
                x = t;
                y = i; 
            }
        }
        return y;
    }

    public void receiveResults(int[] voteCounts, double result) { }
}


SomeClueBot

সোমারক্লুবোট বাতিল হয়ে গেছে। আসলে যুক্তি ব্যবহার করে! যুক্তি ব্যবহার করতেন, যা অকার্যকর হয়ে উঠল, সুতরাং পরিবর্তে তিনি তার নিজের নয়, মোট পরিশোধের প্রতি মনোযোগী হন। আবার যুক্তি ব্যবহার করে! তবে তিনি এই সমস্ত অনুগামী এবং আশাবাদীদের, এমনকি এমন লোকদেরও ভাল করেন না যেগুলি যত্ন করে না! :)


SometimesSecondBestBot

মূলত পার্সোনালফ্যাভারিটবট, উন্নত (তত্ত্ব অনুসারে)

import java.lang.Math;
/**
 * Created by Admin on 5/27/2015.
 */
public class SometimesSecondBestBot implements Player {
    public SometimesSecondBestBot(int e) { }

    public String getName() {
        return "SometimesSecondBestBot";
    }

    public int getVote(int [] voteCounts, int votersRemaining, int [] payoffs, int[] totalPayoffs) {
        int m = 0;
        int n = 0;
        for(int i = 1; i< 3; i++) {
            if(payoffs[i] > payoffs[m]) { n = m; m = i; }
        }
        return (voteCounts[n]>voteCounts[m]&&totalPayoffs[n]>totalPayoffs[m])||(voteCounts[m]+votersRemaining<voteCounts[n])||voteCounts[m]+votersRemaining<voteCounts[Math.min(3-n-m, 2)] ? n : m;
    }

    public void receiveResults(int[] voteCounts, double result) { }
}

1
দেখে মনে হচ্ছে আপনি এমন একটি সংখ্যা গণনা করেছেন যা তিনটি ওজনের সবচেয়ে বড় এবং সর্বোত্তম প্রার্থী বাছাই করতে এই মানটি 3 গ্রহণের চেয়ে বেশি take এটি কি সঠিক এবং যদি তাই হয় তবে এটি মূলত কোনও এলোমেলো সংখ্যা নয়? আমি বুঝতে পারি যে আপনি এই "গণিতটি হার্ড বার্বি" হিসাবে ডাকছেন, সুতরাং আমি নিশ্চিত না যে আমার ধারণাটি আছে have
রাল্ফ মার্শাল

@ রালফমারশাল হ্যাঁ, এটি মূলত এলোমেলো। যাইহোক, আমি সম্পূর্ণরূপে এটি করার ইচ্ছা করি নি, মনোযোগ দিচ্ছিল না, হাহা। এটি এখনই স্থির করুন।
কেদে

@ ফিলনটফি আমার মনে হয় আমি এখনই এটির পরিসীমা ছাড়াই স্থির করেছি। এবং হ্যাঁ, আমি অবাক হই না।
কেদে

আমার godশ্বর এটি খারাপ ... আমার প্রতিরক্ষা কাজটি আজ অত্যন্ত মানসিকভাবে শুকিয়ে যাচ্ছিল ।
কেদে

2

উগ্রবাদী

সর্বদা সর্বনিম্ন পরিশোধে প্রার্থীকে ভোট দিন

public class ExtremistBot implements Player
{
    public ExtremistBot(int e){}

    public void receiveResults(int[] voteCounts, double result){}

    public String getName(){
        return "ExtremistBot";
    }

    public int getVote(int [] voteCounts, int votersRemaining, int [] payoffs, int[] totalPayoffs)
    {
        int min = 0;
        for(int i = 1; i<payoffs.length; i++){
            if(payoffs[i] <payoffs[min]){
                min = i;
            }
        }
        return min;
    }
}

2

SmashAttemptByEquality

লক্ষ্যটি সমস্ত প্রার্থীদের সমান করা, তারপরে এসএমএএসএইচ! শেষ রাউন্ডের অন্যান্য সমস্ত বট
এটি একটি ধ্বংসাত্মক অ্যালগরিদ যা অন্য সকলকে খুঁজে বার করার, বিজয় দাবি করার চেষ্টা করে।

public class SmashAttemptByEquality implements Player {
    static private int elections;

    public SmashAttemptByEquality(int e) { 
        this.elections = e;
    }

    public String getName() {
        return "SmashAttemptByEquality (on " + String.valueOf(this.elections) + " elections)";
    }

    public int getVote(int[] voteCounts, int votersRemaining, int[] payoffs, int[] totalPayoffs) {

        //if there are no votes or it is a tie
        if(voteCounts.length == 0 || (voteCounts[0] == voteCounts[1] && voteCounts[1] == voteCounts[2]))
        {
            //let the system handle the (distributed?) randomness
            return 3;
        }

        //we want to win, so, lets not mess when there are no voters left
        if( votersRemaining > 0 )
        {
            //lets bring some equality!
            if( voteCounts[0] >= voteCounts[1] )
            {
                if(voteCounts[0] > voteCounts[2])
                {
                    return 2;
                }
                else
                {
                    return 0;
                }
            }
            else if( voteCounts[1] >= voteCounts[2] )
            {
                if(voteCounts[1] > voteCounts[0])
                {
                    return 0;
                }
                else
                {
                    return 1;
                }
            }
            else
            {
                return 0;
            }
        }
        else
        {
            //just play for the winner!
            if( voteCounts[0] >= voteCounts[1] )
            {
                if(voteCounts[0] > voteCounts[2])
                {
                    return 0;
                }
                else
                {
                    return 2;
                }
            }
            else if( voteCounts[1] >= voteCounts[2] )
            {
                if(voteCounts[1] > voteCounts[0])
                {
                    return 1;
                }
                else
                {
                    return 0;
                }
            }
            else
            {
                return 0;
            }
        }
    }

    public void receiveResults(int[] voteCounts, double result) { }
}

লক্ষ্য করুন যে এটি নিরীক্ষিত !


2

বেসিক বট

বেসিক বট কেবলমাত্র সেই প্রার্থীদের পক্ষে ভোট দেয় যা অপসারণ না হয় এবং সেই প্রার্থীদের কাছ থেকে সর্বাধিক সর্বোচ্চ পরিশোধ হয়।

public class BasicBot implements Player {
    public BasicBot(int e) { }
    public String getName()
    {
        return "BasicBot";
    }
    public static int getMax(int[] inputArray){ 
    int maxValue = inputArray[0]; 
    for(int i=1;i < inputArray.length;i++){ 
      if(inputArray[i] > maxValue){ 
         maxValue = inputArray[i]; 
      } 
    } 
    return maxValue; 
   }
    public int getVote(int [] voteCounts, int votersRemaining, int [] payoffs, int[] totalPayoffs)
    {
        // Check for Eliminated Candidates
        int eliminated0 = 0;
        int eliminated1 = 0;
        int eliminated2 = 0;
        if( ((voteCounts[0] + votersRemaining) < voteCounts[1]) || ((voteCounts[0] + votersRemaining) < voteCounts[2]))
        {
            eliminated0 = 1;
        }
        if( ((voteCounts[1] + votersRemaining) < voteCounts[0]) || ((voteCounts[1] + votersRemaining) < voteCounts[2]))
        {
            eliminated1 = 1;
        }
        if( ((voteCounts[2] + votersRemaining) < voteCounts[0]) || ((voteCounts[2] + votersRemaining) < voteCounts[1]))
        {
            eliminated2 = 1;
        }
        // Choose the Candidates that is not elimated with the largest payoff
        if ((payoffs[0] == getMax(payoffs)) && eliminated0 == 0)
            return 0
        else if ((payoffs[1] == getMax(payoffs)) && eliminated1 == 0)
            return 1
        else
            return 2

    }

    public void receiveResults(int[] voteCounts, double result)
    {
    }

}

2

কেলির প্রিয়

আমি সার্কামস্পেক্টবট দিয়ে শুরু করেছি, তবে বেশি কিছু বাকি নেই। অবশিষ্ট ভোটের সম্ভাব্যতা বিতরণে এক ধরণের বিরক্তিকর অনুমান করে এবং তারপরে তার নিজের লগ-ইউটিলিটি (কেলি মানদণ্ড) সর্বাধিকতর পছন্দ করে তোলে। দ্রুততম নয়, তবে কারও কারও বল পার্কের মধ্যে। এছাড়াও, এটি মাঠের সাথে মোটামুটি প্রতিযোগিতামূলক (যখন আমি এটির কাজ শুরু করলাম তখন এটি দাঁড়িয়েছিল এবং অন্যান্য বটগুলি ডাউনলোড করেছিল)।

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.HashMap;

public class KellysFavorite implements Player {
    private ArrayList<Double> cache = new ArrayList<Double>();

    public KellysFavorite(int elections) {
        cache.add(0.0);
        double v = 0.0;
        for(int i=1; i<1000; i++) {
            v += Math.log(i);
            cache.add(v);
        }
    }

    @Override
    public String getName() {
        return "Kelly's Favorite";
    }

    private double factln(int n) {
        return cache.get(n);
    }

    private  double binll(int x, int n, double p)
    {
        double ll = 0.0;
        ll += ((double)x)*Math.log(p);
        ll += ((double)(n - x))*Math.log(1.0 - p);
        ll += factln(n) - factln(x) - factln(n-x);
        return ll;
    }

    public  double logAdd(double logX, double logY) {
        // 1. make X the max
        if (logY > logX) {
            double temp = logX;
            logX = logY;
            logY = temp;
        }
        // 2. now X is bigger
        if (logX == Double.NEGATIVE_INFINITY) {
            return logX;
        }
        // 3. how far "down" (think decibels) is logY from logX?
        //    if it's really small (20 orders of magnitude smaller), then ignore
        double negDiff = logY - logX;
        if (negDiff < -20) {
            return logX;
        }
        // 4. otherwise use some nice algebra to stay in the log domain
        //    (except for negDiff)
        return logX + java.lang.Math.log(1.0 + java.lang.Math.exp(negDiff));
    }

    @Override
    public int getVote(int[] voteCounts,
                       int votersRemaining,
                       int[] payoffs,
                       int[] totalPayoffs) {
        int totalviable = 0;
        boolean[] viable = { false, false, false };
        int topVote = Arrays.stream(voteCounts).max().getAsInt();
        for (int index = 0; index < 3; index++) {
            if (voteCounts[index] + votersRemaining + 1 >= topVote) {
                viable[index] = true;
                totalviable += 1;
            }
        }

        // if only one candidate remains viable, vote for them
        if(totalviable == 1) {
            for(int index = 0; index < 3; index++)
                if(viable[index])
                    return index;
        } else {
            double votelikelihoods[] = { 0.0, 0.0, 0.0 };
            double totalweight = 0.0;
            for(int index=0; index<3; index++) {
                if(!viable[index])
                    votelikelihoods[index] -= 10.0;
                else if(voteCounts[index] < topVote)
                    votelikelihoods[index] -= 0.1;

                totalweight += Math.exp(votelikelihoods[index]);
            }

            double probs[] = new double[3];
            for(int index=0; index<3; index++) {
                probs[index] = Math.exp(votelikelihoods[index]) / totalweight;
            }

            double[] utilities = {0,0,0};
            for(int mychoice=0; mychoice<3; mychoice++) {
                boolean seen[] = { false, false, false };
                double likelihoods[] = { Double.NEGATIVE_INFINITY,
                                         Double.NEGATIVE_INFINITY,
                                         Double.NEGATIVE_INFINITY };
                int[] localVoteCounts = { voteCounts[0] + (mychoice==0?1:0),
                                          voteCounts[1] + (mychoice==1?1:0),
                                          voteCounts[2] + (mychoice==2?1:0) };
                for(int iVotes=0; iVotes<=votersRemaining; iVotes++)
                    for(int jVotes=0; jVotes<=(votersRemaining-iVotes); jVotes++) {
                        int kVotes = votersRemaining - iVotes - jVotes;

                        int a = localVoteCounts[0] + iVotes;
                        int b = localVoteCounts[1] + jVotes;
                        int c = localVoteCounts[2] + kVotes;
                        int wincount = Math.max(a, Math.max(b, c));
                        int winners = 0;
                        if(a>=wincount) { winners += 1; }
                        if(b>=wincount) { winners += 1; }
                        if(c>=wincount) { winners += 1; }

                        double likelihood =
                            binll(iVotes, votersRemaining, probs[0])
                            + binll(jVotes, votersRemaining-iVotes, probs[1] / (probs[1] + probs[2]));

                        likelihood += Math.log(1.0/winners);

                        if(a>=wincount) {
                            if(seen[0])
                                likelihoods[0] = logAdd(likelihoods[0],
                                                        likelihood);
                            else
                                likelihoods[0] = likelihood;
                            seen[0] = true;
                        }
                        if(b>=wincount) {
                            if(seen[1])
                                likelihoods[1] = logAdd(likelihoods[1],
                                                        likelihood);
                            else
                                likelihoods[1] = likelihood;
                            seen[1] = true;
                        }
                        if(c>=wincount) {
                            if(seen[2])
                                likelihoods[2] = logAdd(likelihoods[2],
                                                        likelihood);
                            else
                                likelihoods[2] = likelihood;
                            seen[2] = true;
                        }

                    }

                for(int index=0; index<3; index++)
                    utilities[mychoice] += Math.exp(likelihoods[index]) * Math.log((double)payoffs[index]);
            }

            double maxutility = Math.max(utilities[0], Math.max(utilities[1], utilities[2]));
            int choice = 0;
            for(int index=0; index<3; index++)
                if(utilities[index]>=maxutility)
                    choice = index;
            return choice;
        }

        throw new InternalError();
    }

    @Override
    public void receiveResults(int[] voteCounts, double result) {

    }

}

যদি সহজ হয় তবে https://gist.github.com/jkominek/dae0b3158dcd253e09e5 এও উপলব্ধ ।


2

CommunismBot

কমিউনিজমবট মনে করেন যে আমাদের সকলকে একসাথে যাওয়া উচিত এবং সবার পক্ষে সেরা প্রার্থীকে বেছে নেওয়া উচিত।

public class CommunismBot implements Player
{
    Random rnd;
    String name;
    public CommunismBot(int e) {
        rnd = new Random(); 
        name = "CommunismBot" + rnd.nextInt(1000);
    }

    public String getName()
    {
        return name;
    }

    public int getVote(int [] voteCounts, int votersRemaining, int [] payoffs, int[] totalPayoffs)
    {
        int maxloc = 0;
        for(int i = 1; i< 3; i++)
        {
            if(totalPayoffs[i] > totalPayoffs[maxloc])
            {
                maxloc = i;
            }
        }
        return maxloc;
    }

    public void receiveResults(int[] voteCounts, double result) { }
}

Hatebot

হাটবোট সর্বদা সেরা প্রার্থীকে বেছে নেয়। যদি না তারা একটি নোংরা-দুর্গন্ধযুক্ত পার্টি হয় 1. এই ছেলেরা ভয়াবহ।

import java.util.Random;


public class HateBot implements Player
{
    Random rnd;
    String name;
    public HateBot(int e) {
        rnd = new Random(); 
        name = "HateBot" + rnd.nextInt(1000); }

    public String getName()
    {
        return name;
    }

    public int getVote(int [] voteCounts, int votersRemaining, int [] payoffs, int[] totalPayoffs)
    {
        if(payoffs[0]>payoffs[2])
            return 0;
        else
            return 2;
    }

    public void receiveResults(int[] voteCounts, double result) { }
}

StrategicBot

স্ট্র্যাটেজিকবট সেরা প্রার্থীর পক্ষে ভোট প্রদান করে যে তারা অবশিষ্ট ভোটারের সংখ্যা বিবেচনা করে পরবর্তী সেরা প্রার্থীর একক বিচ্যুতির মধ্যে রয়েছেন।

import java.util.Random;

public class StrategicBot implements Player
{
    Random rnd;
    String name;
    public StrategicBot(int e) {
        rnd = new Random(); 
        name = "StrategicBot" + rnd.nextInt(1000);

    }

    public String getName()
    {
        return name;
    }

    public int getVote(int [] voteCounts, int votersRemaining, int [] payoffs, int[] totalPayoffs)
    {
        double margin = 9.0*votersRemaining/9;
        int maxloc = 0;
        boolean noLead=false;
        for(int i = 1; i< 3; i++)
        {
            for(int j = 1; j < 3; j++)
            {
                if(payoffs[j] + margin > payoffs[i])
                    noLead=true;
            }
            if(payoffs[i] > payoffs[maxloc] && noLead)
            {
                maxloc = i;
            }
            noLead=false;
        }
        return maxloc;
    }

    public void receiveResults(int[] voteCounts, double result) { }
}

2

ExpectorBot

অন্য সমস্ত বটস কীভাবে অন্যদের জন্য গড় পরিশোধের গণনা করে কীভাবে ভোট দেবেন তা অনুমান করার চেষ্টা করে। ডিফল্ট সেরা পরিশোধের জন্য ভোট দেয়, তবে দ্বিতীয় সেরাকে ভোট দেবে, যদি এটির চেয়ে সেরাের চেয়ে বেশি প্রত্যাশিত ভোট থাকে তবে আমার জন্য গড় পরিশোধের চেয়ে ভাল এবং সবচেয়ে খারাপ অর্থ প্রদানের ক্ষেত্রে এই জিনিসটি জয়ের সুযোগ রয়েছে।

import java.util.Arrays;

public class ExpectorBot implements Player
{
    class Votee
    {
        int index;
        int payoff;
        float avgPayoff;
        float expectedVotes;
    }

    public ExpectorBot( final int e )
    {

    }

    @Override
    public String getName()
    {
        return "ExpectorBot";
    }

    @Override
    public int getVote( final int[] voteCounts, final int votersRemaining, final int[] payoffs, final int[] totalPayoffs )
    {
        final int otherVoters = Arrays.stream( voteCounts ).sum() + votersRemaining;
        final Votee[] v = createVotees( voteCounts, otherVoters, votersRemaining, payoffs, totalPayoffs );

        final Votee best = v[ 0 ]; // Most Payoff
        final Votee second = v[ 1 ];
        final Votee worst = v[ 2 ];

        int voteFor = best.index;

        if( ( second.expectedVotes >= best.expectedVotes + 1 ) // Second has more votes than Best even after I vote
                && ( second.payoff >= second.avgPayoff ) // Second payoff better than average for the others
                && ( worst.expectedVotes >= best.expectedVotes + 0.5f ) ) // Worst has a chance to win
        {
            voteFor = second.index;
        }

        return voteFor;
    }

    private Votee[] createVotees( final int[] voteCounts, final int otherVoters, final int votersRemaining, final int[] payoffs, final int[] totalPayoffs )
    {
        final Votee[] v = new Votee[ 3 ];

        for( int i = 0; i < 3; ++i )
        {
            v[ i ] = new Votee();
            v[ i ].index = i;
            v[ i ].payoff = payoffs[ i ];

            // This is the average payoff for other Players from this Votee
            v[ i ].avgPayoff = (float)( totalPayoffs[ i ] - payoffs[ i ] ) / otherVoters;

            // The expected number of Votes he will get if everyone votes for biggest payoff
            v[ i ].expectedVotes = voteCounts[ i ] + ( votersRemaining * v[ i ].avgPayoff / 100.0f );
        }

        Arrays.sort( v, ( o1, o2 ) -> o2.payoff - o1.payoff );

        return v;
    }

    @Override
    public void receiveResults( final int[] voteCounts, final double result )
    {

    }
}

1

LockBot

কেবলমাত্র নিঃসঙ্গ দার্শনিক, তার "ই" খুঁজছেন ...

//He thinks he's the father of democracy, but something's missing....
public class LockBot implements Player {

public LockBot(int i) {
    //One election, 10000000, what's the difference?
}

@Override
public String getName() {
    return "LockBot";
}

@Override
public int getVote(int[] voteCounts, int votersRemaining, int[] payoffs,
        int[] totalPayoffs) {

    double totalPlayers = voteCounts.length + votersRemaining;
    double totalPayoff = totalPlayers * 100;

    //adjust total payoffs to ignore my own
    for( int i = 0; i < totalPayoffs.length; i++){
        totalPayoffs[i] -= payoffs[i];
    }

    //Votes are probably proportional to payoffs
    //So lets just find the highest weight
    double[] expectedOutcome = new double[3];
    for(int i = 0; i< expectedOutcome.length; i++){
        expectedOutcome[i] = (totalPayoffs[i] / totalPayoff) * payoffs[i];
    }

    //Find the highest
    int choice = 0;
    if(expectedOutcome[1] > expectedOutcome[choice]){
        choice = 1;
    }
    if(expectedOutcome[2] > expectedOutcome[choice]){
        choice = 2;
    }




    return choice;
}

@Override
public void receiveResults(int[] voteCounts, double result) {
    // TODO Auto-generated method stub

}

}

0

WinLose

আপনি জিতলে আমি হেরে যাই! এটা সহজ. সুতরাং এই বট তার পছন্দ মতকেই ভোট দেয় এবং বাকি সবাই অপছন্দ করে।

public class WinLose implements Player
{
    public WinLose(int e) { }

    public String getName()
    {
        return "WinLose";
    }
    public int getVote(int [] voteCounts, int votersRemaining, int [] payoffs, int[] totalPayoffs)
    {
        int max = 0;
        for(int i = 1; i< 3; i++)
        {
            if(10*payoffs[i]-totalPayoffs[i] > 10*payoffs[max]-totalPayoffs[max])
            {
                max = i;
            }
        }
        return max;
    }

    public void receiveResults(int[] voteCounts, double result)
    {

    }
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.