⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gatest.cpp

📁 求VC++基于遗传算法的流水线车间调度问题
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	{
		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 + -