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

📄 c2.cpp

📁 遗传算法
💻 CPP
字号:
#include <cstdlib>//见【对程序的分析】
#include <ctime>//内置类型 顾名思义,用作时间存储和处理的  就是long 
#include <iostream>//包含了一系列模板化的I/O类  换成#include   <iostream>的话,要加一句using   namespace   std;   
  //或把cout改成std::cout,end改成std::endl等等

#include<cmath>//cmath是c++标准风格的头文件,位于std命名空间,用法和math.h差不多,都是包含一些常见的数学函数


#include<vector>
#include<algorithm>//和#include<vector>都是标准C++库的两个头文件,都属于STL库  MSDN

int main( )

{ 

using namespace std;//名字空间 

 cout<<"定义变量"<<endl;

vector <int> v1,v3,v4,t1,t2;
   vector<double>v5,v6;
   vector <int>::iterator iter,iter3,iiter,new_end;
    vector< vector<int> >::iterator iter2;
vector< vector<int> > v2,v7,v8;
vector<double>::iterator iter5;

cout<<"初始群体"<<endl;
int ii;
for(ii=0;ii<=9;ii++){
      int i;
      for ( i = 0 ; i <= 9; i++ )
      v1.push_back( i );//v1.push_back在尾部加入一个数据

   random_shuffle ( v1.begin( ), v1.end( ) );
   v2.push_back (v1);

     
cout << "v1 =" ;
for ( iter = v1.begin( ) ; iter != v1.end( ) ; iter++ )
      cout << " " << *iter;
   cout << endl;
cout <<"v1 size is "<<v1.size () << endl;

   v1.clear();
    }

   
cout << "v2 all value is " <<endl;
for ( iter2 = v2.begin( ); iter2 != v2.end() ; iter2++ )

{ v1.clear ();
           v1=*iter2;
   for(iter=v1.begin ();iter!=v1.end ();iter++)
  
    cout << *iter << " ";
    cout<<endl;
}
cout <<"size is "<<v2.size () << endl;


cout<<"以下是算子,有三步,选择,变异,交叉.其中选择包括评价"<<endl;

cout<<"选择"<<endl;

cout<<"定义距离矩阵"<<endl;

int b[][10]=      { 0, 1, 4, 6, 8, 1, 3, 7, 2, 9,
                    1, 0, 7, 5, 3, 8, 3, 4, 2, 4,
                    4, 7, 0, 3, 8, 3, 7, 9, 1, 2,
                    6, 5, 3, 0, 3, 1, 5, 2, 9, 1,
                    8, 3, 8, 3, 0, 2, 3, 1, 4, 6,
                    1, 8, 3, 1, 2, 0, 3, 3, 9, 5,
                    3, 3, 7, 5, 3, 3, 0, 7, 5, 9,
                    7, 4, 9, 2, 1, 3, 7, 0, 1, 3,
                    2, 2, 1, 9, 4, 9, 5, 1, 0, 1,
                    9, 4, 2, 1, 6, 5, 9, 3, 1, 0
                   
};


int p;
for(p=1;p<10;p++){

cout<<"初始原始适应度"<<endl;
v3.clear ();
int sum =0;
for ( iter2 = v2.begin( ); iter2 != v2.end() ; iter2++ )
{ 
   for(iter=(*iter2).begin ();iter!=((*iter2).end ()-1);iter++){
     sum+=b[*iter][*(iter+1)];
     cout << b[*iter][*(iter+1)]<< " ";}
       cout<<b[*((*iter2).begin ())][*((*iter2).end ()-1)]<<" ";
        sum+=b[*((*iter2).begin ())][*((*iter2).end ()-1)];
          v3.push_back (sum);
   cout<<"sum= "<<sum<<endl;
   sum=0;
}

cout << "v3 =" ;
for ( iter = v3.begin( ) ; iter != v3.end( ) ; iter++ )
      cout << " " << *iter;
   cout << endl;
cout <<"size is "<<v3.size () << endl;





cout<<"初始转盘适应值"<<endl;
v4.assign (v3.begin (),v3.end ());

sort(v4.begin (),v4.end ());

cout << "v4 =" ;
for ( iter = v4.begin( ) ; iter != v4.end( ) ; iter++ )
      cout << " " << *iter;
   cout << endl;
cout <<"size is "<<v4.size () << endl;


double m=0;
double alpha=0.5;
v5.clear ();
for(iter=v3.begin();iter!=v3.end ();iter++ ){
int n=1;
for(iter3=v4.begin ();iter3!=v4.end ();iter3++){
  
   if(*iter!=*iter3) n++;
   else {    
    cout<<n<<endl;
        m=alpha*pow(1-alpha,(double)n);
           break;
   }
}
     v5.push_back (m);

}
cout << "v5 =" ;
for ( iter5 = v5.begin( ) ; iter5 != v5.end( ) ; iter5++ )
      cout << " " << *iter5;
   cout << endl;
cout <<"size is "<<v5.size () << endl;




cout<<"初始转盘"<<endl;
v6.clear ();
for ( iter5 = v5.begin( ) ; iter5 != v5.end( ) ; iter5++ ){
   m+=(*iter5)*1000;
   v6.push_back (m);

}
    double r=m;
cout<< r <<endl;

cout << "v6 =" ;
for ( iter5 = v6.begin( ) ; iter5 != v6.end( ) ; iter5++ )
      cout << " " << *iter5;
   cout << endl;
cout <<"size is "<<v6.size () << endl;




cout<<"转盘选择群体v7"<<endl;

v7.clear ();

for ( iter2 = v2.begin( ); iter2 != v2.end() ; iter2++ ){
          double cw =(double) rand()/ (RAND_MAX + 1) * r;
     int n=0;
    for ( iter5 = v6.begin( ) ; iter5 != v6.end( ) ; iter5++ ){
    
   if(cw>*iter5)n++;
    else {cout<<n<<endl;
   v7.push_back (*(v2.begin ()+n));
     break;
             }
    }
}
cout << "all v7 value is " <<endl;

for ( iter2 = v7.begin( ); iter2 != v7.end() ; iter2++ )

{ v1.clear ();
           v1=*iter2;
   for(iter=v1.begin ();iter!=v1.end ();iter++)
  
    cout << *iter << " ";
    cout<<endl;
}





cout<<"随机变异"<<endl;
srand( (unsigned)time( NULL ) );

         int low, high,ab;
      int range_max =10;


       low =(double) rand()/ (RAND_MAX + 1) * range_max;
    
     high=(double) rand()/ (RAND_MAX + 1) * range_max;
   
   for ( iter2 = v7.begin( ); iter2 != v7.end() ; iter2++ ){
             ab=(double) rand()/ (RAND_MAX + 1) * range_max;
    if(ab==(iter2-v7.begin ())){
          iter=(*iter2).begin ();
    swap(*(iter+ low) ,*(iter+ high) );
    }
  
   }
cout << "v2 all value is " <<endl;
for ( iter2 = v7.begin( ); iter2 != v7.end() ; iter2++ )

{ v1.clear ();
           v1=*iter2;
   for(iter=v1.begin ();iter!=v1.end ();iter++)
  
    cout << *iter << " ";
    cout<<endl;
}

cout<<"变异位";

cout << low<< " "<<high<<"变异量值 "<<ab;
              cout<<endl;




cout<<"交叉fuck"<<endl;
int i;
v1.clear ();
    for ( i = 0 ; i <= 9; i++ )
      v1.push_back( i );
vector<int> vv1,vv2,s1,s2;
random_shuffle ( v1.begin( ), v1.end( ) );
for(iter=v1.begin ();iter!=v1.end ();iter++)
  
    cout << *iter << " ";
    cout<<endl;
//iter=v1.begin ();
    v8.clear ();
for(iiter=v1.begin ();iiter!=v1.end ();iiter+=2){
   cout<<"now is "<<*iiter<<endl;
vv1.assign((*(v7.begin ()+(*iiter))).begin () ,(*(v7.begin ()+(*iiter))).end());
vv2.assign((*(v7.begin ()+(*(iiter+1)))).begin () ,(*(v7.begin ()+(*(iiter+1)))).end ());
cout<<"vv1 is "<<endl;

for(iter=vv1.begin ();iter!=vv1.end ();iter++)
  
    cout << *iter << " ";
    cout<<endl;
cout<<"vv2 is "<<endl;
    for(iter=vv2.begin ();iter!=vv2.end ();iter++)
  
    cout << *iter << " ";
    cout<<endl;

    
              srand( (unsigned)time( NULL ) );

         int lo, hig;
int range_max =10;
    while(1){ 
       lo =(double) rand()/ (RAND_MAX + 1) * range_max;  
     hig=(double) rand()/ (RAND_MAX + 1) * range_max;
     if( hig > lo )
      break;
     else if( hig< lo )
     {
      swap( lo , hig );
      break;
     }
    } 
    cout<<" low and high postion is ";
     cout << lo<< ", "<<hig;
              cout<<endl;

     
s1.assign(vv1.begin()+lo, vv1.begin ()+hig);
s2.assign (vv2.begin()+lo, vv2.begin ()+hig);

cout<<"the son1 of the vv1 is,same 交叉段是 ";
for(iter=s1.begin ();iter!=s1.end ();iter++)
  
    cout << *iter << " ";
    cout<<endl;

    cout<<"the son2 of the vv2 is,same 交叉段是 ";
for(iter=s2.begin ();iter!=s2.end ();iter++)
  
    cout << *iter << " ";
    cout<<endl;

for (iter = s2.begin(); iter != s2.end(); iter++)
new_end = remove( vv1.begin( ), vv1.end( ),*iter);

cout<<"after remove all son2 of vv2 ,vv1 is "<<endl;
for(iter=vv1.begin ();iter!=vv1.end ();iter++)
  
    cout << *iter << " ";
    cout<<endl;

    for (iter = s1.begin(); iter != s1.end(); iter++)
new_end = remove( vv2.begin( ), vv2.end( ),*iter);

cout<<"after remove all son1 ,vv2 is "<<endl;
for(iter=vv2.begin ();iter!=vv2.end ();iter++)
  
    cout << *iter << " ";
    cout<<endl;


int d=(int )vv1.size ()-hig+lo;

t1.assign (vv1.begin() ,vv1.begin() +d);

cout<<"after assign,t1 is "<<endl;
for(iter=t1.begin ();iter!=t1.end ();iter++)
  
    cout << *iter << " ";
    cout<<endl;

     t2.assign (vv2.begin() ,vv2.begin() +d);

cout<<"after assign,t2 is "<<endl;
for(iter=t2.begin ();iter!=t2.end ();iter++)
  
    cout << *iter << " ";
    cout<<endl;

t1.insert (t1.begin ()+lo,s2.begin (),s2.end ());
cout<<"after insert son2 of vv2 ,t1 is "<<endl;
for(iter=t1.begin ();iter!=t1.end ();iter++)
  
    cout << *iter << " ";
    cout<<endl;

t2.insert (t2.begin ()+lo,s1.begin (),s1.end ());
cout<<"after insert son1 of vv1 ,t2 is "<<endl;
for(iter=t1.begin ();iter!=t1.end ();iter++)
  
    cout << *iter << " ";
    cout<<endl;


   v8.push_back (t1);
   v8.push_back (t2);

}

cout << "v8 all value is " <<endl;
for ( iter2 = v8.begin( ); iter2 != v8.end() ; iter2++ )

{ v1.clear ();
           v1=*iter2;
   for(iter=v1.begin ();iter!=v1.end ();iter++)
  
    cout << *iter << " ";
    cout<<endl;
}

v2.assign (v8.begin (),v8.end ());
    
cout << "v2 all value is " <<endl;
for ( iter2 = v2.begin( ); iter2 != v2.end() ; iter2++ )

{ v1.clear ();
           v1=*iter2;
   for(iter=v1.begin ();iter!=v1.end ();iter++)
  
    cout << *iter << " ";
    cout<<endl;
}
cout <<"size is "<<v2.size () << endl;
}

}

 

⌨️ 快捷键说明

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