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

📄 tfp.cpp

📁 本程序是基于Visual C++6.0平台采用C语言开发的求解铁路上无任何约束条件下技术站单组列车编组计划的单亲遗传算法源程序。
💻 CPP
📖 第 1 页 / 共 2 页
字号:

	k=21;
	n=5;
    for(i=sx[3]+1;i<=sx[4];i++)/*为第四个车站开出的列车*/
	    if(((*critter).chrom[i])==1)
		{
			a[k][0]=4;
			a[k][1]=statnum[i];
			a[k][2]=n;
			a[k][3]=flow[a[k][0]][a[k][2]];
			n=n+1;
			k=k+1;
		}

	k=28;
	n=6;
    for(i=sx[4]+1;i<=sx[5];i++)/*为第五个车站开出的列车*/
	    if(((*critter).chrom[i])==1)
		{
			a[k][0]=5;
			a[k][1]=statnum[i];
			a[k][2]=n;
			a[k][3]=flow[a[k][0]][a[k][2]];
			n=n+1;
			k=k+1;
		}
		
	k=35;
	n=7;
    for(i=sx[5]+1;i<=sx[6];i++)/*为第六个车站开出的列车*/
	    if(((*critter).chrom[i])==1)
		{
			a[k][0]=6;
			a[k][1]=statnum[i];
			a[k][2]=n;
			a[k][3]=flow[a[k][0]][a[k][2]];
			n=n+1;
			k=k+1;
		}

	k=42;
	n=8;
    for(i=sx[6]+1;i<=sx[7];i++)/*为第七个车站开出的列车*/
	    if(((*critter).chrom[i])==1)
		{
			a[k][0]=7;
			a[k][1]=statnum[i];
			a[k][2]=n;
			a[k][3]=flow[a[k][0]][a[k][2]];
 			n=n+1;
			k=k+1;
		}

/*每个车站改编车流计算*/
  for(i=6;i>=0;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=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,k,min=0;
  int flag2=0;
  int flag3;
  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;
}
/*变异操作*/
void    mutation()
{
	int i,j,k,n,m,s,flag2;
	int num,up,down;
	int chr[85]={0};
    srand( (unsigned)time( NULL ) ); 
    for(i=0;i<popsize;i++)
	{
		gxchromsx();
		num=randab(1,27);     /*在基因中产生变异位置*/
		up=chromsx[num-1];
		down=chromsx[num];
		for(j=up+1;j<=down;j++)
			newpop[i].chrom[j]=0;
		s=randab(up,down);
		newpop[i].chrom[s]=1;
	}

}

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;
	  }
}

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]));
			}
		}
}




⌨️ 快捷键说明

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