2015-05-24 19 views
1

我尝试过用Java实现GA解方程(此时并不重要)遗传算法给出相同的数据,每次

我对染色体实施可比(由健身排序)一类 和我自己IChromosome接口。

我提供这一类跨过去,突变等功能: 有些事情是这样的:

public interface IChromosome 
{ 

    public int getSize(); 
    public void setSize(int s); 

    public IGene[] getGenes(); 
    public void setGenes(IGene[] genes); 

    public IGene getGene(int i); 
    public void setGene(int i , IGene val); 

    public double getFitness(); 

    public IChromosome[] crossOver(IChromosome c2); 
    public IChromosome mutate(); 

} 

和我的GA程序主要部分是这样的:

public class GeneticAlgorithm 
{ 
    final int populationSize; 
    int crossOverRate;// Probability in persent 
    int mutationRate;// Probability in persent 
    int elitismRate;// in persent 
    int TournamentNumber;//number of random Chromosomes to compete in Tournament 


    int repeatCount; 


    Chromosome [] currentGeneration; 
    Chromosome [] nextGeneration; 


    public GeneticAlgorithm(int populationSize, int crossOverRate, int mutationRate, int ElitismRate, int TournamentNumber) 
    { 
     this.populationSize = populationSize; 
     this.crossOverRate = crossOverRate; 
     this.mutationRate = mutationRate; 
     this.elitismRate = ElitismRate; 
     this.TournamentNumber = TournamentNumber; 

     repeatCount = 0; 

     currentGeneration = new Chromosome[populationSize]; 
     nextGeneration = new Chromosome[populationSize]; 

     for (int i = 0; i < populationSize; i++) 
     { 
      currentGeneration[i] =new Chromosome(Chromosome.getPolynomial().getSize());//Also randomize it; //size is from another class 
     } 

    } 


    private Chromosome[] select() 
    { 
     Chromosome[] temp = new Chromosome[TournamentNumber]; 

     //choose populationSize random uniqe number 
     ArrayList<Integer> nums = new ArrayList<>(); 
     for (int i = 0; i < populationSize; i++) 
     { 
      nums.add(i); 
     } 
     Collections.shuffle(nums); 


     for (int i = 0; i < TournamentNumber; i++) 
     { 
      temp[i]=new Chromosome(currentGeneration[nums.get(i)]); 
     } 

     Arrays.sort(temp); 
     Chromosome[] res = new Chromosome[2]; 

     //choosing best Chromosomes 
     res[0] = new Chromosome(temp[TournamentNumber-1]); 
     res[1] = new Chromosome(temp[TournamentNumber-2]); 
     return res; 
    } 


    public void repeat() 
    { 
     repeatCount++; 

     Arrays.sort(currentGeneration,Collections.reverseOrder()); 
     int elitism = (populationSize*elitismRate)/100; 

     for (int i = 0; i < elitism ; i++) 
     { 
      nextGeneration[i] = new Chromosome(currentGeneration[i]); 
     } 

     int cop = 0;//Cross Over Probability 
     int mp;//mutation Probability 
     Random rnd = new Random(); 
     Chromosome [] sel; 
     Chromosome [] temp; 
     Chromosome ch1 , ch2; 
     for (int i = elitism; i < populationSize; i++) 
     { 
      cop = rnd.nextInt(100); 
      sel = new Chromosome[2]; 
      sel = select(); 
      if(cop <= crossOverRate) 
      { 
       temp = (Chromosome[]) (sel[0].crossOver(sel[1]));//tested , And I 'm sure cross over function working well 
       ch1 = temp[0]; 
       ch2 = temp[1]; 
      } 
      else 
      { 
       ch1 = new Chromosome(sel[0]); 
       ch2 = new Chromosome(sel[1]); 
      } 

      mp = rnd.nextInt(100); 
      if(mp< mutationRate) 
      { 
       ch1.mutate(); 
      } 
      nextGeneration[i]= new Chromosome(ch1); 
      if(++i<populationSize) 
      { 
       nextGeneration[i]= new Chromosome(ch2); 
      } 
     }//for 

     //copiny current generation to nextGeneration 
     for (int i = 0; i < populationSize; i++) 
     { 
      currentGeneration[i] = new Chromosome(nextGeneration[i]); 
     } 
    }//repeat 

} 

每事情似乎是正常的,但几代后(称为repeat())我所有的染色体在一代将是一个保存价值。

我修了很多次调试程序,但是找不到任何东西。

问题是什么?

+0

*我代中的所有染色体都将是一个保存价值。*抱歉,但我没有得到你。 –

+0

有一段时间,他们不完全相同,或者他们总是一样吗?后者会让我想,也许你会将随机数发生器的种子设置为某个固定值。 – seaotternerd

+0

@seaotternerd第一代所有人都不一样。经过几次重复,所有这些都将是相同的 – Arashdn

回答

2

我认为你的算法有早期收敛,如果其他的东西都可以。

可能的解决方案是: 1-将精英率设为零; 2-减少交叉率; 3-增加突变率。

如果解决的问题很简单,GA早期收敛是很自然的。

+0

我认为这是重点.... – Arashdn