📄 line.cpp
字号:
//Line.cpp
//
#include "Line.h"
#include "definition.h"
void CLine::ReachGolf()
{ int i;
for (i=0;i<PopSize2;i++)
if (population2[i].chrom[0]=='0' || population2[i].chrom[99]=='0')
population2[i].flag=0;
}
void CLine::FreeWay()
{ int i,j;
for (i=0;i<PopSize2;i++)
for (j=0;j<CHROMLENGTH2;j++)
if (population2[i].chrom[j]=='1')
switch (j)
{ { case 11:
case 12:
case 15:
case 16:
case 22:
case 23:
case 33:
case 34:
case 35:
case 44:
case 45:
case 48:
case 49:
case 54:
case 55:
case 58:
case 59:
case 71:
case 72:
case 77:
case 81:
case 82:
case 87:
case 88:population2[i].flag=0;
}
}
}
void CLine::SerialWay()
{ int i,j,x1,x2,y1,y2,z1,z2,s;
for (i=0;i<PopSize2;i++)
{
for (j=0;j<CHROMLENGTH2-1;j++)
if ( population2[i].chrom[0]=='0' || population2[i].chrom[99]=='0')
{
population2[i].flag=0;
break;
}
else
{ if (population2[i].chrom[j]=='1')
{ z1=j;
s=j+1;
while (population2[i].chrom[s]=='0' && s<CHROMLENGTH2)
s++;
if (population2[i].chrom[s]=='1' && s<CHROMLENGTH2)
{ z2=s;
x1=z1%10;
x2=z2%10;
y1=z1/10;
y2=z2/10;
if (__max(abs(x2-x1),abs(y2-y1)) != 1)
{ population2[i].flag=0;break;}
else z1=z2;
}
}
}
}
}
void CLine::GenerateInitialPopulation(void)
{ int i,j;
srand((unsigned)time(NULL));
for (i=0;i<PopSize2;i++)
{ population2[i].chrom[0]=population2[i].chrom[99]='1';
for (j=1;j<CHROMLENGTH2-1;j++)
{
switch (j)
{ case 11:
case 12:
case 15:
case 16:
case 22:
case 23:
case 33:
case 34:
case 35:
case 44:
case 45:
case 48:
case 49:
case 54:
case 55:
case 58:
case 59:
case 71:
case 72:
case 77:
case 81:
case 82:
case 87:
case 88:population2[i].chrom[j]='0';break;
default:population2[i].chrom[j]=(rand()%10<5)?'0':'1';
}
population2[i].chrom[CHROMLENGTH2]='\0';
}
}
}
void CLine::DeleOperator(int t)
{ int i,j,x1,x2,y1,y2,num=0;
for (i=0;i<CHROMLENGTH2;i++)
{if (population2[t].chrom[i]=='1')
{ x1=i%10;y1=i/10;
for (j=i+1;j<CHROMLENGTH2;j++)
{
if (population2[t].chrom[j]=='1')
{ x2=j%10;
y2=j/10;
if (__max(abs(x2-x1),abs(y1-y2))==1)
num=j;
}
if (num!=0)
for (j=i+1;j<num;j++)
population2[t].chrom[j]='0';
num=0;
}
}
}
}
void CLine::InsertOperator()
{ int i,j,x1,x2,x3,y1,y2,y3,z1,z2,N,flag,s,a,zhi;
for (i=0;i<PopSize2;i++)
{
for (j=0;j<CHROMLENGTH2-1;j++)
if ( population2[i].chrom[0]=='0' || population2[i].chrom[99]=='0')
{
population2[i].flag=0;
break;
}
else
{if (population2[i].chrom[j]=='1')
{ z1=j;
s=j+1;
flag=1;
while (population2[i].chrom[s]=='0' && s<CHROMLENGTH2)
s++;
if (population2[i].chrom[s]=='1' && s<CHROMLENGTH2)
{ z2=s;
x1=z1%10;
x2=z2%10;
y1=z1/10;
y2=z2/10;
while (__max(abs(x2-x1),abs(y2-y1)) != 1)
{ x3=(x1+x2)/2;
y3=(y1+y2)/2;
N=x3+10*y3;
switch(N)
{ case 11:
case 12:
case 15:
case 16:
case 22:
case 23:
case 33:
case 34:
case 35:
case 44:
case 45:
case 48:
case 49:
case 54:
case 55:
case 58:
case 77:
case 81:
case 82:
case 87:
case 88:flag=0;break;
default:{ if (population2[i].chrom[N]=='1')
flag=0;
else {population2[i].chrom[N]='1';;j=0;}
}
}
if (flag==1) break;
if (flag==0)
if ((N-1)!=z1 && (N-1)!=z2)
{ flag=1;
switch(N-1)
{ case 11:
case 12:
case 15:
case 16:
case 22:
case 23:
case 33:
case 34:
case 35:
case 44:
case 45:
case 48:
case 49:
case 54:
case 55:
case 58:
case 59:
case 71:
case 72:
case 77:
case 81:
case 82:
case 87:
case 88:flag=0;break;
default:{ if (population2[i].chrom[N-1]=='1')
flag=0;
else{population2[i].chrom[N-1]='1';j=0;}
}
}
}
if (flag==1) break;
if (flag==0)
if ((N+1)!=z1 && (N+1)!=z2)
{flag=1;
switch(N+1)
{ case 11:
case 12:
case 15:
case 16:
case 22:
case 23:
case 33:
case 34:
case 35:
case 44:
case 45:
case 48:
case 49:
case 54:
case 55:
case 58:
case 59:
case 71:
case 72:
case 77:
case 81:
case 82:
case 87:
case 88:flag=0;break;
default:{ if (population2[i].chrom[N+1]=='1')
flag=0;
else {population2[i].chrom[N+1]='1';j=0;}
}
}
}
if (flag==1) break;
if (flag==0 )
break;
}
}
zhi=1;
for (a=0;a<CHROMLENGTH2;a++)
if (population2[i].chrom[a]!='1' && population2[i].chrom[a]!='0')
{ zhi=0;population2[i].flag=0;break;}
if (zhi==0) break;
if ( flag==0 || population2[i].chrom[0]=='0' || population2[i].chrom[CHROMLENGTH2]=='0')
{ population2[i].flag=0;break;}
else population2[i].flag=1;
}
}
}
}
void CLine::CalculateObjectValue(void)
{ int i,j,x1,x2,y1,y2,N1,N2,num,s;
double sum;
for (i=0;i<PopSize2;i++)
{ if (population2[i].flag==1)
{ N1=0;
j=0;
sum=0;
num=1;
while (j<CHROMLENGTH2)
{ s=j+1;
while (population2[i].chrom[s]=='0' && s<CHROMLENGTH2)
s++;
if (population2[i].chrom[s]=='1' && s<CHROMLENGTH2)
{ num++;
N2=s;
x1=N1%10;
x2=N2%10;
y1=N1/10;
y2=N2/10;
sum+=sqrt(pow((x1-x2),2)+pow((y1-y2),2));
}
j=s;
N1=N2;
}
if (j>=CHROMLENGTH2)
population2[i].value=(1.0+1.0/sqrt(num-1))*sum;
}
else population2[i].value=0;
}
}
void CLine::CalculateFitnessValue(void)
{ int i;
double temp;
for (i=0;i<PopSize2;i++)
{ if (population2[i].flag==1)
{
if (FunctionMode2==MAXIMIZATION2)
{ if ((population2[i].value+Cmin2)>0.0)
{ temp=Cmin2+population2[i].value;}
else { temp=0.0;}
}
if (FunctionMode2==MINIMIZATION2)
{ if (population2[i].value<Cmax2)
{ temp=Cmax2-population2[i].value;}
else { temp=0.0;}
}
population2[i].fitness=temp;
}
else population2[i].fitness=0.0;
}
}
void CLine::FindBestAndWorstIndividual(void)
{ int i,s=0;
double sum=0.0;
while (population2[s].flag!=1 && s<PopSize2)
s++;
if (population2[s].flag==1 && s<PopSize2)
{ bestindividual2=population2[s];
worstindividual2=population2[s];
}
for (i=1+s;i<PopSize2;i++)
{ if (population2[i].flag==1)
{
if (population2[i].fitness>bestindividual2.fitness)
{ bestindividual2=population2[i];
best_index2=i;
}
else if (population2[i].fitness<worstindividual2.fitness)
{ worstindividual2=population2[i];
worst_index2=i;
}
sum+=population2[i].fitness;
}
}
if (generation2==0 )
{ currentbest2=bestindividual2;}
else if (bestindividual2.fitness>currentbest2.fitness && bestindividual2.flag==1)
{ currentbest2=bestindividual2;
for (i=0;i<CHROMLENGTH2;i++)
{ cout<<currentbest2.chrom[i];
if ((i+1)%10==0)
cout<<endl;
}
cout<<endl;
}
}
void CLine::PerformEvolution(void)
{ if (bestindividual2.fitness>currentbest2.fitness)
{ currentbest2=population2[best_index2];}
else { population2[worst_index2]=currentbest2;}
}
void CLine::SelectionOperator(void)
{ int i,j=0,index;
double p,sum=0.0;
double cfitness[POPSIZE2];
struct individual2 newpopulation[POPSIZE2];
for (i=0;i<PopSize2;i++)
{ sum+=population2[i].fitness;}
for (i=0;i<PopSize2;i++)
{ cfitness[i]=population2[i].fitness/sum;}
for (i=1;i<j;i++)
{ cfitness[i]=cfitness[i-1]+cfitness[i];}
for (i=0;i<PopSize2;i++)
{ p=rand()%1000/1000.0;
index=0;
while (p>cfitness[index])
index++;
newpopulation[i]=population2[index];
}
for (i=0;i<PopSize2;i++)
{ population2[i]=newpopulation[i];}
}
void CLine::CrossoverOperator(void)
{ int i,j,s,k;
int index[POPSIZE2],flag[CHROMLENGTH2];
int point,temp;
double p;
char ch;
for (i=0;i<PopSize2;i++)
{ index[i]=i;}
for (i=0;i<PopSize2;i++)
{ point=rand()%(PopSize2-i);
temp=index[i];
index[i]=index[point+i];
index[point+i]=temp;
}
for (i=0;i<PopSize2-1;i+=2)
{ p=rand()%1000/1000.0;
if (p<Pc2)
{ s=0;
for (k=0;k<CHROMLENGTH2-1;k++)
if (population2[index[i]].chrom[k]==population2[index[i+1]].chrom[k] && population2[index[i]].chrom[k]=='1')
{flag[s+1]=k;s++;}
if (s)
point=flag[rand()%s+1];
else point=rand()%(CHROMLENGTH2-1)+1;
for (j=point;j<CHROMLENGTH2;j++)
{ ch=population2[index[j]].chrom[j];
population2[index[i]].chrom[j]=population2[index[i+1]].chrom[j];
population2[index[i+1]].chrom[j]=ch;
}
}
}
}
void CLine::MutationOperator(void)
{ int i,j;
double p;
for (i=0;i<PopSize2;i++)
{ p=rand()%1000/1000.0;
if (p<Pm2)
{ j=rand()%98+1;
population2[i].chrom[j]=(population2[i].chrom[j]=='0')?'1':'0';
}
population2[i].chrom[0]='1';
population2[i].chrom[CHROMLENGTH2]='1';
}
}
void CLine::OutputTextReport(void)
{ int i;
if (currentbest2.flag)
{ for (i=0;i<CHROMLENGTH2;i++)
{ cout<<currentbest2.chrom[i];
if ((i+1)%10==0)
cout<<endl;
}
cout<<endl;
}
cout<<"路经:"<<endl;
for (i=0;i<CHROMLENGTH2;i++)
if (currentbest2.chrom[i]=='1')
cout<<i<<" ,";
cout<<endl;
cout<<currentbest2.value<<","<<currentbest2.flag<<endl;
cout<<endl;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -