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