遗传算法基本步骤:初始化、迭代(选择、交配、变异、评价)
因为C语言的随机性不是很好,故采用 二进制编码随机数,再解码就可以得到很好的任意的随机数。所以就变成了初始化、编码、解码、迭代(选择、交配、变异、评价)。
我们老师上课特别水,但是我觉得我听懂了他反复强调的、反复比喻的遗传算法,他说交配是大调,变异是微调。
我觉得注释已经写得够清楚了,如果有不太明白的地方可以留言呀。凡是遗传算法求最值的都可以用这个代码,只不过适应度函数和best更新要改。
//遗传算法 编译环境 vs 2019
#include <iostream>
using namespace std;
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <math.h>
#define SIZE 10 //种群初始规模
#define ROW 4 //几元函数ROW就是几
#define GEN 5000 //迭代代数
#define P_COP 0.88 //交叉概率
#define P_VAR 0.1 //变异概率
//精度是自己设的,这里将精度置为0.0001,则编码长度为17
int len = log(pow(10, 5)) / log(2);
int bin[SIZE][ROW][20] = {
0 }; //整型三维数组,存放初始种群的二进制编码
float deci[SIZE][ROW] = {
0 }; //浮点型二维数组,存放种群的十进制浮点数
float new_deci[SIZE][ROW] = {
0 }; //浮点型二维数组,存放下一代种群的十进制浮点数
float fit[SIZE] = {
0 }; //浮点型数组,存放种群的适应度值
float prob[SIZE] = {
0 }; //浮点型数组,存放轮盘赌中种群的概率及积概率
float sum = 0; //存放种群总适应度值,用于计算积概率
float best = 0; //存放所有种群的最优适应度值
float b_deci[ROW] = {
0 }; //存放最优解空间
int rou[SIZE] = {
0 }; //存放轮盘赌选中的下标
float rad; //[0,1]内的随机小数
int f_cop[SIZE] = {
0 }; //存储参加交配的染色体下标
void random_01(); //产生区间为[0,1],精度为0.01的随机小数
void init(); //种群初始化