如下为目标函数,
该函数有两个局部最小值,(0,-1)和(101,–1 – 1/e)
function y = two_min(x)
if x <= 100
y = -exp(-(x/100)^2);
else
y = -exp(-1) + (x-100)*(x-102);
end
end
二、运行遗传算法(默认参数)求解函数最小值
2.1通过gaplot1drange函数绘制算法每次迭代的种群范围
rng default % For reproducibility
options = optimoptions('ga','PlotFcn',@gaplot1drange);
[x,fval] = ga(@two_min,1,[],[],[],[],[],[],[],options)
遗传算法返回的值(目标函数最优解-函数的值)接近局部最小x=0;所有的个体(种群中的所有个体-所有的函数值解)范围-60-60;种群没有搜索到最佳的解x=101。
最终迭代到50代附近终止,纵坐标表示种群的所有可能解范围(中间的波浪线为每一代所有种群可能解的均值),x在(-60,60)范围内
2.2 增加种群的初始化范围
从2.1所使用的默认参数,只能让求解局限在(-60,60)范围内,为此增加种群的范围,以增加个体的多样性,原先的options.InitialPopulationRange = [-10;10]
options.InitialPopulationRange = [-10;90];
[x,fval] = ga(@two_min,1,[],[],[],[],[],[],[],options)
图中可看出个体范围更广,求解的x范围(-300,300);最终经过60次以上进化迭代,算法收敛于最优的个体x=101,在第100代时基本所有个体都近似为101附近,在第80代时所有个体的平均值已经趋近于101。
2.3 迭代绘图函数
function state = gaplot1drange(options,state,flag)
%gaplot1drange 绘制种群所有个体的值和它们的均值
% STATE = gaplot1drange(OPTIONS,STATE,FLAG) plots the mean and the range
% (highest and the lowest) of individuals (1-D only).
%
% Example:
% Create options that use gaplot1drange
% as the plot function
% options = optimoptions('ga','PlotFcn',@gaplot1drange);
if isinf(options.MaxGenerations) || size(state.Population,2) > 1
title('Plot Not Available','interp','none');
return;
end
generation = state.Generation;
score = state.Population;
%所有个体(解-x)的均值
smean = mean(score);
%所有个体(解-x)的上下限
Y = smean;
L = smean - min(score);
U = max(score) - smean;
switch flag
case 'init'
set(gca,'xlim',[1,options.MaxGenerations+1]);
plotRange = errorbar(generation,Y,L,U);
set(plotRange,'Tag','gaplot1drange');
title('Range of Population, Mean','interp','none')
xlabel('Generation','interp','none')
%legend('Range of Population','Mean')
case 'iter'
plotRange = findobj(get(gca,'Children'),'Tag','gaplot1drange');
newX = [get(plotRange,'Xdata') generation];
newY = [get(plotRange,'Ydata') Y];
newL = [get(plotRange,'Ldata') L];
newU = [get(plotRange,'Udata') U];
set(plotRange,'Xdata',newX,'Ydata',newY,'Ldata',newL,'Udata',newU);
end
end
三、参数设置
3.1 初始化种群范围设置
Gacreationuniform 创建均匀分布的随机初始种群,其中均匀分布在初始化种群范围(InitialPopulationRange)中,默认InitialPopulationRange=[-10,10]。
options.InitialPopulationRange = [-10;90];
3.2 迭代绘图函数设置
在每次算法迭代时调用绘图函数。绘图函数的选项设置方式为:
options = optimoptions('ga','PlotFcn',@gaplot1drange);
Plot functions | 说明 |
gaplotscorediversity | 绘制每次迭代时分数的直方图 |
gaplotstopping | 绘制停止迭代的标准水平 |
gaplotgenealogy | 绘制个体的家谱,从当前代到下一代 红色线指示变异子代 蓝色线指示交叉子代 黑色线指示优秀个体 |
gaplotscores | 绘制每一代个体的分数 |
gaplotdistance | 绘制每一代个体之间的平均距离 |
gaplotselection | 绘制父代的直方图 |
gaplotmaxconstr | 绘制每一代的最大非线性约束冲突 |
gaplotbestf | 绘制每代的最佳分数值和平均分数值 |
gaplotbestindiv | 绘制每一代中具有最佳适应度函数值的个体条目 |
gaplotexpectation | 绘制每一代的期望子代数目 |
gaplotrange | 绘制每一代的最小、最大和平均分数值 |
或者可将自定义函数作为函数句柄传递。
function state = plotfun(options,state,flag)
参数说明:
options
包含了所有当前的参数设置结构
state
包含当前代的信息的结构
状态结构包含如下参数
| 当前代编号 |
| 遗传算法开始时间 |
| 停止的原因标识 |
| 适应度函数值最后/上一次改进的一代 |
LastImprovementTime | 上次改进发生的时间 |
| 每一代发生的最佳分数向量 |
| 非线性约束算法报告如下的动作: Infeasible point、Update multipliers、Increase penalty |
| 函数计算的累计次数 |
| 选择个体的期望 |
| 选择最佳、交叉、变异个体的索引 |
| 当前代的种群 |
| 当前种群的分数 |
| 当前点的非线性不等式约束 |
| 当前点的非线性等式约束 |
| 指示遗传算法评估最优个体的适应度函数的逻辑值 |
| 指示遗传算法对于初始化种群添加重复个体的逻辑值 |
flag 算法当前所处的阶段描述,init 初始状态,iter迭代状态,interrupt 非线性约束问题的子问题迭代,done最终状态
3.3 种群设置
指定种群的参数
options = optimoptions('ga','CreationFcn',@myfun);
function Population = myfun(GenomeLength, FitnessFcn, options)
| 种群的适应度函数类型 doubleVector,bitstring |
| 种群大小。当基因个数(组成个体的元素个数)小于等于5时,默认种群大小为50,否则种群大小为200。 当设置种群大小为向量,则遗传算法创建多个子种群,每个子种群的大小为对应的向量条目 |
| 知道创建初始化种群的函数 [] 使用默认的函数 Gacreationuniform基于均匀分布创建随机初始化种群。当没有线性约束或整型约束时,均匀分布在初始化种群范围InitialPopulationRange内,默认 当存在整型约束时, |
3.4 适应度缩放因子设置
FitnessScalingFcn
options = optimoptions('ga','FitnessScalingFcn',{@fitscalingtop,quantity})
| Fitscalingrank默认的适应度缩放函数 fitscalingprop 让缩放值和原始的适应度分数值成比例 Fitscalingtop 顶级缩放 默认比例大小0.4 Fitscalingshiftlinear 线性缩放 ,默认比例大小2 |
3.5 选择设置
遗传算法如何选择父代
options = optimoptions('ga','SelectionFcn',...
{@selectiontournament,size})
SelectionFcn
option可选择:
selectionstochunif | 默认的选择函数 |
selectionremainder | Remainder 选择函数,以缩放值的整数部分和剩余的小数部分以轮盘选择 |
selectionuniform | Uniform 选择函数,使用期望和父代的数目 |
selectionroulette | Roulette 轮盘选择 |
selectiontournament | Tournament 选择函数,以最佳的个体最为父代,Size大小至少为2,默认值为4 |
自定义函数:
options = optimoptions('ga','SelectionFcn',@myfun);
3.6 繁衍设置
指定遗传算法如何为下一代创造孩子的
| 指定保证存活下一代的个体数目,默认值 |
CrossoverFraction | 交叉比例默认0.8,值范围为0-1之间 |
3.7 变异设置
使得遗传算法提供基因的多样性,使得遗传算法可以搜索更全面的空间
MutationFcn
函数可选:
mutationgaussian | 对于非约束问题,默认的变异函数 options = optimoptions('ga','MutationFcn', ... {@mutationgaussian, scale, shrink}) 标准偏差的分布取决于scale, shrink参数,默认的scale=1、shrink=1; |
mutationuniform | 均匀突变分为两个过程,1、个体的一小部分条目进行变异,每个条目都有一定的变异概率,默认rate=0.01;2、将选择的条目替换为该条目范围中随机选择的随机数 options = optimoptions('ga','MutationFcn', {@mutationuniform, rate}) |
mutationadaptfeasible | 存在约束时的默认突变函数 |
3.8交叉设置
CrossoverFcn
选择:
crossoverscattered | 默认的交叉函数,创建一个随机的二进制向量,并选择二进制向量1位置对应的第一个父代基因,选择二进制向量0位置对应的第二个父代基因,将它们组合构成子代 |
crossoversinglepoint | 定义交叉点n,选择向量单元序号小于或等于n对应的第一个父代基因,选择向量单元序号大于n对应的第二个父代基因,将它们连接构成子代基因 |
crossovertwopoint | 选择两个随机数m和n,两个随机数的范围在1-nvars(个体的基因长度)之间,选择向量单元序号小于等于m对应的第一个父代基因;选择向量单元序号在m+1-n之间对应的第二父代基因;选择向量单元序号大于n对应的第一个父代基因;将它们三组基因按照顺序组合构成子代 |
crossoverintermediate | 子代的产生是通过父代的加权平均计算,默认权重ratio=1 child = parent1 + rand * Ratio * ( parent2 - parent1) |
Crossoverheuristic | 子代的创建是通过计算子代和父代之间的距离并通过参数Ratio靠近距离最佳适应度值对应的父代,远离距离最差适应度值对应的父代,该Ratio默认值1.2 child = parent2 + ratio * (parent1 - parent2); |
crossoverarithmetic | 子代的创建是通过计算父代的加权算术平均 |
3.9停止迭代设置
| 指定遗传算法的最大迭代次数,默认为100*numberOfVariables |
| 指定遗传算法运行的最长时间 |
FitnessLimit | 如果最佳的适应度函数值小于或等于FitnessLimit则算法停止 |
MaxStallGenerations | 如果最佳适应度函数值的平均相对变化小于等于FunctionTolerance,则算法停止迭代 |
| 如果在MaxStallTime指定时间内最佳适应度函数值没有进一步改善,则算法停止迭代 |
| 如果最佳适应度函数值的平均相对变化小于等于FunctionTolerance,则算法停止迭代 |
|
|
3.10 输出函数选项
遗传算法的输出函数可以读取状态值和修改这些值
单个输出函数:
options = optimoptions('ga','OutputFcn',@myfun);
多个输出函数:
options = optimoptions('ga','OutputFcn',{@myfun1,@myfun2,...});
输出函数:
[state,options,optchanged] = myfun(options,state,flag)
Options | 选项 |
| 该结构包含当前代的信息 |
| 算法当前的状态 Init 初始化状态 Iter 迭代状态 Interrupt 非线性约束问题的子问题迭代 Done 最终状态 |