📄 tfp.cpp
字号:
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 + -