主要内容

本页采用了机器翻译。点击此处可查看最新英文版本。

遗传算法选项

遗传算法的选项

使用 ga 设置 optimoptions 的选项。

options = optimoptions('ga','Option1','value1','Option2','value2');
  • 一些选项在 italics 中列出。这些选项没有出现在 optimoptions 返回的列表中。要了解 'optimoptions 为何隐藏这些选项值,请参阅 optimoptions 隐藏的选项

  • 确保将选项传递给求解器。否则,patternsearch 使用默认选项值。

    [x,fval] = ga(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon,options)

绘图选项

PlotFcn 指定 gagamultiobj 在每次迭代中调用的绘图函数。将 PlotFcn 选项设置为内置绘图函数名称或绘图函数的句柄。您可以通过点击绘图窗口上的停止按钮随时停止该算法。例如,为了显示最佳函数值,请按如下方式设置 options

options = optimoptions('ga','PlotFcn','gaplotbestf');

要显示多个图,请使用内置绘图函数名称的元胞数组或函数句柄的元胞数组:

options = optimoptions('ga',...
    'PlotFcn', {@plotfun1, @plotfun2, ...});

其中 @plotfun1@plotfun2 等是绘图函数的函数句柄。如果指定多个绘图函数,则所有绘图都会作为子绘图出现在同一个窗口中。右键点击任意子图可在单独的图形窗口中获取更大版本。

gagamultiobj 可用的绘图函数:

  • 'gaplotscorediversity' 绘制了每代分数的直方图。

  • 'gaplotstopping' 绘制停止条件水平。

  • 'gaplotgenealogy' 绘制了个体的谱系。从一代到下一代的线路都采用颜色编码,以区分突变子代、交叉子代和精英个体。

  • 'gaplotscores' 绘制了每代个体的分数。

  • 'gaplotdistance' 绘制了每代个体之间的平均距离。

  • 'gaplotselection' 绘制了父代的直方图。

  • 'gaplotmaxconstr' 绘制每代最大非线性约束违反情况。对于 ga,仅当 NonlinearConstraintAlgorithm 选项为 'auglag'(非整数问题的默认值)时可用。因此,对于整数约束问题不适用,因为它们使用 'penalty' 非线性约束算法。

  • 您还可以创建和使用自己的绘图函数。绘图函数的结构 描述了自定义绘图函数的结构。将任何自定义函数作为函数句柄传递。有关自定义绘图函数的示例,请参阅 创建自定义绘图函数

以下绘图函数仅适用于 ga

  • 'gaplotbestf' 绘制了最佳分数值和平均分与代的关系。

  • 'gaplotbestindiv' 绘制每代中适应最佳适应度函数值最优的个体的向量条目。

  • 'gaplotexpectation' 绘制了预期子代数量与每代原始分数的关系图。

  • 'gaplotrange' 绘制每代的最小、最大和平均分数值。

以下绘图函数仅适用于 gamultiobj

  • 'gaplotpareto' 绘制前两个或三个目标函数的帕累托前沿。

  • 'gaplotparetodistance' 绘制了每个个体与其邻居之间距离的条形图。

  • 'gaplotrankhist' 绘制了个体排名的直方图。排名 1 的个体位于帕累托前沿。排名 2 的个体低于至少一个排名 1 的个体,但是不低于任何其他等级的个体,等等。

  • 'gaplotspread' 绘制了平均扩展作为迭代次数的函数。

绘图函数的结构

绘图函数的第一行具有以下形式:

function state = plotfun(options,state,flag)

该函数的输入参量是

  • options — 包含所有当前选项设置的结构体。

  • state - 包含有关当前代信息的结构体。状态结构体 描述 state 的字段。

  • flag - 算法当前所处阶段的描述。有关详细信息,请参阅输出函数选项

传递额外参数 解释如何为函数提供附加参数。

输出参量 state 也是一个状态结构体。传递输入参量,如果愿意可以进行修改;请参阅 更改状态结构体。要停止迭代,请将 state.StopFlag 设置为非空字符向量,例如 'y'

注意

绘图函数不支持 subplot 语句,因为绘图函数框架管理轴。要指定多个子图,请编写单独的绘图函数,并将其作为元胞数组传递给求解器:

options = optimoptions("solvername",PlotFcn={@plot1,@plot2,@plot3});

输出函数支持 subplot,因此您可以使用输出函数代替绘图函数,在一个函数中包含多个绘图。

状态结构体

ga.  ga 的状态结构体是绘图、变异和输出函数的输入参量,包含以下字段:

  • Generation - 当前代数。

  • StartTime -遗传算法启动的时间,由 tic 返回。

  • StopFlag - 停止的原因,一个字符向量。

  • LastImprovement - 适应度值最后一次改进的一代。

  • LastImprovementTime - 上次改进发生的时间。

  • Best - 包含每一代最佳得分的向量。

  • how - 'augLag' 非线性约束算法报告以下操作之一:'Infeasible point''Update multipliers''Increase penalty';请参阅 增广拉格朗日遗传算法

  • FunEval -函数计算的累计次数。

  • Expectation - 个体选择的期望值,Fitness 的缩放版本。当非线性约束函数为 'penalty' 或存在整数约束时,Expectation 是惩罚函数的缩放版本。

  • Fitness - 种群的适应度值,是与 Population 行数相同的列向量。对于不可行个体,不会评估该值,而是将其设置为 Inf。不存在于 'augLag' 非线性约束算法中。

  • NonlinIneq - 非线性不等式函数值 c(x),与 Population 有相同行数的矩阵。当 flag 不是 'interrupt' 时,此字段存在。

  • NonlinEq - 非线性相等函数值 ceq(x),一个与 Population 有相同行数的矩阵。当 flag 不是 'interrupt' 时,此字段存在。

  • Selection - 为精英、交叉和变异选择的个体的索引。

  • Population — 当前代中的种群。

  • Score - 当前种群的分数。

  • EvalElites - 逻辑值,表示 ga 是否评估精英个体的适应度函数。最初,该值为 true。在第一代中,如果精英个体的评价值与其之前的值一致(这表明适应度函数是确定性的),那么在后续的迭代中,这个值默认变为 false。当 EvalElitesfalse 时,ga 不会重新评估精英个体的适应度函数。您可以通过更改输出 state.EvalElites 在自定义绘图函数或自定义输出函数中覆盖此行为。

  • HaveDuplicates - 逻辑值,指示 ga 是否为初始种群添加重复个体。ga 使用较小的相对容差来确定个体是否重复或唯一。如果 HaveDuplicatestrue,则 ga 会定位唯一个体,并针对每个唯一个体仅评估一次适应度函数。ga 将适应度和约束函数值复制到重复个体。ga 在每一代中重复测试,直到所有个体都是唯一的。测试采用顺序 n*m*log(m) 操作,其中 m 是种群规模,nnvars。要在自定义绘图函数或自定义输出函数中覆盖此测试,请将输出 state.HaveDuplicates 设置为 false

gamultiobj.  gamultiobj 的状态结构体是绘图、变异和输出函数的输入参量,包含以下字段:

  • Population — 当前代的种群

  • Score - 当前种群的得分,一个 Population×nObjectives 矩阵,其中 nObjectives 是目标的数量

  • Fitness - 种群的适应度值,是一个长度与 Population 相同的列向量。对于不可行个体,不会评估该值,而是将其设置为 Inf

  • NonlinIneq - 非线性不等式函数值 c(x),与 Fitness 有相同行数的矩阵。当 flag 不是 'interrupt' 时,此字段存在。

  • NonlinEq - 非线性相等函数值 ceq(x),一个与 Fitness 有相同行数的矩阵。当 flag 不是 'interrupt' 时,此字段存在。

  • Generation - 当前代的编号

  • StartTime -遗传算法启动的时间,由 tic 返回

  • StopFlag - 停止的原因,一个字符向量

  • FunEval -函数计算的累计次数

  • Selection - 精英、交叉和变异选择的个体的索引

  • Rank - 种群成员等级向量

  • Distance -种群中每个成员到最近相邻成员的距离向量

  • AverageDistance - Distance 的标准差(不是平均值)

  • Spread - 向量,其中的条目是每一代的传播

  • mIneq -非线性不等式约束的数量

  • mEq -非线性等式约束的数量

  • mAll -非线性约束总数,mAll = mIneq + mEq

  • C - 当前点的非线性不等式约束,一个 PopulationSize×mIneq 矩阵

  • Ceq - 当前点的非线性等式约束,一个 PopulationSize×mEq 矩阵

  • isFeas -种群可行性,带有 PopulationSize 元素的逻辑向量

  • maxLinInfeas - 对于种群的线性约束而言的最大不可行性

种群选项

种群选项让您指定遗传算法使用的种群参数。

PopulationType 指定适应度函数的输入类型。类型及其限制如下:

  • 'doubleVector' - 如果种群中的个体属于 double 类型,则使用此选项。此外,混合整数规划的推荐数据类型是 'doubleVector',使用 混合整数 ga 优化 中的技术。'doubleVector' 是默认数据类型。

  • 'bitstring' - 如果种群中的个体具有 01 分量,则可以使用此选项。

    小心

    位串种群中的个体是 double 类型的向量,而不是字符串或字符。

    对于 CreationFcnMutationFcn,使用 'gacreationuniform''mutationuniform' 或自定义函数句柄。对于 CrossoverFcn,使用 'crossoverscattered''crossoversinglepoint''crossovertwopoint' 或自定义函数的句柄。

    'bitstring' 数据类型使用起来可能不太方便。ga 忽略所有约束,包括边界、线性约束和非线性约束。您不能使用 HybridFcn。要在 ga 中最轻松地使用二进制变量,请参阅 混合整数 ga 优化

  • 'custom' - 指示自定义种群类型。在这种情况下,您还必须使用自定义的 CrossoverFcnMutationFcn。您必须提供自定义创建函数或 InitialPopulationMatrix。不能使用 HybridFcn,并且 ga 会忽略所有约束,包括边界、线性约束和非线性约束。

PopulationSize 指定每代有多少个个体。当种群规模较大时,遗传算法可以更彻底地搜索解空间,从而减少算法返回非全局最小值的局部最小值的机会。然而,较大的种群规模也会导致算法运行得更慢。默认值为 '50 when numberOfVariables <= 5, else 200'

如果将 PopulationSize 设置为向量,遗传算法将创建多个子种群,其数量为向量的长度。每个子种群的大小是向量的对应条目。请注意,此选项无用。请参阅 迁移选项

CreationFcn 指定为 ga 创建初始种群的函数。选择:

  • [] 使用适合您的问题类型的默认创建函数。

  • 'gacreationuniform' 创建具有均匀分布的随机初始种群。当没有线性约束或有整数约束时,这是默认值。均匀分布在初始种群范围(InitialPopulationRange)内。对于每个分量,InitialPopulationRange 的默认值为 [-10;10];如果存在整数约束,则为 [-9999;10001]。这些边界被移动和缩放以匹配任何现有的边界 lbub

    小心

    当您有线性约束时,请不要使用 'gacreationuniform'。否则,您的种群可能无法满足线性约束。

  • 当存在线性约束且没有整数约束时,'gacreationlinearfeasible' 是默认值。此选择会创建一个满足所有边界和线性约束的随机初始种群。如果存在线性约束,'gacreationlinearfeasible' 会在约束区域边界上创建许多个体,并创建一个分散良好的种群。'gacreationlinearfeasible' 会忽略 InitialPopulationRange'gacreationlinearfeasible' 会调用 linprog 来创建一个符合边界和线性约束的可行种群。

    有关显示其行为的示例,请参阅 ga 中的自定义绘图函数和线性约束

  • 'gacreationnonlinearfeasible''penalty' 非线性约束算法的默认创建函数。有关详细信息,请参阅约束参数

  • 当问题具有整数约束时,'gacreationuniformint'ga 的默认创建函数。此函数将人工边界应用于无界分量,在边界内均匀随机地生成个体,然后强制实施整数约束。

    注意

    当您的问题具有整数约束时,gagamultiobj 会强制整数约束、边界和所有线性约束在每次迭代中都是可行的。对于非默认的变异、交叉、创建和选择函数,gagamultiobj 在函数运行后应用额外的可行性例程。

  • 当问题具有整数约束时,'gacreationsobol'gamultiobj 的默认创建函数。创建函数使用准随机 Sobol 序列来生成分散良好的初始种群。该种群在边界、线性约束和整数约束方面是可行的。

  • 函数句柄允许您编写自己的创建函数,该函数必须生成您在 PopulationType 中指定类型的数据。例如,

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

    您的创建函数必须具有以下调用语法。

    function Population = myfun(GenomeLength, FitnessFcn, options)

    该函数的输入参量是:

    • Genomelength - 适应度函数的独立变量数量

    • FitnessFcn - 适应度函数

    • options - 选项

    该函数返回遗传算法的初始种群 Population

    传递额外参数 解释如何为函数提供附加参数。

    小心

    当您有边界或线性约束时,请确保您的创建函数创建的个体满足这些约束。否则,您的种群可能无法满足约束。

InitialPopulationMatrix 指定遗传算法的初始种群。默认值为 [],在这种情况下,ga 使用默认的 CreationFcn 来创建初始种群。如果在 InitialPopulationMatrix 中输入非空数组,则该数组必须有不超过 PopulationSize 行,并且恰好有 nvars 列,其中 nvars 是变量的数量,第二个输入为 gagamultiobj。如果您有一个部分初始种群,即少于 PopulationSize 行,那么遗传算法将调用 CreationFcn 来生成剩余的个体。

InitialScoreMatrix 指定初始种群的初始分数。初始分数也可能只是部分的。如果您的问题具有非线性约束,那么该算法就不会使用 InitialScoreMatrix

InitialPopulationRange 指定由 gacreationuniform 创建函数生成的初始种群中的向量范围。您可以将 InitialPopulationRange 设置为一个具有两行和 nvars 列的矩阵,其中每列的形式为 [lb;ub],其中 lb 是该坐标中条目的下界,ub 是上界。如果将 InitialPopulationRange 指定为 2×1 向量,则每个条目将扩展为长度为 nvars 的常量行。如果您未指定 InitialPopulationRange,则默认值为 [-10;10](对于整数约束问题则为 [-1e4+1;1e4+1]),并进行修改以匹配任何现有边界。'gacreationlinearfeasible' 会忽略 InitialPopulationRange。有关示例,请参阅设置初始范围

适应度缩放选项

适应度缩放适应度函数返回的原始适应度分数转换为适合选择函数的范围内的值。

FitnessScalingFcn 指定执行缩放的函数。选项包括

  • 'fitscalingrank' - 默认适应度缩放函数 'fitscalingrank' 根据每个个体的排名而不是其分数来缩放原始分数。个体的排名是其在排序分数中的位置。排名为 r 的个体具有与 1/r 成比例的缩放分数。因此,最适合个体的缩放分数与 1 成比例,次最适合个体的缩放分数与 1/2 成比例,依此类推。排名适应度缩放消除了原始分数扩散的影响。与排名得分相比,平方根使得排名较低的个体的得分更加接近相等。有关详细信息,请参阅适应度缩放

  • 'fitscalingprop' -缩放使个体的缩放值与其原始适应度度得分成比例。

  • 'fitscalingtop' - 顶部缩放对顶部个体进行平等缩放。您可以使用附加参数修改顶部缩放:

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

    quantity 指定被分配缩放值的个体数量。quantity 可以是从 1 到种群大小的整数,也可以是 0 到 1 之间的分数,用于指定种群大小的一部分。默认值为 0.4。每个产生后代的个体都被分配一个相等的缩放值,而其余的个体则被分配值 0。缩放值的形式为 [01/n 1/n 0 0 1/n 0 0 1/n ...]。

  • 'fitscalingshiftlinear' - 移位线性缩放对原始分数进行缩放,使得最适合个体的期望等于称为 rate 的常数乘以平均分数。您可以修改 rate 参数:

    options = optimoptions('ga','FitnessScalingFcn',...
        {@fitscalingshiftlinear, rate})

    rate 的默认值为 2

  • 函数句柄可让您编写自己的缩放函数。

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

    您的缩放函数必须具有以下调用语法:

    function expectation = myfun(scores, nParents)

    该函数的输入参量是:

    • scores - 标量向量,每个标量代表一个种群成员

    • nParents - 该种群所需的父代数量

    该函数返回 expectation,这是一个与 scores 长度相同的标量向量,给出种群中每个成员的缩放值。expectation 的条目之和必须等于 nParents

    传递额外参数 解释如何为函数提供附加参数。

有关详细信息,请参阅适应度缩放

选择选项

选择选项指定遗传算法如何为下一代选择父代。

SelectionFcn 选项指定选择函数。

gamultiobj 仅使用 'selectiontournament' 选择函数或自定义选择函数。

对于 ga,选项包括:

  • 'selectionstochunif' - ga 默认选择函数 'selectionstochunif' 布置一条线,其中每个父代对应于与其缩放值成比例的长度的一段线。该算法以相同大小的步长沿着线移动。在每个步骤中,算法都会从其所在的部分分配一个父代。第一步是小于步长的均匀随机数。

  • 'selectionremainder' - 余数选择根据每个个体缩放值的整数部分确定性地分配父代,然后对剩余的小数部分使用轮盘选择。例如,如果某个个体的缩放值为 2.3,则该个体会被列为父代两次,因为整数部分是 2。根据缩放值的整数部分分配父代后,其余父代将随机选择。在此步骤中选择父代的概率与其缩放值的小数部分成比例。

  • 'selectionuniform' - 均匀选择使用期望和父代数量来选择父代。均匀选择对于调试和测试很有用,但不是一种非常有效的搜索策略。

  • 'selectionroulette' - 轮盘选择通过模拟轮盘来选择父代,其中与个体相对应的轮盘部分的面积与个体的期望成正比。该算法使用随机数来选择其中一个部分,其概率等于其面积。

  • 'selectiontournament' - 锦标赛选择通过随机选择 size 名玩家然后从该集合中选择最佳个体作为父代来选择每个父代。size 必须至少为 2。size 的默认值为 4。将 size 设置为不同的值,如下所示:

    options = optimoptions('ga','SelectionFcn',...
                         {@selectiontournament,size})

    NonlinearConstraintAlgorithmPenalty 时,ga 使用大小为 'selectiontournament'2

  • 注意

    当您的问题具有整数约束时,gagamultiobj 会强制整数约束、边界和所有线性约束在每次迭代中都是可行的。对于非默认的变异、交叉、创建和选择函数,gagamultiobj 在函数运行后应用额外的可行性例程。

  • 函数句柄使您能够编写自己的选择函数。

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

    您的选择函数必须具有以下调用语法:

    function parents = myfun(expectation, nParents, options)

    ga 提供输入参量 expectationnParentsoptions。您的函数返回父代的索引。

    该函数的输入参量是:

    • expectation

      • 对于 gaexpectation 是种群中每个成员的缩放适应度的列向量。缩放来自 适应度缩放选项

        提示

        您可以使用 expectation(:,1) 确保您有一个列向量。例如,edit selectionstochunif 或任何其他内置选择函数。

      • 对于 gamultiobjexpectation 是一个矩阵,其第一列是个体的排名的负数,第二列是个体的距离测量。请参阅 多目标选项

    • nParents- 要选择的父代数量。

    • options - 遗传算法 options

    该函数返回 parents,即长度为 nParents 的行向量,其中包含您选择的父代的索引。

    传递额外参数 解释如何为函数提供附加参数。

有关详细信息,请参阅选择

重现选项

重现选项指定了遗传算法如何为代创造子代。

EliteCount 指定保证存活到下一代的个体数量。将 EliteCount 设置为小于或等于种群规模的正整数。对于连续问题,默认值为 ceil(0.05*PopulationSize),对于混合整数问题,默认值为 0.05*(default PopulationSize)

CrossoverFraction 指定通过交叉产生的下一代(精英子代除外)的比例。将 CrossoverFraction 设置为 01 之间的分数。默认值为 0.8

请参阅变异和交叉 中的“设置交叉分数”作为示例。

变异选项

变异选项指定遗传算法如何对种群中的个体做出微小的随机改变以产生变异子代。变异提供了遗传的多样性,使得遗传算法能够搜索更广阔的空间。在 MutationFcn 选项中指定变异函数。

MutationFcn 选项:

  • 'mutationgaussian' - 对于无约束问题,ga 的默认变异函数 'mutationgaussian' 将从均值为 0 的高斯分布中获取的随机数添加到父代向量的每个条目中。该分布的标准差由参数 scaleshrink 以及 InitialPopulationRange 选项决定。将 scaleshrink 设置如下:

    options = optimoptions('ga','MutationFcn', ... 
    {@mutationgaussian, scale, shrink})
    • scale 参数确定第一代的标准偏差。如果将 InitialPopulationRange 设置为 2×1 向量 v,则初始标准差在父代向量的所有坐标处都是相同的,由 scale*(v(2)-v(1)) 给出。

      如果将 InitialPopulationRange 设置为具有两行和 v 列的向量 nvars,则父代向量 i 处的初始标准差由 scale*(v(i,2) - v(i,1)) 给出。

    • shrink 参数控制标准差如何随着代流逝而收缩。如果将 InitialPopulationRange 设置为 2×1 向量,则第 k 代的标准差 σk 在父代向量的所有坐标上都是相同的,并由递归公式给出

      σk=σk1(1ShrinkkGenerations).

      如果将 InitialPopulationRange 设为具有两行和 nvars 列的向量,则第 i 代父代向量 k 在坐标 σi,k 处的标准差由递归公式给出

      σi,k=σi,k1(1ShrinkkGenerations).

      如果将 shrink 设置为 1,则算法会线性缩小每个坐标中的标准差,直到最后一代达到 0。shrink 的负值会导致标准差增大。

    scaleshrink 的默认值都是 1。

    小心

    当您有边界或线性约束时,请不要使用 mutationgaussian。否则,您的种群不一定满足约束。相反,使用 'mutationadaptfeasible' 或满足线性约束的自定义变异函数。

  • 'mutationuniform' - 均匀变异是一个两步过程。首先,该算法选择个体向量条目的一部分进行变异,其中每个条目都有发生变异的概率 raterate 的默认值为 0.01。在第二步中,算法用从该条目范围中均匀选择的随机数替换每个选定的条目。

    要更改 rate 的默认值,

    options = optimoptions('ga','MutationFcn', {@mutationuniform, rate})

    小心

    当您有边界或线性约束时,请不要使用 mutationuniform。否则,您的种群不一定满足约束。相反,使用 'mutationadaptfeasible' 或满足线性约束的自定义变异函数。

  • 'mutationadaptfeasible'gamultiobjga 在存在非整数约束时的默认突变函数,它会随机生成相对于上一次成功或不成功的生成具有适应性的方向。变异选择满足边界和线性约束的方向和步长。

  • 当问题具有整数约束时,'mutationpower'gagamultiobj 的默认变异函数。强力变异通过下列方式对父代 x 进行突变。对于父代的每个组件,子代的第 i 个组件由以下公式给出:

    mutationChild(i) = x(i) - s(x(i) - lb(i))(如果 t < r

    = x(i) + s(ub(i) - x(i))(如果 t >= r)。

    这里,tx(i) 与下界第 i 个分量 lb(i) 的缩放距离。s 是从幂分布中抽取的随机变量,而 r 是从均匀分布中抽取的随机数。

    该函数可以处理 lb(i) = ub(i)。生成新的子项,其中第 i 个分量设置为 lb(i),等于 ub(i)。有关此交叉函数的更多信息,请参阅以下参考资料的 2.1 节:

    Kusum Deep、Krishna Pratap Singsh、M. L. Kansal、C. Mohan。一种用于解决整数和混合整数优化问题的实数编码遗传算法。应用数学和计算,212 (2009),505-518。

    注意

    当您的问题具有整数约束时,gagamultiobj 会强制整数约束、边界和所有线性约束在每次迭代中都是可行的。对于非默认的变异、交叉、创建和选择函数,gagamultiobj 在函数运行后应用额外的可行性例程。

  • 'mutationpositivebasis' - 该变异函数类似于正交 MADS 步骤,针对线性约束和边界进行了修改。

  • 函数句柄使您能够编写自己的变异函数。

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

    您的变异函数必须具有以下调用语法:

    function mutationChildren = myfun(parents, options, nvars, 
    FitnessFcn, state, thisScore, thisPopulation)

    该函数的参量是

    • parents - 选择函数选择的父代的行向量

    • options - 选项

    • nvars - 变量个数

    • FitnessFcn - 适应度函数

    • state - 包含有关当前代信息的结构体。状态结构体 描述 state 的字段。

    • thisScore - 当前种群分数的向量

    • thisPopulation - 当前种群中的个体矩阵

    该函数返回 mutationChildren(变异的后代)作为矩阵,其中行对应于子代。矩阵的列数为 nvars

    传递额外参数 解释如何为函数提供附加参数。

    小心

    当您有边界或线性约束时,请确保您的变异函数创建的个体满足这些约束。否则,您的种群不一定满足约束。

交叉选项

交叉选项指定遗传算法如何组合两个个体或父母,以形成下一代的交叉子代。

CrossoverFcn 指定执行交叉的函数。您可以从以下函数中进行选择:

  • 'crossoverscattered' 是用于没有线性约束问题的默认交叉函数,它创建一个随机二元向量,并从第一个父代中选择向量为 1 的基因,从第二个父代中选择向量为 0 的基因,然后将这些基因结合起来形成子代。例如,如果 p1p2 是父代

    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],该函数返回以下子项:

    child1 = [a b 3 4 e 6 7 8]

    小心

    当您的问题具有线性约束时,'crossoverscattered' 可能会导致分布不佳的种群。在这种情况下,使用不同的交叉函数,例如 'crossoverintermediate'

  • 'crossoversinglepoint' 在 1 和 nvars 之间选择一个随机整数 n,然后

    • 从第一个父代中选择编号小于或等于 n 的向量条目。

    • 从第二个父代中选择编号大于 n 的向量条目。

    • 将这些条目连接起来形成一个子向量。

      例如,如果 p1p2 是父代

      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]

    小心

    当您的问题具有线性约束时,'crossoversinglepoint' 可能会导致分布不佳的种群。在这种情况下,使用不同的交叉函数,例如 'crossoverintermediate'

  • 'crossovertwopoint'mn 之间选择两个随机整数 1nvars。该函数选择

    • 从第一个父代开始编号小于或等于 m 的向量条目

    • 从第二个父代开始,向量条目编号从 m+1n(含)

    • 从第一个父代开始,编号大于 n 的向量条目。

    然后,算法将这些基因连接起来形成单个基因。例如,如果 p1p2 是父代

    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]

    小心

    当您的问题具有线性约束时,'crossovertwopoint' 可能会导致分布不佳的种群。在这种情况下,使用不同的交叉函数,例如 'crossoverintermediate'

  • 'crossoverintermediate' 是存在线性约束时的默认交叉函数,它通过对父代取加权平均值来创建子代。您可以通过单个参数 ratio 指定权重,该参数可以是标量或长度为 nvars 的行向量。ratio 的默认值是全 1 的向量。按如下方式设置 ratio 参数。

    options = optimoptions('ga','CrossoverFcn', ...  
    {@crossoverintermediate, ratio});

    'crossoverintermediate' 使用以下公式从 parent1parent2 创建子项。

    child = parent1 + rand * Ratio * ( parent2 - parent1)

    如果 ratio 的所有条目都在 [0, 1] 范围内,则生成的子项位于通过将父代放置在相反顶点而定义的超立方体内。如果 ratio 不在该范围内,则子项可能位于超立方体之外。如果 ratio 是标量,那么所有子项都位于父代之间的线上。

  • 当问题有整数约束时,'crossoverlaplace' 是默认的交叉函数。拉普拉斯交叉使用以下任一公式(随机选择)生成子代:

    xOverKid = p1 + bl*abs(p1 – p2)

    xOverKid = p2 + bl*abs(p1 – p2)

    这里,p1p2xOverKid 的父代,而 bl 是根据拉普拉斯分布生成的随机数。有关此交叉函数的更多信息,请参阅以下参考资料的 2.1 节:

    Kusum Deep、Krishna Pratap Singsh、M. L. Kansal、C. Mohan。一种用于解决整数和混合整数优化问题的实数编码遗传算法。应用数学和计算,212 (2009),505-518。

  • 'crossoverheuristic' 返回位于包含两个父代的线上的子代,该子代与适应度值较好的父代相距一小段距离,并且远离适应度值较差的父代。您可以通过参数 ratio 指定子代与更好父代之间的距离。ratio 的默认值是 1.2。按如下方式设置 ratio 参数。

    options = optimoptions('ga','CrossoverFcn',...
                       {@crossoverheuristic,ratio});

    如果 parent1parent2 是父代,并且 parent1 具有更好的适应度值,则该函数返回子代

    child = parent2 + ratio * (parent1 - parent2);

    小心

    当您的问题具有线性约束时,'crossoverheuristic' 可能会导致分布不佳的种群。在这种情况下,使用不同的交叉函数,例如 'crossoverintermediate'

  • 'crossoverarithmetic' 所创建的子代是两个父代的加权算术平均值。对于线性约束和边界来说,子代总是可行的。

  • 注意

    当您的问题具有整数约束时,gagamultiobj 会强制整数约束、边界和所有线性约束在每次迭代中都是可行的。对于非默认的变异、交叉、创建和选择函数,gagamultiobj 在函数运行后应用额外的可行性例程。

  • 函数句柄使您能够编写自己的交叉函数。

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

    您的交叉函数必须具有以下调用语法。

    xoverKids = myfun(parents, options, nvars, FitnessFcn, ...
        unused,thisPopulation)

    该函数的参量是

    • parents - 选择函数选择的父代的行向量

    • options - 选项

    • nvars - 变量个数

    • FitnessFcn - 适应度函数

    • unused - 未使用占位符

    • thisPopulation - 代表当前种群的矩阵。矩阵的行数为 PopulationSize,列数为 nvars

    该函数返回 xoverKids(交叉后代)作为一个矩阵,其中行对应于子代。矩阵的列数为 nvars

    传递额外参数 解释如何为函数提供附加参数。

    小心

    当您有边界或线性约束时,请确保您的交叉函数创建的个体满足这些约束。否则,您的种群不一定满足约束。

迁移选项

注意

子种群是指遗传算法的一种并行处理形式。ga 目前不支持这种形式。在亚种群中,每只工作进程都会寄居多个个体。这些个体是一个亚群。工作进程会独立于其他工作进程进化出一个亚种群,除非由于迁徙导致一些个体在工作进程之间移动。

由于 ga 目前不支持这种形式的并行处理,因此将 PopulationSize 设置为向量,或者设置 MigrationDirectionMigrationIntervalMigrationFraction 选项没有任何好处。

迁移选项指定个体如何在亚群之间移动。如果将 PopulationSize 设置为长度大于 1 的向量,就会发生迁移。当发生迁移时,一个亚种群中最好的个体会取代另一个亚种群中最差的个体。从一个亚种群迁移到另一个亚种群的个体会被复制。它们并没有被从源亚群中删除。

您可以通过以下三个选项控制迁移的方式:

  • MigrationDirection - 迁移可以单向进行,也可以双向进行。

    • 如果将 MigrationDirection 设置为 'forward',则会向最后一个子种群进行迁移。也就是说,第 n 个子种群迁移到第 (n+1) 个子种群。

    • 如果将 MigrationDirection 设置为 'both',则第 n 个子种群将迁移到第 (n -1) 个子种群和第 (n+1) 个子种群中。

    迁徙在亚种群的末端结束。也就是说,最后一个亚种群会迁移到第一个亚种群中,而第一个亚种群也可能迁移到最后一个亚种群中。

  • MigrationInterval - 指定迁移之间经过了多少代。例如,如果将 MigrationInterval 设置为 20,则每 20 代进行一次迁移。

  • MigrationFraction - 指定在亚种群之间移动的个体数量。MigrationFraction 指定两个亚种群中较小亚种群移动的比例。例如,如果个体从 50 个个体的子种群迁移到 100 个个体的子种群,并且将 MigrationFraction 设置为 0.1,则迁移的个体数量为 0.1*50=5。

约束参数

约束参数参考非线性约束求解器。有关该算法的详细信息,请参阅遗传算法算法的非线性约束求解算法

通过将 NonlinearConstraintAlgorithm 选项设置为 'auglag'(增广拉格朗日)或 'penalty'(惩罚算法)在非线性约束算法之间进行选择。

增广拉格朗日遗传算法

  • InitialPenalty - 指定非线性约束算法使用的惩罚参数的初始值。InitialPenalty 必须大于或等于 1,默认值为 10

  • PenaltyFactor - 当问题未解决到所需的精度且约束不满足时,增加惩罚参数。PenaltyFactor 必须大于 1,默认值为 100

惩罚算法

惩罚算法默认使用 'gacreationnonlinearfeasible' 创建函数。此创建函数使用 fmincon 来查找可行个体。'gacreationnonlinearfeasible'InitialPopulationRange 选项边界内的各种初始点开始 fmincon。可选地,'gacreationnonlinearfeasible' 可以在初始点上并行运行 fmincon

注意

'gacreationnonlinearfeasible' 并不总是能创造出可行的种群。

您可以使用以下名称-值对为 'gacreationnonlinearfeasible' 指定调整参数。

名称
SolverOptsfmincon 选项,使用 optimoptionsoptimset 创建。
UseParallel当为 true 时,在初始点上并行运行 fmincon;默认为 false
NumStartPts起点的数量,值为正整数,最大为 sum(PopulationSize)

将名称-值对与 @gacreationnonlinearfeasible 一起包含在元胞数组中。

options = optimoptions('ga','CreationFcn',{@gacreationnonlinearfeasible,...
    'UseParallel',true,'NumStartPts',20});

多目标选项

多目标选项定义了 gamultiobj 算法的特征参数。可以指定以下参数:

  • ParetoFraction - 设置求解器从更高前沿选择个体时,保持在第一个帕累托前沿的个体比例。此选项是 0 至 1 之间的标量。

    注意

    第一个帕累托前沿上的个体比例可以超过 ParetoFraction。当 迭代次数 第 6 步中其他排名的个体太少时,就会发生这种情况。

  • DistanceMeasureFcn - 定义一个函数句柄,该函数计算个体的距离测量,在决策变量空间(基因型,也称为设计变量空间)或函数空间(表型)中计算。例如,默认的距离度量函数是函数空间中的 'distancecrowding',与 {@distancecrowding,'phenotype'} 相同。

    “距离”衡量的是种群中每个个体的拥挤程度。从以下选项中选择:

    • 'distancecrowding',或等效的 {@distancecrowding,'phenotype'} - 测量适应度函数空间中的距离。

    • {@distancecrowding,'genotype'} - 测量决策变量空间中的距离。

    • @distancefunction - 使用以下模板编写自定义距离函数。

      function distance = distancefunction(pop,score,options)
      % Uncomment one of the following two lines, or use a combination of both
      % y = score; % phenotype
      % y = pop; % genotype
      popSize = size(y,1); % number of individuals
      numData = size(y,2); % number of dimensions or fitness functions
      distance = zeros(popSize,1); % allocate the output
      % Compute distance here

      gamultiobj 传递了 pop 中的种群、scores 中的种群计算分数以及 options 中的选项。距离函数返回从种群每个成员到参考点的距离,例如某种意义上的最近邻居。例如,编辑内置文件 distancecrowding.m

混合函数选项

ga 混合函数

混合函数是在遗传算法终止后运行的另一个最小化函数。您可以在 HybridFcn 选项中指定混合函数。不要用于整数问题。选项包括

  • [] - 没有混合函数。

  • 'fminsearch' - 使用 MATLAB® 函数 fminsearch 执行无约束最小化。

  • 'patternsearch' - 使用模式搜索执行约束或无约束最小化。

  • 'fminunc' - 使用 Optimization Toolbox™ 函数 fminunc 执行无约束最小化。

  • 'fmincon' - 使用 Optimization Toolbox 函数 fmincon 执行约束最小化。

注意

确保您的混合函数接受您的问题约束。否则,ga 将引发错误。

您可以为混合函数设置单独的选项。使用 optimset 代替 fminsearch,或使用 optimoptions 代替 fminconpatternsearchfminunc。例如:

hybridopts = optimoptions('fminunc','Display','iter',...
    'Algorithm','quasi-newton');
在遗传算法 options 中包含混合选项如下:
options = optimoptions('ga',options,'HybridFcn',{@fminunc,hybridopts}); 
在设置 hybridopts 之前,options 必须存在。

有关示例,请参阅遗传算法中的混合方案。请参阅 何时使用混合函数

gamultiobj 混合函数

混合函数是在多目标遗传算法终止后运行的另一个最小化函数。您可以在 'fgoalattain' 选项中指定混合函数 HybridFcn

在使用多目标混合函数时,求解器执行以下操作:

  1. 计算解中每个目标函数的最大值和最小值。对于解 j 处的目标 k,让

    Fmax(j)=maxkFk(j)Fmin(j)=minkFk(j).

  2. 计算每个解的总权重 k

    w(k)=jFmax(j)Fk(j)1+Fmax(j)Fmin(j).

  3. 计算每个解 j 中每个目标函数 k 的权重,

    p(j,k)=w(k)Fmax(j)Fk(j)1+Fmax(j)Fmin(j).

  4. 对于每个解 k,使用目标向量 Fkj)和权重向量 pjk)执行目标实现问题。

有关更多信息,请参阅 Deb [3] 的第 9.6 节。

停止条件选项

停止标准决定导致算法终止的原因。您可以指定以下选项:

  • MaxGenerations - 指定遗传算法执行的最大迭代次数。默认值为 100*numberOfVariables

  • MaxTime - 指定遗传算法在停止前运行的最大时间(以秒为单位),以 tictoc 为单位。此限制在每次迭代后强制执行,因此当迭代花费大量时间时,ga 可能会超出此限制。

  • FitnessLimit - 如果最佳适应度值小于或等于 FitnessLimit 的值,则算法停止。不适用于 gamultiobj

  • MaxStallGenerations - 如果最佳适应度函数值在 MaxStallGenerations 上的平均相对变化小于或等于 FunctionTolerance,则算法停止。(如果 StallTest 选项为 'geometricWeighted',则测试针对的是几何加权平均相对变化。)对于具有非线性约束的问题,MaxStallGenerations 适用于子问题(请参阅 遗传算法算法的非线性约束求解算法)。

    对于 gamultiobj,如果 MaxStallGenerations 上帕累托解的扩展的相对变化的几何平均小于 FunctionTolerance,并且最终扩展小于最后 MaxStallGenerations 上的平均扩展,则算法停止。几何平均系数为 ½。价差是帕累托前沿移动的量度。请参阅 gamultiobj 算法

  • MaxStallTime - 如果在 MaxStallTime 指定的秒数时间间隔内最佳适应度值没有任何改善(由 tictoc 测量),则算法停止。

  • FunctionTolerance - 如果最佳适应度函数值在 MaxStallGenerations 上的平均相对变化小于或等于 FunctionTolerance,则算法停止。(如果 StallTest 选项为 'geometricWeighted',则测试针对的是几何加权平均相对变化。)

    对于 gamultiobj,如果 MaxStallGenerations 上帕累托解的扩展的相对变化的几何平均小于 FunctionTolerance,并且最终扩展小于最后 MaxStallGenerations 上的平均扩展,则算法停止。几何平均系数为 ½。价差是帕累托前沿移动的量度。请参阅 gamultiobj 算法

  • ConstraintTolerance - ConstraintTolerance 不用作停止条件。它用于确定非线性约束的可行性。另外,max(sqrt(eps),ConstraintTolerance) 确定在线性约束下的可行性。

有关示例,请参阅设置最大代数和停滞代数

输出函数选项

输出函数是遗传算法在每代调用的函数。与其他求解器不同,ga 输出函数不仅可以读取算法状态的值,还可以修改这些值。输出函数还可以根据您设置的条件停止求解器。

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

对于多个输出函数,请输入函数句柄的元胞数组:

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

要查看可用于编写自己的输出函数的模板,请输入

edit gaoutputfcntemplate

(在 MATLAB 命令行进行此输入)。

有关示例,请参阅 遗传算法的自定义输出函数。有关使用 gamultiobj 的示例,请参阅gamultiobj 的自定义输出函数

输出函数的结构

您的输出函数必须具有以下调用语法:

[state,options,optchanged] = myfun(options,state,flag)

MATLAB 将 optionsstateflag 数据传递给您的输出函数,输出函数返回 stateoptionsoptchanged 数据。

注意

要停止迭代,请将 state.StopFlag 设置为非空字符向量,例如 'y'

输出函数具有以下输入参量:

  • options - 选项

  • state - 包含有关当前代信息的结构体。状态结构体 描述 state 的字段。

  • flag - 算法的当前状态:

    • 'init' - 初始化状态

    • 'iter' - 迭代状态

    • 'interrupt' - 'auglag' 非线性约束约束问题子问题的迭代。当 flag'interrupt' 时:

      • state 字段的值适用于子问题迭代。

      • ga 不接受 options 中的更改,并且忽略 optchanged

      • state.NonlinIneqstate.NonlinEq 字段不可用。

    • 'done' - 最终状态

传递额外参数 解释如何为函数提供附加参数。

输出函数向 ga 返回以下参量:

  • state - 包含有关当前代信息的结构体。状态结构体 描述 state 的字段。要停止迭代,请将 state.StopFlag 设置为非空字符向量,例如 'y'

  • options - 由输出函数修改的选项。

  • optchanged - 布尔标志,指示 options 的变化。要更改 options 以进行后续迭代,请将 optchanged 设置为 true

更改状态结构体

小心

随意改变状态结构体可能会导致不一致或错误的结果。通常,您可以使用变异或交叉函数来实现相同或更好的状态修改,而不是在绘图函数或输出函数中改变状态结构体。

ga 输出函数可以改变 state 结构体(请参阅 状态结构体)。更改此结构体中的值时要小心,因为您可能会将不一致的数据传回 ga

提示

如果您的输出结构体改变了 Population 字段,那么一定要更新 Score 字段,并且可能还要更新 BestNonlinIneqNonlinEq 字段,以便它们包含一致的信息。

要在更改 Score 字段后更新 Population 字段,首先计算种群的适应度函数值,然后计算种群的适应度缩放。请参阅 适应度缩放选项

显示到命令窗口选项

'Display' 指定在遗传算法运行时在命令行上显示多少信息。可用选项包括

  • 'final'(默认)- 显示停止的原因。

  • 'off' 或等效的 'none' - 不显示任何输出。

  • 'iter' - 每次迭代时都会显示信息。

  • 'diagnose' - 每次迭代时都会显示信息。此外,诊断还列出了一些问题信息和已从默认值更改的选项。

'iter''diagnose' 都显示以下信息:

  • Generation - 代编号

  • f-count -适应度函数评估的累计次数

  • Best f(x) - 最佳适应度函数值

  • Mean f(x) - 平均适应适应度函数值

  • Stall generations - 自上次改善适应度函数以来的代数

当指定了非线性约束函数时,'iter''diagnose' 不会显示 Mean f(x),但会另外显示:

  • Max Constraint - 最大非线性约束违反

此外,'iter''diagnose' 在迭代显示之前显示问题信息,例如问题类型以及 gagamultiobj 正在使用哪个创建、变异、交叉和选择函数。

向量化和并行选项(用户函数评估)

您可以选择以串行、并行或向量化的方式评估适应度和约束函数。使用 optimoptions 设置 'UseVectorized''UseParallel' 选项。

  • 'UseVectorized'false(默认)时,ga 会在种群中循环时一次对一个个体调用适应度函数。(假设 'UseParallel' 为其默认值 false。)

  • 'UseVectorized'true 时,ga 会一次性对整个种群调用适应度函数适应度函数。

    如果存在非线性约束,适应度函数和非线性约束都需要向量化,以便算法以向量化的方式计算。

    有关示例,请参阅向量化适应度函数

  • UseParalleltrue 时,ga 使用您建立的并行环境并行调用适应度函数(请参阅 如何在 Global Optimization Toolbox 中使用并行处理)。将 UseParallel 设置为 false(默认)以进行串行计算。

注意

您不能同时使用向量化和并行计算。如果将 'UseParallel' 设置为 true 并将 'UseVectorized' 设置为 true,则 ga 将以向量化方式评估您的适应度和约束函数,而不是并行评估。

如何评估适应度和约束函数

 UseVectorized = falseUseVectorized = true
UseParallel = false串行向量化
UseParallel = true并行向量化