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

📄 line.cpp

📁 基于遗传算法的机器人路径规划问题.选择一条很好的路径
💻 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 + -