基于遗传算法进行极值优化-MATLB代码
1.遗传算法介绍
遗传算法(GA)可能是最早开发出来的模拟生物遗传系统的算法模型。它首先由Fraser提出,后来有Bremermann和Reed等人再次提出。最后,Holland对遗传算法做了大量工作并使之推广,因此被认为是遗传算法的奠基人。遗传算法模拟了基因进化,在这个模型中,个体的性状通过基因型表达。选择算子(模拟适者生存)与交叉算子(模拟繁殖),是遗传算法的主要驱动算法。
2.基本步骤
- 初始化:设置进化代数计数器t=0,设置最大进化代数T,随机生成M个个体作为初始群体P(0)。
- 个体评价:计算群体P(t)中各个个体的适应度。
- 选择运算:将选择算子作用于群体。选择的目的是把优化的个体直接遗传到下一代或通过配对交叉产生新的个体再遗传到下一代。选择操作是建立在群体中个体的适应度评估基础上的。
- 交叉运算:将交叉算子作用于群体。遗传算法中起核心作用的就是交叉算子。
- 变异运算:将变异算子作用于群体。即是对群体中的个体串的某些基因座上的基因值作变动。群体P(t)经过选择、交叉、变异运算之后得到下一代群体P(t+1)。
- 终止条件判断:若t=T,则以进化过程中所得到的具有最大适应度个体作为最优解输出,终止计算。
3.实例
- 求函数y的最小值-目标函数如下
- 代码
clear all
clc
% f{1} = @(x)(x(1)^4-10*x(2)^2+x(1)*x(2)+x(2)^4-(x(1)^2)*(x(2)^2));
% f{2} = @(x)(x(2)^4-(x(1)^2)*(x(2)^2)+x(1)^4+x(1)*x(2));
% fitness = f; 不能使用匿名函数作为多目标函数优化的适应度函数
fit_ness = @fitness;
nvars = 3;%优化的变量个数
A = [];b = [];%没有线性不等式约束
Aeq = [];beq = [];%线性等式约束
lb = [0 0 0];ub = [15 15 15];
nonlcon = [];
%options = gaoptimset('ParetoFraction',0.3,'PopulationSize',100,'Generations',200,'StallGenLimit',200,'TolFun',1e-100,'PlotFcns',@gaplotpareto);
options = gaoptimset('ParetoFraction',0.3,...
'PopulationSize',100,...%种群大小
'Generations',100,...
'StallGenLimit',200,...
'TolFun',1e-100,...
'CrossoverFraction',0.58,... %交叉率
'MigrationFraction',0.08,... %变异率
'PlotFcns',{@gaplotbestf,@gaplotbestindiv,@gaplotpareto});%绘制Pareto解集
% 'PlotFcns',{@gaplotbestf,@gaplotbestindiv,@gaplotpareto});
%注不支持最佳个体和适应度曲线查看
[x,fval] = gamultiobj(fit_ness,nvars,A,b,Aeq,beq,lb,ub,options)