题目:
定义一个二元函数,
遗传算法简单介绍与MATLAB实现(二)
引入题目一
上一篇文章中我们简单的介绍了一了一下遗传算法,其中提到了多元函数f=f(x,y)f=f(x,y),所以在这里我们就定义一个二元函数,作为第一个练手的程序。
遗传算法MATLAB程序
设定参数
首先我们要确定一系列参数
N = 100; %种群内个体数目
N_chrom = 2; %染色体节点数
iter = 2000; %迭代次数
mut = 0.2; %突变概率
acr = 0.2; %交叉概率
其中突变概率指的是某个个体的染色体发生突变的概率。因为实际中并不可能每一个个体都会发生突变,而是存在一定的概率,因此我们在这里定义每一个个体突变发生的概率为0.2。
同理,交叉概率指的就是某个个体与另一个个体发生染色体交叉的概率。
迭代次数指的是整个种群迭代2000多次。
一般来说,并不是突变概率、交叉概率越小或者越大越好。比如说突变概率特别高的话,会让整个种群的最优适应度飘忽不定。如果特别小的话,会让种群迭代的速度特别慢,很难找到最优适应度。这里取0.2是我经过多次试验以后,觉得0.2是一个比较稳定不会乱飘且适应度收敛也不错的一个值。
迭代次数也同理,如果一个特别简单的模型去求最优解,可能五六次迭代就求出来了,那么2000次迭代纯属浪费时间。但是如果是一个特别复杂的模型,那么2000次迭代就有可能不够。具体迭代次数可以自己灵活决定。
chrom_range = [-10 -10; 10 10];%每个节点的值的区间
chrom = zeros(N, N_chrom);%存放染色体的矩阵
fitness = zeros(N, 1);%存放染色体的适应度
fitness_ave = zeros(1, iter);%存放每一代的平均适应度
fitness_best = zeros(1, iter);%存放每一代的最优适应度
chrom_best = zeros(1, N_chrom+1);%存放当前代的最优染色体与适应度
其中的chrom_range指的是每个节点值的区间。在我们的这个模型中,x∈[−10,10],y∈[−10,10]x∈[−10,10],y∈[−10,10]。第一行放的是两个变量的区间下限,第二行放的是区间上限。
chrom和fitness两个矩阵你们可以自己理解一下为什么这样子写。
fitness_ave用来存放每一代的平均适应度,主要是用来最后画图,观察种群在每一次迭代中适应度的变化情况。fitness_best同理。
chrom_best用来存放最优适应度对应的最优染色体与适应度,可以回想一下上一章染色体变异中需要最优适应度,优胜劣汰中需要最优染色体,这个矩阵作用就是如此。
初始化种群
接下来开始初始化参数
chrom = Initialize(N, N_chrom, chrom_range); %初始化染色体
fitness = CalFitness(chrom, N, N_chrom); %计算适应度
chrom_best