本文主要是介绍遗传算法(GA)的C语言实现,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
问题:
在下面的程序中将要运用遗传算法对一个多项式求最小值
要求在(-8,8)间寻找使表达式达到最小的x,误差为0.001
问题分析:
编码:采用常规码,即二进制码编码。构造简单,交叉、变异的实现非常容易,同时解的表达也很简洁、直观。可以每0.001取一个点,这样理论误差讲小于0.0005,可以满足题目中的误差要求。此事总的求解空间为:
N = (8 - (-8)) * 1000 = 160000
可以用n = 14位二进制来表示。
群体规模m:
群体规模m可以选择 n ~ 2n 的一个确定的数,这里选择 m = 20
初始种群的选取:
在这里初始种群将在值域范围内随机选取
终止规则:
①最优解在连续的20次循环中改变量小于0.01,此事认为这个最优解为满足题目要求的最优解,求解成功,退出程序
②总的循环次数大于1200次时,循环也将结束,这种情况按照求解失败处理
交叉规则:
采用最常用的双亲双子法
选择:
在进行交叉、变异后,种群中的个体个数达到2m个,将这2m个染色体按其适应度进行排序,保留最优的m个淘汰其他的,使种群在整体上得到进化
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <time.h>#define SUM 20 //总共的染色体数量
#define MAXloop 1200 //最大循环次数
#define error 0.01 //若两次最优值之差小于此数则认为结果没有改变
#define crossp 0.7 //交叉概率
#define mp 0.04 //变异概率//用于求解函数y=x^6-10x^5-26x^4+344x^3+193x^2-1846x-1680在(-8,8)之间的最小值 struct gen //定义染色体结构
{int info;
这篇关于遗传算法(GA)的C语言实现的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!