📄 sga1.cpp
字号:
}
}
else if(FunctionMode==MINIMIZATION)
{
if((population[i].value)<Cmax)
{
temp=Cmax-population[i].value;
}
else
{
temp=0.0;
}
}
population[i].fitness =temp;
}
}
/************************************************************************************************
* 找到当前最优 *
************************************************************************************************/
void FindBestWorstIndividual()
{
int i;
double sum=0.0;
bestindividual=population[0];
worstindividual=population[0];
for(i=1;i<PopSize;i++)
{
if(population[i].fitness >bestindividual.fitness )
{
bestindividual=population[i];
best_index=i;
}
else if(population[i].fitness<worstindividual.fitness )
{
worstindividual=population[i];
worst_index=i;
}
sum+=population[i].fitness ;
}
if(generation==0)
{
currentbest=bestindividual;
}
else
{
if(bestindividual.fitness >currentbest.fitness )
{
currentbest =bestindividual;
}
}
}
/**************************************************************************************************
最优替换最差的
**************************************************************************************************/
void PerformEvolution()
{
if(bestindividual.fitness >currentbest.fitness )
{
currentbest=population[best_index];
}
else
{
population[worst_index]=currentbest;
}
}
/***********************************************************************************************
进行选择运算
*************************************************************************************************/
void SelectionOperator()
{
int i,index;
double p,sum=0.0;
double cfitness[POPSIZE];//计算适应度
struct individual newpopulation[POPSIZE];
srand( (unsigned)time( NULL ) );//保证rand()每次产生的数不一样
//计算相关适应度
for(i=0;i<PopSize;i++)
sum+=population[i].fitness ;//一代中所有染色体的适应度相加
for(i=0;i<PopSize;i++)
cfitness[i]=population[i].fitness/sum;//计算每个染色体的相关适应度
//计算累计适应度
for(i=1;i<PopSize;i++)
cfitness[i]=cfitness[i-1]+cfitness[i];
//进行选择操作
for(i=0;i<PopSize;i++)
{
p=rand()%1000/1000.0;
index=0;
while(p>cfitness[index])//选择出相关适应度高的染色体
{
index++;
}
newpopulation[i]=population[index];
}
for(i=0;i<PopSize;i++)//将选择的新的染色体赋值回population[i]
{
population[i]=newpopulation[i];
// printf("%s\n",population[i].chrom);
}
// printf("选择结束\n");
}
/*******************************************************************************
进行交叉运算
*********************************************************************************/
void CrossoverOperator()
{
int i,j;
int index[POPSIZE];
int point,temp;
double p;
char ch;
srand( (unsigned)time( NULL ) );//保证rand()每次产生的数不一样
//进行随机交叉
for(i=0;i<PopSize;i++)
index[i]=i;
for(i=0;i<PopSize;i++)
{
point=rand()%(PopSize-i);
temp=index[i];
index[i]=index[point+i];
index[point+i]=temp;
}
//单点交叉
for(i=0;i<PopSize;i+=2)
{
p=rand()%1000/1000.0;
if(p<Pc)
{
point=rand()%(CHROMLENGTH-1)+1;//产生交叉位置
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;
}
}
// printf("%s\n",population[i].chrom);
// fprintf(fp,"%s\n",population[i].chrom);
}
// printf("交叉结束\n");
// fprintf(fp,"交叉结束\n");
}
/*********************************************************************************************
进行变异运算
**********************************************************************************************/
void MutationOperator()
{
int i,j;
double p;
srand( (unsigned)time( NULL ) );//保证rand()每次产生的数不一样
//位变异
for(i=0;i<PopSize;i++)
{
for(j=0;j<CHROMLENGTH;j++)
{
p=rand()%1000/1000.0;
if(p<Pm)
{
population[i].chrom[j]=(population[i].chrom[j]=='0')?'1':'0';
}
}
// printf("%s\n",population[i].chrom);
}
// printf("变异结束\n");
}
/**********************************************************************************************
打印结果
***********************************************************************************************/
void OutputTextReport()
{
int i;
double sum;
double average;
sum=0.0;
for(i=0;i<PopSize;i++)
sum+=population[i].value ;
average=sum/PopSize;
printf("gen= %d,avg=%f, best=%f,",generation,average,currentbest.value );
fprintf(fp,"\ngen:[%d] avg:%f best: %f\n",generation,average,currentbest.value);
fprintf(fp,"currentbest.chrom=");
for(i=0;i<CHROMLENGTH;i++)
{
printf("%c",currentbest.chrom[i]);
fprintf(fp,"%C",currentbest.chrom[i]);
}
fprintf(fp,"\n");
printf("\n");
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -