实验五:遗传算法求解函数最值问题实验.doc
文本预览下载声明
实验五:遗传算法求解函数最值问题实验
实验目的
使用遗传算法求解函数
及y的最大值。遗传算法进行求解篇末所附源代码中带有算法的详细注释算法中涉及不同的参数,参数的取值需要根据实际情况进行设定,运行时将给出不同参数的结果对比。
整体算法的结束条件,当种群次数达到maxGeneration停止,此时种群中的最优解即作为算法的输出。
种群规模为N,是随机产生个个体实验中了类型Chromosome一个个体,并且在默认构造函数中即了随机的
然后程序进行若干次的迭代,在每次迭代过程中,进行选择、交叉及三个操作。
选择操作
首先计算当前每个个体的适应度函数值,这里的适应度函数即为所要求的优化函数,然后归一化求得每个个体选的概率,然后用轮盘赌的允许重复的方式选择N个个体即为选择之后的群体。
实验时发现结果不好,经过仔细研究之后发现,这里在y取某些的时候目标函数出来的适应值可能会出现负值,这时如果按照把每个的适应值适应值的进行归一化的话会出现问题,因为可能出现负值,总和也可能负值,归一化的时候除以了一个负值,时就会选择一些不良的个体,实验结果造成影响。对这个问题,我适应度函数定目标的函数值一个,保证得到的适应值为正数,然后进行一般的归一化和选择的操作。实验结果,的实验结果很不稳定,修正后的结果比较稳定,趋于最大值。
操作
是根据交叉概率probCross要交叉的个体进行交叉。
交叉参数crossnum多点交叉随机生成交叉点,允许交叉点重合,两个重合的交叉点效果互相抵消,相当于没有交叉点然后根据交叉点进行交叉操作,得到个体。
操作
是根据变异概率选择要变异的个体
变异时先随机生成变异的位置,然后把改的翻转。
一定的之后得到最终种群,选择最优的个体即可得到最终的结果。
借助matlab软件,我们可以知道该函数在该定义域下的图像为
以下设置不同的参数进行对比试验:
参数的对比实验
len crossnum maxGeneration probCross probMutate 实验一 1 10 10 4 1000 0.85 0.15 22 2 50 10 4 5000 0.85 0.15 22 3 200 20 4 5000 0.85 0.15 22 4 200 30 4 10000 0.85 0.15 22 5 200 30 5 10000 0.8 0.2 22 6 300 40 4 100000 0.85 0.15 22
以上我们对种群规模N,个体染色体长度len,迭代次数maxGeneration进行比较可以看出,随着种群规模的增大,染色体长度的增长,迭代次数的增加,算法得到的结果越来越精确。达到一定时,再增加的值明显地增加程序运行时间,但却不一定能明显改善解的质量,反而可能因为一些随机因数而产生质量更差的解如第实验一所示。
大概了一下多点交叉交叉点个数crossnum,交叉概率probCross,变异概率probMutate等参数,由于参数太多,这里一一进行控制变量的比较。可知,交叉概率及交叉点的个数影响交叉操作产生新个体的质量,的交叉及变化过大的交叉可能会产生不好的结果,过多的变异也应该会造成算法的不稳定。
给出以上实验结果的实验截图其中现在为止结果最的一个为:
若干个为:
改进后的源代码如下:
#include iostream
#include iomanip
#include algorithm
#include cmath
#include ctime
using namespace std;
// 程序欲分配内存的数组大小
const int mxn = 10000; // 最大的种群规模
const int mxlen = 1000; // 最大的染色体长度
// 遗传算法关键参数
const int N = 200; // 种群的个体数
const int len = 30; // 每个个体的染色体的长度,x和y各占一半
const int crossnum = 4; // 交叉操作时多点交叉的交叉点个数
const int maxGeneration = 2000; // 最大进化代数
const double probCross = 0.85; // 交叉概率
const double probMutation = 0.15; // 变异概率
// 个体的染色体类
class Chromosome
{
public:
bool g[mxlen]; // 二进制编码的
显示全部