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

📄 tfp.cpp

📁 本程序是基于Visual C++6.0平台采用C语言开发的求解铁路上无任何约束条件下技术站单组列车编组计划的双亲遗传算法源程序。
💻 CPP
📖 第 1 页 / 共 2 页
字号:
         flowcg[a[i][0]][a[i][1]]+=flowcg[a[i][0]][a[i][2]];
         flowcg[a[i][1]][a[i][2]]+=flowcg[a[i][0]][a[i][2]];
         gbeachstat[a[i][1]]+=flowcg[a[i][0]][a[i][2]];
		 flowcg[a[i][0]][a[i][2]]=0;
	  }
  for(i=13;i>=7;i--)
	  if(a[i][1]!=a[i][2])
	  {
         flowcg[a[i][0]][a[i][1]]+=flowcg[a[i][0]][a[i][2]];
         flowcg[a[i][1]][a[i][2]]+=flowcg[a[i][0]][a[i][2]];
         gbeachstat[a[i][1]]+=flowcg[a[i][0]][a[i][2]];
		 flowcg[a[i][0]][a[i][2]]=0;
	  }
  for(i=20;i>=14;i--)
	  if(a[i][1]!=a[i][2])
	  {
         flowcg[a[i][0]][a[i][1]]+=flowcg[a[i][0]][a[i][2]];
         flowcg[a[i][1]][a[i][2]]+=flowcg[a[i][0]][a[i][2]];
         gbeachstat[a[i][1]]+=flowcg[a[i][0]][a[i][2]];
		 flowcg[a[i][0]][a[i][2]]=0;
	  }
  for(i=27;i>=21;i--)
	  if(a[i][1]!=a[i][2])
	  {
         flowcg[a[i][0]][a[i][1]]+=flowcg[a[i][0]][a[i][2]];
         flowcg[a[i][1]][a[i][2]]+=flowcg[a[i][0]][a[i][2]];
         gbeachstat[a[i][1]]+=flowcg[a[i][0]][a[i][2]];
		 flowcg[a[i][0]][a[i][2]]=0;
	  }
  for(i=34;i>=28;i--)
	  if(a[i][1]!=a[i][2])
	  {
         flowcg[a[i][0]][a[i][1]]+=flowcg[a[i][0]][a[i][2]];
         flowcg[a[i][1]][a[i][2]]+=flowcg[a[i][0]][a[i][2]];
         gbeachstat[a[i][1]]+=flowcg[a[i][0]][a[i][2]];
		 flowcg[a[i][0]][a[i][2]]=0;
	  }
   for(i=41;i>=35;i--)
	  if(a[i][1]!=a[i][2])
	  {
         flowcg[a[i][0]][a[i][1]]+=flowcg[a[i][0]][a[i][2]];
         flowcg[a[i][1]][a[i][2]]+=flowcg[a[i][0]][a[i][2]];
         gbeachstat[a[i][1]]+=flowcg[a[i][0]][a[i][2]];
		 flowcg[a[i][0]][a[i][2]]=0;
	  }
   for(i=48;i>=42;i--)
	  if(a[i][1]!=a[i][2])
	  {
         flowcg[a[i][0]][a[i][1]]+=flowcg[a[i][0]][a[i][2]];
         flowcg[a[i][1]][a[i][2]]+=flowcg[a[i][0]][a[i][2]];
         gbeachstat[a[i][1]]+=flowcg[a[i][0]][a[i][2]];
		 flowcg[a[i][0]][a[i][2]]=0;
	  }

	/*统计各车站发车数目*/
    /*第一个车站*/
    m=0;
	for(i=0;i<7;i++)
	  if((a[i][1]==a[i][2])&&a[i][1]!=0)
			m=m+1;
	fache[1]=m-1;          /*每站往下一站都要开行列车,该列车的开行不能计入集结消耗*/
   /*第二个车站*/
    m=0;
	for(i=7;i<14;i++)
	  if((a[i][1]==a[i][2])&&a[i][1]!=0)
			m=m+1;
	fache[2]=m-1;	
  /*第三个车站*/
    m=0;
	for(i=14;i<21;i++)
	  if((a[i][1]==a[i][2])&&a[i][1]!=0)
			m=m+1;
	fache[3]=m-1;	
	/*第四个车站*/
    m=0;
	for(i=21;i<28;i++)
	  if((a[i][1]==a[i][2])&&a[i][1]!=0)
			m=m+1;
	fache[4]=m-1;	
	/*第五个车站*/
    m=0;
	for(i=28;i<35;i++)
	  if((a[i][1]==a[i][2])&&a[i][1]!=0)
			m=m+1;
	fache[5]=m-1;	
    /*第六个车站*/
    m=0;
	for(i=35;i<42;i++)
	  if((a[i][1]==a[i][2])&&a[i][1]!=0)
			m=m+1;
	fache[6]=m-1;	
   /*第七个车站*/
	m=0;
	for(i=42;i<49;i++)
	  if((a[i][1]==a[i][2])&&a[i][1]!=0)
			m=m+1;
	fache[7]=m-1;


    for(i=1;i<N;i++)
		jijie1+=jijie2[i]*(float)fache[i];
	jijie1=jijie1*avavehicle;
	for(i=1;i<N;i++)
		gaibian1+=gaibian2[i]*(float)gbeachstat[i];
   (*critter).gaibian=gaibian1;
   (*critter).jijie=jijie1;
   (*critter).fitness=jijie1+gaibian1;
   totalfit=totalfit+30000-(*critter).fitness;/*为了轮盘赌选择,考虑到目标函数是最小,所以进行转化*/
 }

/*对种群中个体的适应度排序函数*/
void    evaluat(struct  individual *pop,int gen)
{
	int i,j;
	float total=0;
	struct individual temp1;
    for(i=0;i<popsize;i++)
		for(j=i+1;j<popsize;j++)
		  if((*(pop+i)).fitness>(*(pop+j)).fitness)
		  {
            temp1=*(pop+i);
			*(pop+i)=*(pop+j);
            *(pop+j)=temp1;
		  }
   for(i=0;i<popsize;i++)
	   (*(pop+i)).xdfit=(30000-(*(pop+i)).fitness)/totalfit;
   for(i=0;i<popsize;i++)
   {
	   total=total+(*(pop+i)).xdfit;
	   (*(pop+i)).xdfits=(*(pop+i-1)).xdfitf;
	   (*(pop+i)).xdfitf=total;
   }
   (*(pop)).xdfits=0;
   (*(pop)).xdfitf=(*(pop)).xdfit; 
}


/*选择操作=轮盘赌选择+精英个体保存*/
/*其新种群适应度暂时不计算,等交叉变异完成之后再计算*/

void    selection()
{
  float r;
  int i,j,m,min=0;
  int flag2=0;
  totalfit=0;

  srand( (unsigned)time( NULL ) );  
  for(m=0;m<popsize;m++)
		{
		  r=rand01();
		  for(i=0;i<popsize;i++)
			  if((r>oldpop[i].xdfits)&&(r<=oldpop[i].xdfitf))
				{
				  for(j=1;j<85;j++)
					  newpop[m].chrom[j]=oldpop[i].chrom[j];
				   newpop[m].fitness=oldpop[i].fitness;
				   newpop[m].jijie=oldpop[i].jijie;
				   newpop[m].gaibian=oldpop[i].gaibian;
				}
		}
   /* 新种群中第一个个体保存最佳个体*/ 
   for(i=0;i<85;i++)
       newpop[0].chrom[i]=bestever.chrom[i];
    newpop[0].fitness=bestever.fitness;
    newpop[0].gaibian=bestever.gaibian;
    newpop[0].jijie=bestever.jijie;
	   
	for(j=0;j<popsize;j++)  
       calculfit(&(newpop[j]));
	totalfit=0;
    for(i=0;i<popsize;i++)/*方便计算自适应交叉中的随机交叉概率*/
       totalfit+=30000-newpop[i].fitness;
}


/*交叉操作,单点交叉+双点交叉*/
void    crossover()
{
    gxchromsx();
    srand( (unsigned)time( NULL ) ); 
    if(rand01()<0.8)
        ddjc();
    else
        sdjc();
}
void ddjc()
{
	int pop,i,j,cj1,cj2,crossn_1;
	int chromtmp;
	int num1=0,num2=0;
	pop=popsize/2;
  	/*单点交叉*/
	chromsx[0]=0;
    gxchromsx();  
    srand( (unsigned)time( NULL ) ); 
     for(i=0;i<pop;i++)
	 {
	   cj1=randab(0,popsize-1);  /*[0,popsize-1]*/
	   cj2=randab(0,popsize-1);  /*[0,popsize-1]*/
	    if(newpop[cj1].fitness==newpop[cj2].fitness)
		{
	 	   zsyjc(cj1);
	 	   zsyjc(cj2);
		}
	     else
		 {
		   if(rand01()>pcross)
			   continue;
		   else
		   {
			   gxchromsx();
			   crossn_1=randab(1,27);/*产生交叉点所在编码块[2,27]*/
			   num1=chromsx[crossn_1]+1;
			   for(j=num1;j<85;j++)
			   {
				   chromtmp=newpop[cj1].chrom[j];
				   newpop[cj1].chrom[j]=newpop[cj2].chrom[j];
				   newpop[cj2].chrom[j]=chromtmp;
			   }
		   }
		 }
	 }
   calculfit(&(newpop[cj1]));
   calculfit(&(newpop[cj2]));
}
void sdjc()/*双点交叉*/
{
	int pop,i,j,cj1,cj2,crossn_1,crossn_2;
	int chromtmp,temp;
	int num1=0,num2=0;
	pop=popsize/2;
    gxchromsx();    
	srand((unsigned)time(NULL));
    for(i=0;i<pop;i++)
	   {
	    cj1=randab(0,popsize-1);
	    cj2=randab(0,popsize-1);
	    if(newpop[cj1].fitness==newpop[cj2].fitness)
		{
	 	   zsyjc(cj1);
	 	   zsyjc(cj2);
		}
	     else
		 {
		   if(rand01()>pcross)
			   continue;
		   else
		   {
			   crossn_1=randab(1,27);
			   crossn_2=randab(1,27);
			   while(crossn_1==crossn_2)
				   crossn_2=randab(1,27);
               gxchromsx();
			   num1=chromsx[crossn_1];
			   num2=chromsx[crossn_2];
			   if(num1>num2)/*保证num1存放的值比num2的小*/
			   {
				   temp=num1;
				   num1=num2;
				   num2=temp;
			   }
			   
			   for(j=num1+1;j<=num2;j++)
			   {
				   chromtmp=newpop[cj1].chrom[j];
				   newpop[cj1].chrom[j]=newpop[cj2].chrom[j];
				   newpop[cj2].chrom[j]=chromtmp;
			   }
		   }
		 }
	 }
	calculfit(&(newpop[cj1]));
	calculfit(&(newpop[cj2]));
} 


void zsyjc(int a)/*自适应交叉*/
{
	int num,j,up,n,down;
 	srand((unsigned)time(NULL));
        gxchromsx();
		num=randab(1,28);     /*在基因中产生变异块*/
        up=chromsx[num-1];
		down=chromsx[num];
		for(j=up+1;j<=down;j++)
			newpop[a].chrom[j]=0;
		if(up>down)
			printf("自适应交叉中随机书产生出错!\n");
		n=randab(up,down);
		newpop[a].chrom[n]=1;
    calculfit(&(newpop[a]));
}
void check()
{
	int i,j,k,up,down,flag3,checked[29]={0},m,n;

		for(i=0;i<popsize;i++)
		{
			flag3=0;
			for(j=0;j<29;j++)
				checked[j]=0;
			for(j=1;j<29;j++)
			{
				gxchromsx();
				m=chromsx[j-1];
				n=chromsx[j];
				for(k=m+1;k<=n;k++)
					checked[j]+=newpop[i].chrom[k];
			}
			for(j=1;j<29;j++)
				if(checked[j]!=1)
					flag3=1;
			if(flag3==1)
			{
		       for(j=0;j<85;j++)
			      newpop[i].chrom[j]=0;
	           for(j=1;j<29;j++)/*染色体初始化*/
			   {
			      gxchromsx();
			      up=chromsx[j-1];
			      down=chromsx[j];
			      k=randab(up,down);/*可以产生(a,b]区间的整数*/
			      newpop[i].chrom[k]=1; 
			   }
               calculfit(&(newpop[i]));
			}
		}
}


/*变异操作*/
void    mutation()
{
	int i,j,k,n,m;
	int num,up,down;
	int chr[85]={0};
    srand( (unsigned)time( NULL ) ); 
    for(i=0;i<popsize;i++)
	{
		if(rand01()<pmutation)
		{
			k=randab(0,3);
			for(m=0;m<k;m++)
			{
				gxchromsx();
				num=randab(1,27);     /*在基因中产生变异位置*/
				up=chromsx[num-1];
				down=chromsx[num];
				for(j=up+1;j<=down;j++)
					newpop[i].chrom[j]=0;
				n=randab(up,down);
				newpop[i].chrom[n]=1;
			}
		}
		else
			continue;
	}

}

int randab(int a, int b)         /*产生(a-b]之间的随机整数*/
{
  int  n,range;
  double j;
  if(a>b) 
  {
	exit(1);
  }
  else
	  if(a==b)
		  return a;
	  else
	  {
	   range=b-a;
       n=rand();                       /*调用rand(),得到新的随机数;*/ 
       j=((float)n/(float)RAND_MAX); /*把随机数除以RAND_MAX,从而产生一个在0到1之间的校正值;*/ 
       n=(int)(j*(float)range)+1;     /*把校正值乘以所需要的范围值(即500-50)从而产生一个在a到b之间的值*/ 
       n+=a;                           /*把该值和所要求的最小值相加,从而使该值最终落在正确的取值范围----a到b之间。*/ 
       return n;
	  }
}

float rand01()/*产生0-1之间的随机数*/
{ 
	float i;
    i=(float)rand()/(RAND_MAX);
    return i;
}
void gxchromsx()
{
	int i,j,sum;
	 chromsx[0]=0;
	  for(i=1;i<29;i++)
	  {
		sum=0;
		for(j=1;j<=i;j++)
			sum+=chromnum[j];
		chromsx[i]=sum;
	  }
}





⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -