【MATLAB】多目标优化算法 NSGA-II(gamultiobj) 的使用精解
原始博文因为写的比较潦草,评论中有疑问的网友较多,所以重新写了一下 2021-4-24
增加了一些说明与参考文献,修改了几处笔误 2021-5-20
对于多目标优化(multiobjective optimization)算法 NSGA-II 实现的细节与原理不在此说明。感兴趣的读者可另行查阅
gamultiobj 的使用范式
编写程序
清除所有变量(非必须,但注意变量不能和下面所用的冲突)
1 | clear |
- 需求解模型的参数设置部分:(模型导入)
1 | %% 模型设置 |
目标函数:(这一段需放在脚本最后或单独放在一个文件里)
1 | function y=Fun(x) |
gamultiobj
求解器设置部分:
1 | %% 求解器设置 |
gamultiobj
求解与结果输出部分:
1 | %% 主求解 |
RUN
求解时间受求解器设置影响,可能会较长,请耐心等待
求解过程中会实时显示当前种群的情况:
如果已经达到满意,也可点击stop
按钮提前结束求解
最后的求解结果,即 Pareto 最优解集储存在[x,fval]
中,fval
是x
对应的目标函数值。fval
大致构成了一条空间曲线——Pareto 前沿。若各个解较为均匀分布,说明该图包含了大部分最优解情况,全局性优,适用性强。在满足 Pareto 最优的条件下,是没有办法在不让某一优化目标受损的情况下,令另一方目标获得更优的。所以这些解均为最优,对最优解的具体选择可以根据实际情况。
例子 1
表 1 工厂产品生产规格表
产品 | 生产时间(h/公斤) | 利润(元/公斤) | 加班时利润(元/公斤) |
---|---|---|---|
A | 3 | 100 | 90 |
B | 2 | 80 | 70 |
设工厂每周生产产品 A、B 的常规生产时长为$x_1$、$x_2$(h),加班生产时长为$x_3$、$x_4$ (h)。令$x=\left( x_1,x_2,x_3,x_4 \right)$ 。设每周的利润函数为$Z(x)$,加班时长函数为$f(x)$。
则目标函数为:
$$
Z\left( x \right) =\frac{x_1}{3}\times 100+\frac{x_3}{3}\times 90+\frac{x_2}{2}\times 80+\frac{x_4}{2}\times 70
$$
$$
f\left( x \right) =x_3+x_4
$$
约束条件为:
$$
\mathrm{s}.\mathrm{t}.\left{ \begin{array}{c}
\begin{array}{c}
\mathrm{x}_1+\mathrm{x}_2=120\
\mathrm{x}_3+\mathrm{x}_4\leqslant 48\
\end{array}\
\frac{\mathrm{x}_1}{3}\geqslant 30\
\frac{\mathrm{x}_2}{2}\geqslant 30\
\mathrm{x}_1,\mathrm{x}_2,\mathrm{x}_3,\mathrm{x}_4\geqslant 0\
\end{array} \right.
$$
因此,数学模型可以归纳为:
$$
min,,F\left( X \right) =\left( -Z\left( x \right) ,f\left( x \right) \right)
$$
$$
\mathrm{s}.\mathrm{t}.\left{ \begin{array}{c}
\begin{array}{c}
\mathrm{x}_1+\mathrm{x}_2=120\
\mathrm{x}_3+\mathrm{x}_4\leqslant 48\
\end{array}\
\frac{\mathrm{x}_1}{3}\geqslant 30\
\frac{\mathrm{x}_2}{2}\geqslant 30\
\mathrm{x}_1,\mathrm{x}_2,\mathrm{x}_3,\mathrm{x}_4\geqslant 0\
\end{array} \right.
$$
MATLAB 求解如下:
1 | clear |
得到结果:
x1 x2 x3 x4 如下:
1 | 119.231391258967 0.769608488165712 0 0 |
例子 2
用$\mathrm{i}=1,2,3,4$分别表示 A、B、C、D 四种产品,$x_i$表示第 i 种产品的产量(kg)。设最大产量为$b_i$,销售量为$c_i$,成本为$t_i$,售价为$s_i$,能耗为$a_i$,生产时间为$d_i$。设该问题的利润函数为 $Z\left( x \right)$,能耗函数为$f\left( x \right)$。
则利润函数为:
$$
Z\left( X \right) =\sum_{i=1}^4{x_i\left( s_i-t_i \right)}
$$
能耗函数为:
$$
f\left( x \right) =\sum_{i=1}^4{a_ix_i}
$$
- 建立模型如下
$$
minF\left( X \right) =\left( -Z\left( x \right) ,f\left( x \right) \right)
$$
$$
\mathrm{s}.\mathrm{t}.\left{ \begin{array}{c}
\begin{array}{c}
x_i\leqslant b_i\left( i=1,2,3,4 \right)\
300\times 40\leqslant \sum_{i=1}^4{x_id_i\leqslant 300\times 48}\
150\leqslant x_3\
\end{array}\
\sum_{i=1}^4{a_ix_i}\leqslant 20\
x_i\geqslant 0\left( i=1,2,3,4 \right)\
\end{array} \right.
$$
- MATLAB 求解如下
1 | % 清除所有变量(非必须) |
求解结果为:
x1 x2 x3 x4 如下:
1 | 257.911499184609 147.920309053797 368.392357989384 129.803238959239 |
参考文献:
K. Deb, S. Agrawal, A. Pratap, T. Meyarivan. A fast and elitist multiobjective genetic algorithm: NSGA-II. IEEE Trans. Evol. Comput. 2002 6(2): 182-197.