📄 cgroup.cs
字号:
for(i=1;i<PopSize;i++)
{
if(population[i].fitness>bestindividual.fitness)
{
getIndividual(bestindividual,population[i]);
best_index=i;
}
else if(population[i].fitness<worstindividual.fitness)
{
getIndividual(worstindividual,population[i]);
worst_index=i;
}
// sum+=population[i].fitness;
}
//find out the best individual so far
if(generation==0)
{ //initialize the best individual
getIndividual(currentbest,bestindividual);
}
else
{
if(bestindividual.fitness>currentbest.fitness)
{
getIndividual(currentbest,bestindividual);
}
}
}
/* Function: To perform evolution operation based on dlitisemodel.
Elitist model is to replace the worst individual of
this generation by the vurrent best one.
Variable:None. */
void PerformEvolution()
{
if(bestindividual.fitness>currentbest.fitness)
{
getIndividual(currentbest,bestindividual);
}
else
{
getIndividual(population[worst_index],currentbest);
}
}
/* Function: To reproduce a chromosome by proportional selection.
Variable:None. */
void SelectionOperator()
{
int i,j,index;
double p,sum=0.0;
double[] cfitness=new double[POPSIZE]; //cumulative fitness value
individual[] newpopulation=new individual[POPSIZE];
for(i=0;i<POPSIZE;i++)
newpopulation[i]=new individual();
for(i=0;i<PopSize;i++)
{
for(j=0;j<CHROMLENGTH;j++)
{
//ASSERT(population[i].chrom[j]=='0'||population[i].chrom[j]=='1');
}
}
//calculate relative fitness
for(i=0;i<PopSize;i++)
{
sum+=population[i].fitness;
}
for(i=0;i<PopSize;i++)
{
cfitness[i]=population[i].fitness/sum;
}
//calculate cumulative fitness
for(i=1;i<PopSize;i++)
{
cfitness[i]=cfitness[i-1]+cfitness[i];
}
//selection operation
for(i=0;i<PopSize;i++)
{
p=Rand(1.0);
index=0;
while(p-cfitness[index]>0.000001)
{
index++;
}
getIndividual(newpopulation[i],population[index]);
for(j=0;j<CHROMLENGTH;j++)
{
//ASSERT(newpopulation[i].chrom[j]=='0'||newpopulation[i].chrom[j]=='1');
}
}
for(i=0;i<PopSize;i++)
{
getIndividual(population[i],newpopulation[i]);
}
for(i=0;i<PopSize;i++)
{
for(j=0;j<CHROMLENGTH;j++)
{
//ASSERT(population[i].chrom[j]=='0'||population[i].chrom[j]=='1');
}
}
}
/* Function:Crossover two chromosome by meansof one-point crossover.
Variable:None. */
void CrossoverOperator()
{
int i,j;
int[] index=new int[POPSIZE];
int point,temp;
double p;
char ch;
for(i=0;i<PopSize;i++)
{
for(j=0;j<CHROMLENGTH;j++)
{
//ASSERT(population[i].chrom[j]=='0'||population[i].chrom[j]=='1');
}
}
//make a pair of individual randomly
for(i=0;i<PopSize;i++)
{
population[i].dirty=false;
index[i]=i;
}
for(i=0;i<PopSize;i++)
{
point=(int)Math.Floor(Rand(PopSize-i));
if(point==PopSize-i) point--;
//ASSERT(point>=0&&point<PopSize-i) ;
temp=index[i];
index[i]=index[point+i];
//ASSERT(index[i]<PopSize&&index[i]>=0);
index[point+i]=temp;
//ASSERT(index[point+i]<PopSize&&index[i]>=0);
}
//one-point crossover operation
for(i=0;i<PopSize-1;i+=2)
{
p=Rand(1.0);
if(p<Pc)
{
point=(int)Rand(CHROMLENGTH-1)+1;
population[index[i]].dirty=population[index[i+1]].dirty=true;
for(j=point;j<CHROMLENGTH;j++)
{
ch=population[index[i]].chrom[j];
population[index[i]].chrom[j]=population[index[i+1]].chrom[j];
population[index[i+1]].chrom[j]=ch;
}
}
}
for(i=0;i<PopSize;i++)
{
for(j=0;j<CHROMLENGTH;j++)
{
//ASSERT(population[i].chrom[j]=='0'||population[i].chrom[j]=='1');
}
}
}
/* Function:Mutation of a chromosome.
Variable:None. */
void MutationOperator()
{
int i,j;
double p;
//bit mutation
for(i=0;i<PopSize;i++)
{
for(j=0;j<CHROMLENGTH;j++)
{
//ASSERT(population[i].chrom[j]=='0'||population[i].chrom[j]=='1');
}
}
for(i=0;i<PopSize;i++)
{
for(j=0;j<CHROMLENGTH;j++)
{
p=Rand(1.0);
if(p<Pm)
{
population[i].dirty=true;
population[i].chrom[j]=(population[i].chrom[j]=='0')?'1':'0';
}
}
}
for(i=0;i<PopSize;i++)
{
for(j=0;j<CHROMLENGTH;j++)
{
//ASSERT(population[i].chrom[j]=='0'||population[i].chrom[j]=='1');
}
}
}
/* Function: Output the results of current population.
Variable:None. */
void Annealing()
{
individual[] newpopulation=new individual[POPSIZE];
for(i=0;i<POPSIZE;i++)
newpopulation[i]=new individual();
double p,Pm_anneal=0.02;
int temp3,temp4,temp1,temp2;
double x1,x2,x3,x4,sum;
for(int i=0;i<PopSize;i++)
{
getIndividual(newpopulation[i],population[i]);
for(int j=0;j<CHROMLENGTH;j++)
{
p=Rand(1.0);
if(p<Pm_anneal)
{
newpopulation[i].dirty=true;
newpopulation[i].chrom[j]=(population[i].chrom[j]=='0')?'1':'0';
}
}
}
//Rosenbrock function
for(i=0;i<PopSize;i++)
{
if(newpopulation[i].dirty==true)
{
temp1=DecodeChromosome(newpopulation[i].chrom,0,LENGTH1);
temp2=DecodeChromosome(newpopulation[i].chrom,LENGTH1,LENGTH2);
temp3=DecodeChromosome(newpopulation[i].chrom,LENGTH1+LENGTH2,LENGTH3);
temp4=DecodeChromosome(newpopulation[i].chrom,LENGTH1+LENGTH2+LENGTH3,LENGTH4);
if(temp1==0)temp2=0;
x1=temp1/20.0;
x2=temp2/(double)Pointnum;
x3=temp3/20.0;
x4=2*PI*temp4/Pointnum;
CalPopulation(i,x1,x2,x3,x4);
}
}
for(i=0;i<PopSize;i++)
{
if(newpopulation[i].dirty==true)
{
newpopulation[i].fitness=Math.Pow(newpopulation[i].value,2);
newpopulation[i].dirty=false;
}
if(Math.Abs(newpopulation[i].value)>=Math.Abs(population[i].value))
{
getIndividual(population[i],newpopulation[i]);
}
}
sum=0.0;
for(i=0;i<PopSize;i++)
{
sum+=population[i].fitness;
}
averagevalue=sum/PopSize;
sum=0.0;
for(i=0;i<PopSize;i++)
{
sum+=Math.Pow(population[i].fitness-averagevalue,2);
}
fangcha=Math.Sqrt(sum/PopSize)/averagevalue;
}
double Rand(double rank)
{
double i=random.NextDouble();
return i*rank;
}
double impulse(double tn,double a,double b,double sita,double fai)
{
if(tn<b) return 0.0;
return Math.Exp(-a*(tn-b))*Math.Cos(2*PI*sita*tn+fai);
}
void getIndividual(individual Des,individual Src)
{
int i;
for(i=0;i<CHROMLENGTH;i++)
Des.chrom[i]=Src.chrom[i];
Des.value=Src.value;
Des.fitness =Src.fitness ;
Des.dirty =Src.dirty;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -