/*
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 ;
}
遗传算法小试刀
最新推荐文章于 2017-12-10 20:35:53 发布