遗传算法小试刀

/*
1. 生成初始群
2.计算适应度
3.选择复制
交叉
变异
生成新一代种群

问题:
利用遗传算法求区间【1,31 】上的二次函数y=x2



请在如下的环境下操作该程序:
===================================
||    encode : utf8              || 
||    operating system : linux   ||
||    tools : g++                ||
===================================
*/
#include<iostream>
#include<stdio.h>
#include<bitset>
#include<ctime>
#include<stdlib.h>
#include<vector>
using namespace std ;
//定义适应度函数
#define function x*x
//初始种群的大小
#define SIZE 6
//种群的编码位数
#define BIT  5
#define BIT_DOUBLE 1000000
//交叉率
#define PC 0.7
//交叉位数
#define PC_SIZE 2
int PCF=0;
//变异率
#define PM 0.001

int flag[2]={0};
int n=0;
int main( void )
{

    //2. 设定种群规模,产生初始种群
    cout<<"please input 6  numbers(1-31): ";
    int n;
    cin>>n ;
    vector<int> data1;
    for(int i=1 ; i <=n ; i ++ )
    {
        int tem ;
        cin>>tem ;
        data1.push_back(tem);

    }
    void PCD(vector<int> data);
    PCD(data1);
    return 0;
}
//Type 返回的随机数容器 ,RandCounts 容器的个数 ,RandBits 每个随机数的位数
template <class Type>
vector<Type> RandFunction(vector<Type> data,int RandCounts,int RandBits)
{
      Type r=0;
      for(int i =0 ; i< RandCounts; i++ )
      {
            r=0;
            for(int j =0 ;j<=RandBits;j++ )
                r=r*10+rand()%10;
            data.push_back(r);
       }
      return data ;
}
template <class Type>
Type selection(Type data)
{
        cout<<"--------------------------"<<endl;
        vector<double> R;
        vector<int>::iterator data_iterator = data.begin();
        //总数
        double sum = 0;
        while(data_iterator!=data.end())
        {
            double x=*data_iterator;
            sum+=function;
            ++data_iterator;
        }
        double temp =0 ;
        cout<<"总数位"<<sum<<endl;
        for(int i =0;i<SIZE;i++)
        {
            double x=data[i];
            temp+=(function/sum);
            cout<<"每条染色体的积累概率为:"<<data[i]<<":"<<temp<<" "<<endl;
            R.push_back(temp);
        }
        //   function
        // B:随机数
        vector<double> Ran;
        vector<double>::iterator Ran_iterator;
        Ran=RandFunction(Ran,SIZE,BIT);
        for(int i= 0; i<SIZE; i++ )
        {
            Ran[i]=Ran[i]/BIT_DOUBLE;
            cout<<"随机的筛选率:"<<"第"<<i+1<<"次"<<":"<<Ran[i]<<endl;
        }
        int flag[SIZE]={0};
        Ran_iterator=Ran.begin();
        //积累率的迭代器
        vector<double>::iterator R_iterator;
        data_iterator=data.begin();
        while(Ran_iterator!=Ran.end())
        {
           int i = 0 ;
           R_iterator=R.begin();
           while(R_iterator!=R.end())
           {
		
               if(*Ran_iterator<=*R_iterator)
		{
	       		flag[i]++;
                	cout<<"本次被选择的染色体是: "<<data[i]<<"这条染色体以被选择的次数未:"<<""<<flag[i]<<endl;
                        break;
                }
               ++R_iterator;
               i++;
           }
           ++Ran_iterator;
        }
        //C:去掉不符合的数据
        data_iterator=data.begin();
        cout<<"没有选择复制之前的染色体为:"<<endl;
        for(int i= 0 ;i <SIZE ; i ++ )     
        {
            cout<<data[i]<<" ";
            if(flag[i]==0)
            {
                for(int j= 0; j<SIZE ; j++ )
                {
                    if(flag[j]>1)
                    {
                        cout<<"delete:"<<data[i]<<endl;
                        data[i]=data[j];

                        flag[j]--;
                    }
                }
            }

        }
	cout<<endl; 
	cout<<"选择复制后的染色体为:"<<endl;
        for(int i=0 ;i <SIZE; i++)
        {
            cout<<data[i]<<" "<<endl ;
        }
        return data;
}
template <class Type>
Type crossover(Type data)
{

        cout<<"-------------------------"<<endl;
        vector<double> R;
        vector<int>::iterator data_iterator = data.begin();
        //总数
        double sum = 0;
        while(data_iterator!=data.end())
        {
            double x=*data_iterator;
            sum+=function;
            ++data_iterator;
        }
        double temp =0 ;
        //积累率
        for(int i =0;i<SIZE;i++)
        {
            double x=data[i];
            temp+=(function/sum);
            R.push_back(temp);
            cout<<"染色体的积累率:"<<data[i]<<" "<<temp<<endl;
        }
        Type data1;
        int k=1 ;
        while(true)
        {
            
            // B:随机数
            vector<double> Ran;
            vector<double>::iterator Ran_iterator;
            // 两条染色体 BIt位
            Ran=RandFunction(Ran,2,BIT);
            cout<<"随机杂交率为:" <<endl ;
	    for(int i= 0; i<2; i++ )
            {
                Ran[i]=Ran[i]/BIT_DOUBLE;
                cout<<Ran[i]<<endl;
            }
	    cout<<endl;
            int flag[2]={0};
            Ran_iterator=Ran.begin();
            //积累率的迭代器
            vector<double>::iterator R_iterator;
            data_iterator=data.begin();
            int tem=0;
            while(Ran_iterator!=Ran.end())
            {

               R_iterator=R.begin();
               int j=0;
               while(R_iterator!=R.end())
               {
                //   cout<<"Ran:"<<*Ran_iterator<< " " <<"R_iterator:"<<*R_iterator<<endl;
                   if(*Ran_iterator<=*R_iterator)
                   {
                            flag[tem]=j;
                            break;
                    }
                   ++R_iterator;
                   j++;
               }
               ++Ran_iterator;
               tem++;
            }
            //进行杂交
           double RD=(1.0*(rand()%10)/10);
           cout<<"RD"<<RD<<endl;
           if(RD<=0.9)
           {
                cout<<"被选择来杂交的染色体是:"<<endl;
                int tem1=flag[0];
                int tem2=flag[1];
                bitset<BIT> bit1(data[tem1]);
                bitset<BIT> bit2(data[tem2]);
		cout<<data[tem1]<<":编码: "<<bit1.to_string()<<endl;
		cout<<data[tem2]<<"编码:"<<bit2.to_string()<<endl;
                int p=0;
                int bit ;
                for(;;)
                {
                        bit=rand()%10;
                        if(bit>=1&&bit<=5)
                        break;
                }
                cout<<"杂交初位置:"<<bit<<endl;
                for(int j =0 ; j<bit;j++ )
                {
                          p=bit1[j];
                          bit1[j]=bit2[j];
                          bit2[j]=p;
                          cout<<"bit1:"<<bit1.to_string()<<endl;
                          cout<<"bit2:"<<bit2.to_string()<<endl;
                }
                cout<<"杂交后的数据"<<endl;
		cout<<bit1.to_ulong()<<" 编码 :"<<bit1.to_string()<<endl;
		cout<<bit2.to_ulong()<<" 编码:"<<bit2.to_string()<<endl;
                data1.push_back(bit1.to_ulong());
                data1.push_back(bit2.to_ulong());
            }
            else {
                int tem1=flag[0];
                int tem2=flag[1];
                data1.push_back(data[tem1]);
                data1.push_back(data[tem2]);
            }
            if(k>=SIZE/2)
                break;
            k++;
        }
        data.clear();
        data=data1;
        return data ;
}

template <class Type>
Type mutate(Type data)
{


        //突变的元素
        int tem;
        //突变的位数
        int k ;
        //突变的个数
        int b;

        for(;;)
        {
            b=(rand()%10);
            if(b>=1&&b<=SIZE)
            break;
        }
	cout<<"产生突变的染色体个数是:"<<b<<endl;
        while(b)
        {
                double mutepate=1.0*(rand()%10)/10.0;
                if(mutepate>PM)
                    break ;
                else
                {
                    
                    for(;;)
                    {
                        k=(rand()%10);
                        if(k>=0&&k<BIT)
                            break;
                    }
		    cout<<"突变的位置是:"<<k<<endl;
                    while(k>=0)
                    {
                        for(;;)
                        {
                                tem=(rand()%10);
                                if(tem>=0&&tem<SIZE)
                                    break;
                        }
                        cout<<"突变的染色体是:"<<data[tem]<<endl;
                        for(int i =0 ;i <=k ;i ++ )
                        {
                                bitset<BIT> bit(data[tem]);
                                bit.flip(i);
                                data[tem]=bit.to_ulong();
                        }
                        cout<<"突变后是:"<<data[tem]<<endl;
                        k--;
                    }
                }

                b-- ;

        }
        return data ;
}
void PCD(vector<int> data)
{
    srand(time(0));

    while(1){
    //    sleep(1);
        cout<<"======================================"<<endl;
        vector<int>::iterator temp_iterator=data.begin();
        for(;temp_iterator!=data.end();)
        {
            if(*temp_iterator==31)
            {
                cout<<"The Result is found!"<<*temp_iterator<<endl;
                return ;
            }
            ++temp_iterator;
        }
        temp_iterator=data.begin();
        n++;
        cout<<"\n"<<n<<" finding:";
        //select :
        data=selection(data);
        //交叉:
        data=crossover(data);

        //变异:
        data=mutate(data);
       
	for(int i=0;i<SIZE;i++)
             cout<<data[i]<<endl;
        cout<<"第"<<n<<"次遗传"<<endl;
    }

    return  ;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值