混合整数 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 的分量被进一步限制在区域 内。
为您的问题设定边界
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)

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忽略ParetoFraction、DistanceMeasureFcn、InitialPenalty和PenaltyFactor选项。
所列出的限制主要是自然的,而不是任意的。例如,没有混合函数支持整数约束。因此,当存在整数约束时,ga 不使用混合函数。
具有非线性约束的整数规划
此示例尝试在五维空间中根据以下约束找到 Ackley 函数(运行此示例时包含)的最小值:
x(1)、x(3)和x(5)是整数。norm(x) = 4.
ga 求解器不支持非线性等式约束,仅支持非线性不等式约束。此示例显示了一种适用于某些问题的解决方法,但不保证一定有效。
Ackley 函数很难最小化。添加整数和等式约束会增加难度。
为了包含非线性等式约束,给出一个小的容差 tol,使得 x 的范数在 tol 4 的范围内。如果没有容差,非线性等式约束就永远不会得到满足,求解器就无法得到可行解。
将表达式 norm(x) = 4 写成两个“小于零”的不等式。
.
允许不等式有微小的容差。
.
编写一个非线性不等式约束函数 eqCon 来实现这些不等式。
type eqConfunction [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);

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);

检查第二个解。
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 的整数规划涉及基本算法的几项修改(请参阅 遗传算法的工作原理)。对于整数规划:
参考
[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.