1.概述
- 遗传算法(Genetc Algorithm, GA)是一种进化算法,其基本原理消防生物界中的“物竞天择、适者生存”的演化法则
-
种群(包含多个个体) 解空间 个体(染色体,包含多个基因) 解空间的一个解 基因(最小单元) 解的一个组成部分 适应度(fitness)函数 解好坏的评价标准 选择算子(“适者生存”) 选出最优解进入下一代 遗传算子(组合交叉和变异,“繁衍”过程) 保证解(种群)的多样性 -
遗传算法的三个基本操作:选择(Selection)、交叉(Crossover)、变异(Mutation)
(1)选择 选择的目的是为了从当前种群中选出优良的个体,作为父辈繁衍下一代,适应度较高的个体被选择的概率较高(强调概率,并不是一个确定事件)
(2)交叉 交叉的目的是为了得到新一代的个体,新个体组合保留了父辈个体的特性
(3)变异 变异的目的是为了保证解的多样性,对当前种群的每个个体以一定概率改变一个或者多个基因的值(与交叉相比,变异的概率比较低)
- 遗传算法的基本步骤:
(1)编码 将需要优化解决的问题用数学语言描述,映射到遗传算法优化问题。也就是将解空间X={x1,x2,……}映射为个体上的基因
(2)初始种群生成 随机生成N个初始串结构数据,每一个串结构数据称为一个个体(个体数量N是一个很重要的参数,个体较少进化的速度将很慢,个体较多将会存在相似的个体,导致重复计算,效率下降)
(3)适应度评估 评估每个个体的优劣。不同的问题,适应度函数的定义方式也不同
2.遗传算法工具箱
MATLAB内嵌遗传算法工具箱:实时编辑器-优化
(1)新建一个优化的实时脚本:在主页中点击新建实时脚本>>在实时编辑器中点击任务>>找到优化
(2)指定求解器:只有非线性问题才能使用GA算法
(3)设置优化目标和约束:目标函数和非线性约束需要从文件选择(点击新建按照格式进行编写),其余约束的参数从工作区选择
(4)设置参数
- 种群设置
种群大小 | 默认值:50(当变量<=5时,否则为200) |
种群数据类型(可以不设置) | doubleVector(默认),bitstring,custom |
精英成员数 | 默认值:种群数*0.05 |
- 算法设置——选择函数(可以不设置使用默认函数)
selectionstochunif(默认函数) | 随机均匀分布 |
selectionremainder(残余) | 取适应值的整数部分进行轮盘赌选择 |
selectionuniform | 不是一种非常有效的搜索策略,可用于测试 |
selectionroulette(常用函数) | 轮盘赌算法 |
selectiontourmament | 联赛选择算法 |
- 算法设置——交叉比例:默认为0.8,可以自己设置
- 算法设置——交叉函数(可以不设置使用默认函数)
-
crossoverscattered:对于没有线性约束问题的默认交叉函数。产生随机二进制向量控制交叉
例如: P1=[a b c d e f g h]
P2=[1 2 3 4 5 6 7 8]
二进制向量=[1 1 0 0 1 0 0 0]
child=[a b 3 4 e 6 7 8]
-
crossoverheuristic(启发式算法):子代远离适应度差的父代(不等于靠近更好的父代)
如果在父代P1和P2中,P1的适应度更好,则函数返回子代child=P2+随机数*(P1-P2)
-
crossoversinglepoint(单点交叉):生成一个数字,从该数字对应位置后一位开始交叉
例如: P1=[a b c d e f g h]
P2=[1 2 3 4 5 6 7 8]
交叉点为3
child=[a b c 4 5 6 7 8]
-
crossovertwopoint(两点交叉):与单点交叉类似
例如: P1=[a b c d e f g h]
P2=[1 2 3 4 5 6 7 8]
交叉点为3和6
child=[a b c 4 5 6 g h]
-
crossoverarithmetic(算数平均):创建的子代是两个父代的算数平均值
-
crossoveriaplace:问题就具有整数约束时的默认交叉函数
拉普拉斯交叉使用以下任意公式(随机选择)生成子代:
xOverkid=P1+b1*abs(P1-P2)
xOverkid=P2+b1*abs(P1-P2),其中b1是拉普拉斯分布生成的随机数
参考文献:
-
-
算法设置——变异函数(可以不设置使用默认函数)
-
mutationgaussian(无需设置变异率):无约束问题的默认变异函数。利用高斯分布来选取变异的个体,前面的变异程度较高,后面变异程度较低
-
mutationadaptfeasible(自适应,无需设置变异率):存在非整数约束的默认变异函数。随机生成相对于最后成功或者不成功的生成自适应方向
-
mutationuniform:有边界或线性约束时不要使用。均匀突变,突变率默认为0.01,可以更改变异率rate:options=optimoptions('ga','MutationFcn',{@mutationuniform,rate})
-
mutationpositivebasis(网格自适应,无法设置变异率):该变异类似于蒸饺MADS(网格自适应搜索)步骤,针对线性约束和边界进行了改进
-
mutationpower:具有整数约束的默认变异函数。
mutationChild(i)=x(i)-s(x(i)-lb(i)) if t<r (t:x(i)与最小边界lb(i)的距离,r:随机数)
=x(i)+s(ub(i)-x(i)) if t>=r (s:幂分布的一个随机数)
-
-
算法设置——混合优化器(整数约束不可用)(有非整数约束,设置后更严谨)
-
fminsearch:使用MATLAB函数fminsearch智行无约束最小化
-
patternsearch:使用模式搜索来智行受约束或不受约束的最小化
-
fminunc:使用优化工具箱函数fminunc执行无约束最小化
-
fmincon:使用优化工具性函数fmincon执行约束最小化
-
-
运行时间限制
最大代数(迭代次数)(一般只设置此项) | 默认值为100*变量数,可以设置 |
停滞代数限制(迭代N次没有变化停止迭代) | 默认值50 |
停滞时间限制 | 默认为最大值 |
(5)例子
优化问题求解步骤