C++遗传算法求解函数y=xsin(10xπ)+2在区间[-1,2]上的最大值

1. 问题背景

本文使用C++实现遗传算法,求解函数y=xsin(10xπ)+2在区间[-1,2]上的最大值。

2. 算法实现

2.1 个体结构设计c++struct Point { int x[size]; //基因编码 double fitness; //适应度值};

2.2 种群设计c++struct GASet { Point obj[row][col];};

2.3 个体操作

2.3.1 初始化c++void init(struct Point *a) { int i = 0; for (i = 0; i < size; i++) { a->x[i] = rand() % 2; }}

2.3.2 解码c++double decode(struct Point *a) { double y = 0; int i = 0; for (i = 0; i < size; i++) { y = y + a->x[i] * pow(2.0, size - i - 1); } y = xmin + y * (xmax - xmin) / (pow(2.0, size) - 1); return y;}

2.3.3 适应度计算c++double getFitness(struct Point *a) { double vx = 0; vx = decode(a); a->fitness = vx * sin(10 * PI * vx) + 2.0; return a->fitness;}

2.4 群体相互作用

2.4.1 交换c++void swap(Point *a, Point *b) { Point temp; temp = *a; *a = *b; *b = temp;}

2.4.2 交叉算子c++void cross(Point *a, Point *b, Point *ab, Point *ba) { int pos = rand() % size; int i = 0; for (i = 0; i < pos; i++) { ab->x[i] = a->x[i]; ba->x[i] = b->x[i]; } for (i = pos; i < size; i++) { ab->x[i] = b->x[i]; ba->x[i] = a->x[i]; }}

2.4.3 增强变异算子c++// 复制函数void copy(Point *a, Point *b) { int i; for (i = 0; i < size; i++) { b->x[i] = a->x[i]; }}

// 增强变异算子void mut(Point *a) { Point temp; int pos = rand() % size; copy(a, &temp); temp.x[pos] = (temp.x[pos] + 1) % 2;}

2.4.4 寻优移位算子c++void findBestMove(GASet *p) { int pos = 0; double max; int i = 0; int j = 0; for (i = 0; i < row; i++) { pos = 0; max = p->obj[i][pos].fitness; for (j = 1; j < col; j++) if (max < p->obj[i][j].fitness) { pos = j; max = p->obj[i][j].fitness; } swap(&(p->obj[i][i]), &(p->obj[i][pos])); }}

2.4.5 种群初始化c++void initSet(GASet *p) { int i, j; for (i = 0; i < row; i++) for (j = 0; j < col; j++) init(&(p->obj[i][j]));}

2.4.6 种群适度值计算c++void calSet(GASet *p) { int i, j; for (i = 0; i < row; i++) for (j = 0; j < col; j++) getFitness(&(p->obj[i][j]));}

2.4.7 种群演化c++void evol(GASet *p) { int i, j; //逐行寻优定位 findBestMove(p); //精英交叉产生子代 for (i = 0; i < row; i++) for (j = i + 1; j < col; j++) cross(&(p->obj[i][i]), &(p->obj[j][j]), &(p->obj[i][j]), &(p->obj[j][i])); //增强变异 for (i = 0; i < row; i++) for (j = 0; j < col; j++) mut(&(p->obj[i][j])); //适度值计算 for (i = 0; i < row; i++) for (j = 0; j < col; j++) getFitness(&(p->obj[i][j]));}

2.4.8 获取最优解c++int getGbest(GASet *p) { int pos = 0; double max = p->obj[pos][pos].fitness; int i; for (i = 1; i < row; i++) if (max < p->obj[i][i].fitness) { pos = i; max = p->obj[i][i].fitness; } return pos;}

2.5 示例测试c++int main() { srand(time(0)); struct GASet p; int n = 0; int best = 0; initSet(&p);//初始化种群 calSet(&p); //计算种群适度值 while (n < 200) { evol(&p); n++; } best = getGbest(&p); printf('%0.8f

', (p.obj[best][best]).fitness); return 0;}

2.6 头文件及宏定义c++#include <stdio.h>#include <stdlib.h>#include <math.h>#include <time.h>

#define size 22#define xmax 2.0#define xmin -1.0#define row 20#define col 20#define PI 3.141592653589

typedef struct Point Point;

3. 函数图像绘制pythonimport numpy as npimport mathimport matplotlib.pyplot as plt

x=np.linspace(-1,2,200)y=xnp.sin(10x*math.pi)+2.0

plt.plot(x,y)plt.xlabel('x')plt.ylabel('y')plt.title('y=xsin(10xπ)+2')plt.show()

C++遗传算法求解函数y=xsin(10xπ)+2在区间[-1,2]上的最大值

原文地址: https://www.cveoy.top/t/topic/eENH 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录