简单的囚徒困境遗传算法

时间:2016-06-16 15:50:18

标签: java algorithm

我使用了现有的遗传算法 here 并且重做了我但不知道我做错了什么 这是我得到的错误

  

线程“main”中的异常java.lang.NullPointerException at   simpleGa.Algorithm.crossover(Algorithm.java:69)at   simpleGa.Algorithm.evolvePopulation(Algorithm.java:34)at   simpleGa.GAprisonerdilemma.main(GAprisonerdilemma.java:41)

我无法确切地知道错误的位置。阅读了很多关于NullPointerException的内容,但无法弄清楚

package simpleGa;

public class Population {

     public static Individual[] individuals;

     /*
      * Constructors
      */
     // Create a population
     public Population(int populationSize, boolean initialise) {
         individuals = new Individual[populationSize];
         // Initialise population
         if (initialise) {
             // Loop and create individuals
             for (int i = 0; i < size(); i++) {
                 Individual newIndividual = new Individual();
                 newIndividual.generateIndividual();
                 saveIndividual(i, newIndividual);
             }
             for(int i=0;i<size();i++)
             {
                 if(i%2==1){Individual individual1=individuals[i-1];
                 Individual individual2=individuals[i];
              if(individuals[i-1].getGene(i-1)==0 && individuals[i].getGene(i)==0){
                individuals[i-1].fitness=individual1.fitness+1;
                individuals[i].fitness=individual2.fitness+1;
             }
             if(individuals[i-1].getGene(i-1)==1 && individuals[i].getGene(i)==1){
                 individuals[i-1].fitness=individual1.fitness+2;
                 individuals[i].fitness=individual2.fitness+2;
             }
             if(individuals[i-1].getGene(i-1)==0 && individuals[i].getGene(i)==1){
                 individuals[i-1].fitness=individual1.fitness+3;
                 individuals[i].fitness=individual2.fitness+0;
             }
             if(individuals[i-1].getGene(i-1)==1 && individuals[i].getGene(i)==0){
                 individuals[i-1].fitness=individual1.fitness+0;
                 individuals[i].fitness=individual2.fitness+3;
             } 

         }}}



     }

     /* Getters */
     public Individual getIndividual(int index) {
         return individuals[index];
     }

     public Individual getFittest() {
         Individual fittest = individuals[0];
         // Loop through individuals to find fittest
         for (int i = 1; i < size(); i++) {
             if (fittest.getFitness() <= getIndividual(i).getFitness()) {
                 fittest = getIndividual(i);
             }
         }
         return fittest;
     }

     /* Public methods */
     // Get population size
     public int size() {
         return individuals.length;
     }

     // Save individual
     public void saveIndividual(int index, Individual indiv) {
         individuals[index] = indiv;
     }
 }

package simpleGa;

public class Individual {

     static int defaultGeneLength = 1000;
     private long[] genes =new long [defaultGeneLength];
     // Cache
     public static int fitness = 0;

     // Create a random individual
     public void generateIndividual() {
         for (int i = 0; i < size(); i++) {
             long gene =  Math.round(Math.random());
             genes[i] = gene;
         }
     }

     /* Getters and setters */
     // Use this if you want to create individuals with different gene lengths
     public static void setDefaultGeneLength(int length) {
         defaultGeneLength = length;
     }

     public long getGene(int i) {
         return genes[i];
     }

     public void setGene(int index, long value) {
         genes[index] = value;
         fitness = 0;
     }

     /* Public methods */
     public int size() {
         return genes.length;
     }

     public static  int getFitness() {

         return fitness;
     }
     public void setFitness(int i) {

          fitness=i;
     }
     @Override
     public String toString() {
         String geneString = "";
         for (int i = 0; i < size(); i++) {
             geneString += getGene(i);
         }
         return geneString;
     }
 }

package simpleGa;

public class Algorithm {

     /* GA parameters */
     private static final double uniformRate = 0.5;
     private static final double mutationRate = 0.015;
     private static final int tournamentSize = 5;
     private static final boolean elitism = true;

     /* Public methods */

     // Evolve a population
     public static Population evolvePopulation(Population pop) {
         Population newPopulation = new Population(pop.size(), false);

         // Keep our best individual
         if (elitism) {
             newPopulation.saveIndividual(0, pop.getFittest());
         }

         // Crossover population
         int elitismOffset;
         if (elitism) {
             elitismOffset = 1;
         } else {
             elitismOffset = 0;
         }
         // Loop over the population size and create new individuals with
         // crossover
         for (int i = elitismOffset; i < pop.size(); i++) {
             Individual indiv1 = tournamentSelection(pop);
             Individual indiv2 = tournamentSelection(pop);
             Individual newIndiv = crossover(indiv1, indiv2);
             newPopulation.saveIndividual(i, newIndiv);
         }

         // Mutate population
         for (int i = elitismOffset; i < newPopulation.size(); i++) {
             mutate(newPopulation.getIndividual(i));
         }
         for(int i=0;i<pop.size();i++)
     {for(int j=0;j<pop.getIndividual(i).size();j++)
         {if(i%2==1){Individual individual1=Population.individuals[i-1];
         Individual individual2=Population.individuals[i];
      if(Population.individuals[i-1].getGene(i-1)==0 && Population.individuals[i].getGene(i)==0){
        Population.individuals[i-1].fitness=individual1.fitness+1;
        Population.individuals[i].fitness=individual2.fitness+1;
     }
     if(Population.individuals[i-1].getGene(i-1)==1 && Population.individuals[i].getGene(i)==1){
         Population.individuals[i-1].fitness=individual1.fitness+2;
         Population.individuals[i].fitness=individual2.fitness+2;
     }
     if(Population.individuals[i-1].getGene(i-1)==0 && Population.individuals[i].getGene(i)==1){
         Population.individuals[i-1].fitness=individual1.fitness+3;
         Population.individuals[i].fitness=individual2.fitness+0;
     }
     if(Population.individuals[i-1].getGene(i-1)==1 && Population.individuals[i].getGene(i)==0){
         Population.individuals[i-1].fitness=individual1.fitness+0;
         Population.individuals[i].fitness=individual2.fitness+3;
     } }}}``
         return newPopulation;
     }

     // Crossover individuals
     private static Individual crossover(Individual indiv1, Individual indiv2) {
         Individual newSol = new Individual();
         // Loop through genes
         for (int i = 0; i < indiv1.size(); i++) {
             // Crossover
             if (Math.random() <= uniformRate) {
                 newSol.setGene(i, indiv1.getGene(i));
             } else {
                 newSol.setGene(i, indiv2.getGene(i));
             }
         }
         return newSol;
     }

     // Mutate an individual
     private static void mutate(Individual indiv) {
         // Loop through genes
         for (int i = 0; i < indiv.size(); i++) {
             if (Math.random() <= mutationRate) {
                 // Create random gene
                 long gene =  Math.round(Math.random());
                 indiv.setGene(i, gene);
             }
         }
     }

     // Select individuals for crossover
     private static Individual tournamentSelection(Population pop) {
         // Create a tournament population
         Population tournament = new Population(tournamentSize, false);
         // For each place in the tournament get a random individual
         for (int i = 0; i < tournamentSize; i++) {
             int randomId = (int) (Math.random() * pop.size());
             tournament.saveIndividual(i, pop.getIndividual(randomId));
         }
         // Get the fittest
         Individual fittest = tournament.getFittest();
         return fittest;
     }
package simpleGa;

public class FitnessCalc {



     /* Public methods */
     // Set a candidate solution as a byte array

     // To make it easier we can use this method to set our candidate solution 
     // with string of 0s and 1s

     // Calculate inidividuals fittness by comparing it to our candidate solution
     static int getFitness(Individual individual) {
         int fitness = 0;
         // Loop through our individuals genes and compare them to our cadidates
     fitness=Individual.fitness;
         return fitness;
     }
}
     // Get optimum fitness

     }
package simpleGa;

import java.util.Scanner;

public class GAprisonerdilemma {

    public static void main(String[] args) {

        // Set a candidate solution
        Scanner keyboard = new Scanner(System.in);
         System.out.println("Input number of games!");
         int k = keyboard.nextInt();
        Individual.setDefaultGeneLength(k);
       // Create an initial population
        System.out.println("Input number of individuals in the population!");
         int p = keyboard.nextInt();
        Population myPop = new Population(p, true);

        System.out.println("Input acceptable number of generations!");
         int l = keyboard.nextInt();

       // Evolve our population until we reach an optimum solution
       int generationCount = 0;
       int j=l+1;
       System.out.println("Input requiered fitness value !");
         int f = keyboard.nextInt();
         int h=0;
        // Evolve our population until we reach an optimum solution

         for(int i=0;i<j;i++)
            {

                if(i==0){}
                else{

                if(myPop.getFittest().getFitness()>=f){if(h==0){h++;}
                else{ System.out.println("Solution found!");
                System.out.println("Generation: " + generationCount);
                System.out.println( "Fitness(Points): " + myPop.getFittest().getFitness());
                break;}
               }else {myPop = Algorithm.evolvePopulation(myPop);
               generationCount++;
               System.out.println("Generation: " + generationCount + " Fittest: " + myPop.getFittest().getFitness());
               }
                if(i==j-1){ if(myPop.getFittest().getFitness()>=f)System.out.println("Solution found !");
                else System.out.println("Solution not found closest solution is!");
                System.out.println("Generation: " + generationCount);
                System.out.println( " Fitness(Points): " + myPop.getFittest().getFitness());}

                }


            }

            System.out.println("0 for betrays in that turn 1 for cooperates!");
            System.out.println("Turns:");
            System.out.println(myPop.getFittest());
    }
}

0 个答案:

没有答案