📄 gatest.cpp
字号:
{
stake[i]=para.chrom[i];
}
relatearray(stake);
time = calcutime(temp);
return time;
}
void caloptchrompt(chromnode pop[10]) /*计算种群适应度的值,并求出种群中最优染色体*/
{
int pos=0;
calchromfit(pop);
for(int i=0;i<10;i++)
{
totaltime[i] = fittotime(pop[i]);
}
chromsort(chrompop);
/*寻找种群最优染色体*/
comp=totaltime[0];
/*for(int j=0;j<10;j++)
{
if(comp >= totaltime[j])
{
comp = totaltime[j];
pos = j;
}
}*/
copychrom(bestchrom,pop[0]); /*记录种群最优染色体*/
}
void initialpop(int &v) /*种群初始化*/
{
for(int i=0;i<10;i++)
{
for(int j=0;j<5;j++)
{
vold[i][j]=rndom();
bool k=retreat(i,j);
while(k==1)
{
vold[i][j]=rndom();
k=retreat(i,j);
}
}
}
calfitness(vold);
}
void preselect(double pmsum[10],double randarray[10],int sortarray[10]) /*确定选择染色体位置*/
{
double seed=0;
for(int m=0;m<10;m++)
{
int num=0;
seed=randarray[m];
while(pmsum[num]<seed)
{ num++; }
sortarray[m]=num;
}
}
void select(chromnode pop[10],chromnode subpop[10]) /*选择算子*/
{
int sortsel[10];
double pm[10];
double pmsum[10];
double randarray[10];
for(int j=0;j<10;j++)
{
pm[j]=(double)pop[j].fitness/sumfit; /*计算染色体选择概率*/
if(j==0)pmsum[j]=pm[j];
pmsum[j+1]=pmsum[j]+pm[j]; /*计算染色体累积概率*/
}
randomsel(randarray,10); /*生成一个具有10个随机数的数组*/
preselect(pmsum,randarray,sortsel); /*进行轮盘赌选择*/
for(int n=0;n<10;n++)
{
int pos=sortsel[n];
copychrom(subpop[n],pop[pos]);
}
chromsort(subpop);
}
void mutation(chromnode pop[5]) /*变异算子*/
{
murandom(mupos);
for(int i=0;i<4;i++)
{
reversechrom(pop[i].chrom ,mupos[i][0],mupos[i][1]);
}
}
void generate(chromnode pop[10],chromnode subpop[10]) /*迭代产生新一代种群*/
{
select(pop,subpop);
for(int i=0;i<4;i++){ copychrom(midchrompop[i],subpop[i]); }
mutation(midchrompop);
for(int j=6;j<10;j++){ copychrom(subpop[j],midchrompop[j-6]); }
caloptchrompt(subpop);
chromsort(subpop);
}
void dispchrom(chromnode node,FILE *fp) /*输出染色体的值*/
{
printf("染色体基因值:");
fprintf(fp, "染色体基因值:");
for(int j=0;j<5;j++)
{
printf("[%d]",node.chrom[j]);
fprintf(fp, "[%d]",node.chrom[j]);
}
printf(" 适应度:");
fprintf(fp, " 适应度:");
printf("%f",node.fitness);
fprintf(fp, "%f",node.fitness);
}
void dispchrompop(chromnode pop[10],FILE *fp) /*输出全部种群染色体的值*/
{
int opttime=0;
sumtime=0;
sumfit=0; /*首先,将种群总适应度清零*/
for(int k=0;k<10;k++)
{
sumfit+=pop[k].fitness; /*计算种群概率之和*/
sumtime+=fittotime(pop[k]);
}
printf("种群总适应度:%f\n",sumfit);
fprintf(fp, "种群总适应度:%f\n",sumfit);
//printf("种群总加工时间:%d\n",sumtime);
//fprintf(fp, "种群总加工时间:%d\n",sumtime);
for(int i=0;i<10;i++)
{
dispchrom(pop[i],fp);
printf(" 加工总时间为:%d\n",totaltime[i]);
fprintf(fp, " 加工总时间为:%d\n",totaltime[i]);
}
printf("最优染色体:\n");
fprintf(fp, "最优染色体:\n");
dispchrom(bestchrom,fp);
opttime=fittotime(bestchrom);
printf(" 加工总时间为:%d\n",opttime);
fprintf(fp, " 加工总时间为:%d\n",opttime);
}
int main(int argc, char* argv[])
{
float store[50]; /*保存每次迭代中最优染色体的加工时间*/
int stbest[50]; /*保存历次迭代最优染色体适应度*/
float stsum[50]; /*保存历次迭代种群的总适应度*/
//float staver[50]; /*保存历次迭代种群的平均适应度*/
float stavtime[50];
float comfit=0;
float comtime=0;
int pos=0;
FILE *fp = NULL;
if ((fp = fopen("Evolution.txt", "w")) == NULL)
{
printf("Error, cannot open the file 'Evolution.txt'!\n");
exit(1);
}
printf( "* * * * * * * * * * * * * * * * * * * * * * * * * * *\n");
printf( "* *\n");
printf( "*大连海事大学-交通运输管理学院-04.三中队-管信四班*\n");
printf( "* 基于遗传算法的FlowShop算法-宋宁-2008.6.1 *\n");
printf( "* *\n");
printf( "* * * * * * * * * * * * * * * * * * * * * * * * * * *\n");
fprintf(fp, "* * * * * * * * * * * * * * * * * * * * * * * * * * *\n");
fprintf(fp, "* *\n");
fprintf(fp, "*大连海事大学-交通运输管理学院-04.三中队-管信四班*\n");
fprintf(fp, "* 基于遗传算法的FlowShop算法-宋宁-2008.6.1 *\n");
fprintf(fp, "* *\n");
fprintf(fp, "* * * * * * * * * * * * * * * * * * * * * * * * * * *\n");
initialpop(vold[0][0]); /*产生初始化种群*/
printf( "* * * * * * * * * * * * * * * * * * * * * * * * *\n");
printf( "* 初 始 化 种 群 *\n");
printf( "* * * * * * * * * * * * * * * * * * * * * * * * *\n");
fprintf(fp, "* * * * * * * * * * * * * * * * * * * * * * * * *\n");
fprintf(fp, "* 初 始 化 种 群 *\n");
fprintf(fp, "* * * * * * * * * * * * * * * * * * * * * * * * *\n");
caloptchrompt(chrompop); /*计算初始化种群适应度*/
dispchrompop(chrompop,fp); /*显示当前种群——chrompop*/
for(int i=0;i<50;i++)
{
printf( "* * * * * * * * * * * * * * * * * * * * * * * * *\n");
printf( "* 迭 代 结 果 *\n");
printf( "* * * * * * * * * * * * * * * * * * * * * * * * *\n");
fprintf(fp, "* * * * * * * * * * * * * * * * * * * * * * * * *\n");
fprintf(fp, "* 迭 代 结 果 *\n");
fprintf(fp, "* * * * * * * * * * * * * * * * * * * * * * * * *\n");
generate(chrompop,newchrompop); /*迭代产生新种群*/
for(int j=0;j<10;j++)copychrom(chrompop[j],newchrompop[j]); /*计算初始化种群适应度*/
caloptchrompt(chrompop);
printf("迭代次数:第 %d 次\n",i+1);
fprintf(fp, "迭代次数:第 %d 次\n",i+1);
dispchrompop(newchrompop,fp);
printf("\n");
fprintf(fp, "\n");
stsum[i]=sumfit; /*记录历次迭代新产生种群总适应度*/
//staver[i]=sumfit/10; /*记录历次迭代新产生种群平均适应度*/
store[i]=bestchrom.fitness; /*记录历次迭代新产生种群最优染色体适应度*/
stavtime[i]=(float)sumtime/10; /*记录历次迭代种群染色体平均加工时间*/
stbest[i]=fittotime(bestchrom); /*记录历次迭代新产生种群最优染色体加工时间*/
}
printf( "* * * * * * * * * * * * * * * * * * * * * * * * *\n");
printf( "* * 统 * 计 * 结 * 果 * *\n");
printf( "* * * * * * * * * * * * * * * * * * * * * * * * *\n");
fprintf(fp, "* * * * * * * * * * * * * * * * * * * * * * * * *\n");
fprintf(fp, "* * 统 * 计 * 结 * 果 * *\n");
fprintf(fp, "* * * * * * * * * * * * * * * * * * * * * * * * *\n");
printf("\n");
fprintf(fp, "\n");
printf("迭代次数||种群总适应度||种群平均加工时间||最优染色体适应度||最优染色体加工时间 \n");
fprintf(fp,"迭代次数||种群总适应度||种群平均加工时间||最优染色体适应度||最优染色体加工时间 \n");
for(int k=0;k<50;k++)
{
//printf("第%d次迭代新产生种群总适应度:%f 最优染色体适应度:%f\n",k+1,store[k],stbest[k]);
//fprintf(fp, "第%d次迭代新产生种群总适应度:%f 最优染色体适应度:%f\n",k+1,store[k],stbest[k]);
printf("%3d%18f%15f%17f%12d\n",k+1,stsum[k],stavtime[k],store[k],stbest[k]);
fprintf(fp, "%3d%18f%15f%17f%12d\n",k+1,stsum[k],stavtime[k],store[k],stbest[k]);
}
printf("\n");
fprintf(fp, "\n");
/*寻找适应度最优种群*/
comfit=stsum[0];
comtime=stavtime[0];
for(int n=0;n<50;n++)
{
if(comfit <= stsum[n])
{
comfit = stsum[n];
pos = n;
}
}
printf("种群总适应度最高代数:第%3d代||种群总适应度为:%f||平均加工时间为:%f\n",pos+1,comfit);
fprintf(fp, "种群总适应度最高代数:第%3d代||种群总适应度为:%f\n",pos+1,comfit);
fclose(fp);
printf("\n请注意, 如果要查看迭代详细过程,可以打开迭代结果文档(Evolution.txt)查看.\n");
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -