计算目标函数的全局最小值-遗传算法求解

如下为目标函数,

该函数有两个局部最小值,(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  包含当前代的信息的结构

 状态结构包含如下参数

Generation 

 当前代编号

StartTime 

遗传算法开始时间

StopFlag 

停止的原因标识

LastImprovement 

适应度函数值最后/上一次改进的一代

LastImprovementTime

上次改进发生的时间

Best 

每一代发生的最佳分数向量

how 

非线性约束算法报告如下的动作:

Infeasible pointUpdate multipliersIncrease penalty

FunEval 

 函数计算的累计次数

Expectation 

选择个体的期望

Selection 

选择最佳、交叉、变异个体的索引

Population 

 当前代的种群

Score 

 当前种群的分数

NonlinIneq 

当前点的非线性不等式约束

NonlinEq 

当前点的非线性等式约束

EvalElites 

指示遗传算法评估最优个体的适应度函数的逻辑值

HaveDuplicates 

指示遗传算法对于初始化种群添加重复个体的逻辑值

flag 算法当前所处的阶段描述,init 初始状态,iter迭代状态,interrupt 非线性约束问题的子问题迭代,done最终状态

3.3 种群设置

 指定种群的参数

 options = optimoptions('ga','CreationFcn',@myfun);

function Population = myfun(GenomeLength, FitnessFcn, options)

PopulationType 

种群的适应度函数类型

doubleVectorbitstring

PopulationSize 

种群大小。当基因个数(组成个体的元素个数)小于等于5时,默认种群大小为50,否则种群大小为200。

当设置种群大小为向量,则遗传算法创建多个子种群,每个子种群的大小为对应的向量条目

CreationFcn 

知道创建初始化种群的函数

[] 使用默认的函数

Gacreationuniform基于均匀分布创建随机初始化种群。当没有线性约束或整型约束时,均匀分布在初始化种群范围InitialPopulationRange内,默认InitialPopulationRange =[-10;10];

当存在整型约束时,InitialPopulationRange = [-9999;10001] 

3.4 适应度缩放因子设置

 FitnessScalingFcn 

options = optimoptions('ga','FitnessScalingFcn',{@fitscalingtop,quantity})

FitnessScalingFcn 

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 繁衍设置

指定遗传算法如何为下一代创造孩子的

EliteCount 

指定保证存活下一代的个体数目,默认值ceil(0.05*PopulationSize) 对于连续问题,0.05*(default PopulationSize) 对于混合整型问题

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停止迭代设置

MaxGenerations 

指定遗传算法的最大迭代次数,默认为100*numberOfVariables

MaxTime

指定遗传算法运行的最长时间

FitnessLimit

如果最佳的适应度函数值小于或等于FitnessLimit则算法停止

MaxStallGenerations

如果最佳适应度函数值的平均相对变化小于等于FunctionTolerance,则算法停止迭代

MaxStallTime 

如果在MaxStallTime指定时间内最佳适应度函数值没有进一步改善,则算法停止迭代

FunctionTolerance 

如果最佳适应度函数值的平均相对变化小于等于FunctionTolerance,则算法停止迭代

ConstraintTolerance 

ConstraintTolerance 约束容差不用做停止条件,用于决定非线性约束的可行性

3.10 输出函数选项

  遗传算法的输出函数可以读取状态值和修改这些值

单个输出函数:

options = optimoptions('ga','OutputFcn',@myfun);

多个输出函数:

options = optimoptions('ga','OutputFcn',{@myfun1,@myfun2,...});

输出函数:

[state,options,optchanged] = myfun(options,state,flag)
Options
选项
state 
该结构包含当前代的信息
flag 
算法当前的状态
Init 初始化状态
Iter 迭代状态
Interrupt  非线性约束问题的子问题迭代
Done 最终状态
  • 3
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

heda3

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值