主要内容

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

混合整数 ga 优化

解决混合整数优化问题

当某些变量为整数值时,ga 可以解决问题。给出 intcon,即 x 分量的整数向量:

[x,fval,exitflag] = ga(fitnessfcn,nvars,A,b,[],[],...
    lb,ub,nonlcon,intcon,options)

intcon 是一个正整数向量,包含整数值的 x 分量。例如,如果您想限制 x(2)x(10) 为整数,请将 intcon 设置为 [2,10]

surrogateopt 求解器也接受整数约束。

注意

ga 可以使用整数变量解决的问题类型存在限制。特别是,当存在整数变量时,ga 不接受非线性等式约束。有关详细信息,请参阅整数遗传算法求解器的特征

提示

当为每个 x 分量提供下界和上界,ga 可以最好地解决整数问题。

拉斯特里金函数的混合整数优化

此示例显示如何找到拉斯特里金函数的最小值,限制 x 的第一个分量为整数。X 的分量被进一步限制在区域 5πx(1)20π,-20πx(2)-4π 内。

为您的问题设定边界

lb = [5*pi,-20*pi];
ub = [20*pi,-4*pi];

设置绘图函数,以便您可以查看 ga 的进度

opts = optimoptions('ga','PlotFcn',@gaplotbestf);

调用 ga 求解器,其中 x(1) 具有整数值

rng(1,'twister') % for reproducibility
intcon = 1;
[x,fval,exitflag] = ga(@rastriginsfcn,2,[],[],[],[],...
    lb,ub,[],intcon,opts)

Figure Genetic Algorithm contains an axes object. The axes object with title Best: 424.136 Mean: 614.506, xlabel Generation, ylabel Penalty value contains 2 objects of type scatter. These objects represent Best penalty value, Mean penalty value.

ga stopped because the average change in the penalty function value is less than options.FunctionTolerance and 
the constraint violation is less than options.ConstraintTolerance.
x = 1×2

   16.0000  -12.9325

fval = 
424.1355
exitflag = 
1

ga 快速收敛到解。

整数遗传算法求解器的特征

当包含整数约束时,ga 可以解决的问题类型有一些限制:

  • 没有非线性等式约束。任何非线性约束函数都必须对非线性等式约束返回 []。有关可能的解决方法,请参阅 具有非线性约束的整数规划

  • 仅限 doubleVector 种群类型。

  • 没有混合函数。ga 会覆盖 HybridFcn 选项的任何设置。

  • ga 忽略 ParetoFractionDistanceMeasureFcnInitialPenaltyPenaltyFactor 选项。

所列出的限制主要是自然的,而不是任意的。例如,没有混合函数支持整数约束。因此,当存在整数约束时,ga 不使用混合函数。

具有非线性约束的整数规划

此示例尝试在五维空间中根据以下约束找到 Ackley 函数(运行此示例时包含)的最小值:

  • x(1)x(3)x(5) 是整数。

  • norm(x) = 4.

ga 求解器不支持非线性等式约束,仅支持非线性不等式约束。此示例显示了一种适用于某些问题的解决方法,但不保证一定有效。

Ackley 函数很难最小化。添加整数和等式约束会增加难度。

为了包含非线性等式约束,给出一个小的容差 tol,使得 x 的范数在 tol 4 的范围内。如果没有容差,非线性等式约束就永远不会得到满足,求解器就无法得到可行解。

将表达式 norm(x) = 4 写成两个“小于零”的不等式。

x-40

-x-40.

允许不等式有微小的容差。

x-4-tol0

-x-4-tol0.

编写一个非线性不等式约束函数 eqCon 来实现这些不等式。

type eqCon
function [c, ceq] = eqCon(x)

ceq = [];
rad = 4;
tol = 1e-3;
confcnval = norm(x) - rad;
c = [confcnval - tol;-confcnval - tol];

设置以下选项:

  • MaxStallGenerations = 50 - 让求解器尝试一段时间。

  • FunctionTolerance = 1e-10 - 指定比平常更严格的停止条件。

  • MaxGenerations = 500 - 允许比默认值更多的代。

  • PlotFcn = @gaplotbestfun - 观察优化。

opts = optimoptions('ga','MaxStallGenerations',50,'FunctionTolerance',1e-10,...
    'MaxGenerations',500,'PlotFcn',@gaplotbestfun);

设置下界和上界来帮助求解器。

nVar = 5;
lb = -5*ones(1,nVar);
ub = 5*ones(1,nVar);

求解。

rng(0,'twister') % for reproducibility
[x,fval,exitflag] = ga(@ackleyfcn,nVar,[],[],[],[], ...
    lb,ub,@eqCon,[1 3 5],opts);

Figure Genetic Algorithm contains an axes object. The axes object with title Best Fitness: 5.96763, xlabel Generation, ylabel Penalty value contains an object of type scatter.

ga stopped because the average change in the penalty function value is less than options.FunctionTolerance and 
the constraint violation is less than options.ConstraintTolerance.

检查解。

x,fval,exitflag,norm(x)
x = 1×5

         0    0.9706    1.0000    3.6158   -1.0000

fval = 
5.9676
exitflag = 
1
ans = 
4.0020

奇数 x 分量是整数,如指定的那样。x 的范数为 4,在给定的 1e-3 相对容差范围内。

尽管退出标志为正,但该解并不是全局最优的。以更大的种群再次运行该问题并检查解。

opts = optimoptions(opts,'Display','off','PopulationSize',400);
[x2,fval2,exitflag2] = ga(@ackleyfcn,nVar,[],[],[],[], ...
    lb,ub,@eqCon,[1 3 5],opts);

Figure Genetic Algorithm contains an axes object. The axes object with title Best Fitness: 4.23849, xlabel Generation, ylabel Penalty value contains an object of type scatter.

检查第二个解。

x2,fval2,exitflag2,norm(x2)
x2 = 1×5

   -1.0000    2.0082   -1.0000   -2.9954    1.0000

fval2 = 
4.2385
exitflag2 = 
1
ans = 
4.0006

第二次运行给出了更好的解(更低的适应度函数值)。再次,奇数 x 分量是整数,并且 x2 的范数是 4,在给定的相对容差 1e-3 范围内。

请注意,此过程可能失败;ga 难以同时处理整数和非线性等式约束。

有效整数 ga

为了在整数问题上最有效地使用 ga,请遵循以下准则。

  • 尽可能紧密地绑定每个分量。这种做法使得 ga 拥有最小的搜索空间,从而使 ga 能够最有效地进行搜索。

  • 如果无法边界分量,请指定适当的初始范围。默认情况下,ga 为每个分量创建一个范围为 [-1e4,1e4] 的初始种群。当默认值不合适时,较小或较大的初始范围可以产生更好的结果。要更改初始范围,请使用 InitialPopulationRange 选项。

  • 如果您有超过 10 个变量,请使用 PopulationSize 选项设置大于默认值的种群规模。对于六个或更多变量,默认值为 200。对于较大的种群规模:

    • ga 可能需要很长时间才能收敛。如果达到最大代数(退出标志 0),请增加 MaxGenerations 选项的值。

    • 降低变异率。为此,请将 CrossoverFraction 选项的值从其默认值 0.8 增加到 0.9 或更高。

    • EliteCount 选项的值从其默认值 0.05*PopulationSize 增加到 0.1*PopulationSize 或更高。

有关选项的信息,请参阅 ga options 输入参量。

整数 ga 算法

使用 ga 的整数规划涉及基本算法的几项修改(请参阅 遗传算法的工作原理)。对于整数规划:

  • 默认情况下,特殊的创建、交叉和变异函数强制变量为整数。有关详细信息,请参阅 Deep 等人 [2]

  • 如果使用非默认的创建、交叉或变异函数,ga 会在每次迭代时强制线性可行性和针对整数约束的可行性。

  • 遗传算法试图最小化罚函数,而不是适应度函数。罚函数包含一个不可行性项。该惩罚函数默认与二元锦标赛选择相结合,以选择后代的个体。某个种群中某个成员的罚函数值为:

    • 如果成员是可行的,则罚函数就是适应度函数。

    • 如果成员不可行,罚函数是种群中可行成员中的最大适应度函数,加上(不可行)点的约束违反总和。

    有关罚函数的详细信息,请参阅 Deb [1]

参考

[1] Deb, Kalyanmoy. An efficient constraint handling method for genetic algorithms. Computer Methods in Applied Mechanics and Engineering, 186(2–4), pp. 311–338, 2000.

[2] Deep, Kusum, Krishna Pratap Singh, M.L. Kansal, and C. Mohan. A real coded genetic algorithm for solving integer and mixed integer optimization problems. Applied Mathematics and Computation, 212(2), pp. 505–518, 2009.

另请参阅

主题