问题:遗传算法求解区间[0, 31]上的二次函数f(x) = x ^ 2的最大值
#include <bits/stdc++.h>
using namespace std;
const int maxn = 10; //种群数量
const int bit = 5;
const int iteration = 200; //迭代次数
const double pc = 0.4; //交叉概率
const double pm = 0.02; //变异概率
int jubu_best = 0;
int quanju_best = 0;
int best_index = 0;
typedef struct population
{
int bin[5];
int num;
int fit;
double p;
double q;
}pop;
//编码 二进制 -> 十进制
void conversion2_10(pop p[])
{
for(int i = 0; i < maxn; i++)
{
int k = 1, base = 2, sum = 0;
for(int j = 4; j >= 0; j--)
{
sum += k * p[i].bin[j];
k *= base;
}
p[i].num = sum;
}
}
//解码 十进制 -> 二进制
void conversion10_2(int n, int arr[])
{
for(int i = 0; i < 5; i++)
arr[i] = 0;
int j = 4;
while(n)
{
arr[j--] = n % 2;
n /= 2;
}
}
//适应度函数 (评价函数)
void fitness(pop p[])
{
for(int i = 0; i < maxn; i++)
{
p[i].fit = p[i].num * p[i].num;
}
cout<<"适应度分别为:"<<endl;
for(int i = 0; i < maxn; i++)
cout<<p[i].fit<<" ";
cout<<endl;
}
//初始化种群
void Init_pop(pop a[])
{
for(int i = 0; i < maxn; i++)
{
int num = rand()%32;
a[i].num = num;
conversion10_2(num, a[i].bin);
}
cout<<"种群初始化为:"<<endl;
for(int i = 0; i < maxn; i++)
cout<<a[i].num<<" ";
cout<<endl;
fitness(a);
}
//选择
void Select(pop p[])
{
fitness(p);
int sum_fit = 0;
double sumq = 0;
for(int i = 0; i < maxn; i++)
sum_fit += p[i].fit;
cout<<"sum_fit:"<<sum_fit<<endl;
for(int i = 0; i < maxn; i++)
{
p[i].p = (double)p[i].fit / sum_fit;
sumq += p[i].p;
p[i].q = sumq;
}
cout<<"概率计算:"<<endl;
cout<<"p:————————"<<endl;
for(int i = 0; i < maxn; i++)
{
cout<<p[i].p<<" ";
}
cout<<endl;
cout<<"q:————————"<<endl;
for(int i = 0; i < maxn; i++)
cout<<p[i].q<<" ";
cout<<endl;
pop temp[maxn];
for(int i = 0; i < maxn; i++)
{
double a = (double)(rand() % 1001) * 0.001;
cout<<"a:"<<a<<endl;
int j;
if(a < p[0].q)
{
temp[i] = p[0];
}
else
{
for(j = 1; j < maxn; j++)
{
if(a > p[j-1].q && a <= p[j].q) break;
}
temp[i] = p[j];
}
}
for(int i = 0; i < maxn; i++)
p[i] = temp[i];
cout<<"选择后种群为:"<<endl;
for(int i = 0; i < maxn; i++)
cout<<p[i].num<<" ";
cout<<endl;
}
//交叉
void Crossover(pop p[])
{
for(int i = 0; i < maxn; i++)
conversion10_2(p[i].num, p[i].bin);
cout<<"交叉前:——————————"<<endl;
for(int i = 0; i < maxn; i++)
{
for(int j = 0; j < 5; j++)
cout<<p[i].bin[j]<<" ";
cout<<endl;
}
int n = (int)(10 * pc);
for(int i = 0; i < n; i++)
{
int a = 0, b = 0;
while(a == b)
{
a = rand() % maxn;
b = rand() % maxn;
}
int count = rand() % bit;
for(int j = 0; j < count; j++)
{
int t = p[a].bin[j];
p[a].bin[j] = p[b].bin[j];
p[b].bin[j] = t;
}
}
cout<<"交叉后:——————————"<<endl;
for(int i = 0; i < maxn; i++)
{
for(int j = 0; j < 5; j++)
cout<<p[i].bin[j]<<" ";
cout<<endl;
}
}
//变异
void Mutation(pop p[])
{
cout<<"变异前:——————————"<<endl;
for(int i = 0; i < maxn; i++)
{
for(int j = 0; j < 5; j++)
cout<<p[i].bin[j]<<" ";
cout<<endl;
}
int n = 100 * pm;
for(int i = 0; i < n; i++)
{
int index = rand() % maxn;
int bitt = rand() % bit;
if(p[index].bin[bitt] == 0)
p[index].bin[bitt] = 1;
else
p[index].bin[bitt] = 0;
}
cout<<"变异后:——————————"<<endl;
for(int i = 0; i < maxn; i++)
{
for(int j = 0; j < 5; j++)
cout<<p[i].bin[j]<<" ";
cout<<endl;
}
}
int main()
{
pop p[maxn];
srand((unsigned) time(0));
Init_pop(p);
int cnt = 1;
while(cnt <= iteration)
{
for(int i = 0; i < maxn; i++)
{
if(p[i].fit > jubu_best)
jubu_best = p[i].fit;
}
cout<<"第"<<cnt<<"代最优解为: "<<jubu_best<<endl;
if(jubu_best > quanju_best)
{
quanju_best = jubu_best;
best_index = cnt;
}
Select(p);
Crossover(p);
Mutation(p);
conversion2_10(p);
fitness(p);
cout<<"新产生的子代为:"<<endl;
for(int i = 0; i < maxn; i++)
cout<<p[i].num<<" ";
cout<<endl;
cnt++;
}
cout<<"全局最优解为:"<<quanju_best<<",在第 "<<best_index<<" 代!"<<endl;
}