使用遗传算法计算函数最大值(C++代码)

废话不多说直接上传C++代码

#include <iostream>
#include <ctime>
using namespace std;

//使用遗传算法计算函数最大值,以函数 y=xsin(10π*x)+2.0为例。

const double pi = 3.14159265;
const double pcross = 0.7;//交叉概率
const double pmutate = 0.001;//变异概率
const int len = 22;//22位的染色体
const int daishu = 500;//更迭代数
const int Size = 500;//种群规模
double bestval;//适应值最大值
typedef struct node {//染色体结构体
	bool chromo[len];
}node;
node bestchromo;//记录最优个体
node group[Size];//记录种群中的个体的数组
node temp[Size];//记录种群中的个体的临时数组

void gouzao(node& c) {//对单个染色体随机赋值
	for (int i = 0; i < len; i++) {
		c.chromo[i] = rand() % 2;
	}
}
void decode(node& c, double& x) {//二进制解码操作
	double num = 4194394;//即2的22次方
	double tem = 0;
	for (int i = 0; i < len; i++) {
		tem += c.chromo[i] * pow(2, i);
	}
	x = (3 / num * tem) - 1;
}
double f(double x) {//目标函数
	return x * sin(10 * pi * x) + 2.0;
}
double fitness(node& c) {//适应度函数
	double x;
	decode(c, x);
	return f(x);
}
void cross(node& c1, node& c2, int point) {//交叉操作
	node c3 = c1;
	for (int i = 0; i < len - point; i++) {
		c1.chromo[point + i] = c2.chromo[point + i];
	}
	for (int j = 0; j < len - point; j++) {
		c2.chromo[point + j] = c3.chromo[point + j];
	}
}
void mutate(node& c) {//变异操作
	int i = rand() % len;
	c.chromo[i] = !c.chromo[i];
}
double inline rand0() {//产生0到1的随机小数
	return rand() % 10000 / 10000.0;
}
void select(node group[Size]) {//选择操作
	double fitnessval[Size];
	double sum = 0;
	double avgfitness[Size];
	int id[Size];
	for (int i = 0; i < Size; i++) {
		fitnessval[i] = fitness(group[i]);
	}
	for (int i = 0; i < Size; i++) {//适应度总和
		sum += fitnessval[i];
	}
	for (int i = 0; i < Size; i++) {
		avgfitness[i] = fitnessval[i] / sum;
	}
	for (int i = 1; i < Size; i++) {//适应度累加
		avgfitness[i] += avgfitness[i - 1];
	}
	for (int i = 0; i < Size; i++) {//轮盘赌选择法
		double rannum = rand0();//产生0到1随机数
		int j;
		for (j = 0; j < Size - 1; j++) {
			if (rannum < avgfitness[j]) {
				id[i] = j;
				break;
			}
		}
		if (j == Size - 1) {
			id[i] = j;
		}
	}
	for (int i = 0; i < Size; i++) {//将新个体替换旧个体
		temp[i] = group[i];
	}
	for (int i = 0; i < Size; i++) {
		group[i] = temp[id[i]];
	}
}
int getBest(node group[Size], double& x, double& number) {//取得最优个体对应的位置
	double fitnessval[Size];
	for (int i = 0; i < Size; i++) {
		fitnessval[i] = fitness(group[i]);
	}
	int id = 0;
	for (int i = 1; i < Size; i++) {
		if (fitnessval[i] > fitnessval[id]) {
			id = i;
		}
	}
	decode(group[id], x);
	number = f(x);
	return id;
}
void GA(double& x, double& number) {//遗传算法流程
	for (int i = 0; i < Size; i++) {
		gouzao(group[i]);
	}
	bestchromo = group[getBest(group, x, bestval)];
	for (int i = 0; i < daishu; i++) {
		select(group);//选择操作
		int p = rand() % len;
		for (int j = 0, pre = -1; j < Size; j++) {//根据概率交叉		
			if (rand0() < pcross) {
				if (pre == -1)
					pre = j;
				else {
					cross(group[pre], group[j], p);
					pre = -1;
				}
			}
		}
		for (int k = 0, pre = -1; k < Size; k++) {//根据概率进行变异
			if ((rand0() < pmutate)) {
				mutate(group[k]);
			}
		}
		getBest(group, x, number);
		cout << "第" << i + 1 << "代" << "最优x值为:" << x << "函数值为" << f(x) << endl; //结果的输出
	}
}
int main() {
	srand((unsigned)time(0));//产生随机数种子
	double x;
	double max;
	GA(x, max);
	system("pause");
	return 0;
}
  • 11
    点赞
  • 104
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Hong_Youth

您的鼓励将是我创作的动力。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值