遗传算法求解区间[0, 31]上的二次函数f(x) = x ^ 2的最大值

该博客聚焦于用遗传算法求解区间[0, 31]上二次函数f(x) = x ^ 2的最大值,体现了遗传算法在函数极值求解方面的应用,属于信息技术中算法领域的内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题:遗传算法求解区间[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; 
}







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值