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()
)我所有的染色体在一代将是一个保存价值。
我修了很多次调试程序,但是找不到任何东西。
问题是什么?
*我代中的所有染色体都将是一个保存价值。*抱歉,但我没有得到你。 –
有一段时间,他们不完全相同,或者他们总是一样吗?后者会让我想,也许你会将随机数发生器的种子设置为某个固定值。 – seaotternerd
@seaotternerd第一代所有人都不一样。经过几次重复,所有这些都将是相同的 – Arashdn