一、多原则决议计划拟定 (MCDM, Multi-Criteria Decision Making)

  • Multi-Criteria Decision Making的内涵:
    在多方针优化进程中,咱们会取得一组非分配(non-dominated)的解,当有了这些能够做决议计划的非分配解的时候,咱们如何做决议计划呢?这个问题正是我么为什么要做多方针优化的目的。咱们能够依据的最优计划(非分配解)做出单个决议,这个进程便是所谓的多原则决议计划拟定(MCDM)。

尽管,Pymoo的首要重点在于优化,而不是 MCDM,但是该框架同样提供了一些基本的相关东西,可用于MCDM问题的分析,终究寻找一个理论上最优的决议计划。

二、MCDM相关的基本分析办法

2.1 折中编程 (Compromise Programming)

咱们能够运用任何标量化办法,并将其用于后处理(post-processing)。假定咱们的算法已经收敛于Pareto前沿,咱们能够经过以下几步实现折中编程办法:

阐明:
(1)这儿以一个包含两个方针函数的zdt1问题为例,并别两个方针的重要程度一样,行将权重向量weight设置为[0.5, 0.5]
(2)运用的分解函数为增强的标量化函数(ASF, Augmented Scalarization Function),它是一个十分有名的多方针评价量。由于这儿求解的是最小化问题,所以咱们运用ASF()对象的argmin()类办法挑选核算后的最小值。

  • (1) 获取求解的问题
from pymoo.problems import get_problem
# 界说一个已经准备好的 zdt1 问题
F = get_problem("zdt1").pareto_front()
1234
  • (2) 初始化权重和分解函数(decomposition function)
import numpy as np
from pymoo.decomposition.asf import ASF
weights = np.array([0.5, 0.5])
decomp = ASF()
12345
  • (3) 运用分解来搜索最佳的值:
I = decomp(F, weights).argmin()
print("Best regarding decomposition: Point %s - %s" % (I, F[I]))
12

上面三步履行的成果如下图所示:

Pymoo:基于多准则决策制定 (MCDM) 方法的算法设计

  • (4) 成果可视化:
from pymoo.visualization.scatter import Scatter
#! 4. 制作散点图
plot = Scatter()
#? 增加 zdt1 函数的采样点
plot.add(F, color="blue", alpha=0.2, s=10)
#? 增加最佳决议计划点 I
plot.add(F[I], color="red", s=30)
plot.do()
plot.apply(lambda ax: ax.arrow(0, 0, 0.5, 0.5, color='black', head_width=0.01, head_length=0.01, alpha=0.4))
plot.show()
1234567891011

代码履行成果如下图所示:

Pymoo:基于多准则决策制定 (MCDM) 方法的算法设计

2.2 伪权重办法(Pseudo-Weights)

伪权重办法的详细原理能够参考文献1(后续有机会,我能够翻译一下),经过下面的公式核算出第i ii个方针函数的伪权重w i w_iwi​:
w i = ( f i m a x − f i ( x ) ) / ( f i m a x − f i m i n ) ∑ m = 1 M ( f m m a x − f m ( x ) ) / ( f m m a x − f m m i n ) w_i = \frac{(f_i^{max} – f_i(x))/(f_i^{max} – f_i^{min})}{\sum_{m=1}^M (f_m^{max} – f_m(x)) / (f_m^{max} – f_m^{min})}wi​=∑m=1M​(fmmax​−fm​(x))/(fmmax​−fmmin​)(fimax​−fi​(x))/(fimax​−fimin​)​

该方程核算每个方针i ii到最差解的归一化间隔(Normalized Distance)。

from pymoo.problems import get_problem
from pymoo.mcdm.pseudo_weights import PseudoWeights
from pymoo.util.ref_dirs import get_reference_directions
from pymoo.visualization.petal import Petal
import numpy as np
#! 1. 问题界说:
#? 运用das-dennis办法,界说参考方向
ref_dirs = get_reference_directions("das-dennis", 4, n_partitions=12)
#? 获取问题 dtlz1
F = get_problem("dtlz1").pareto_front(ref_dirs)
#! 2. 初始化权重与权重核算
#* (1) 假定四个方向的重要性共同的状况
weights = np.array([0.25, 0.25, 0.25, 0.25])
#? 运用 PseudoWeights 办法核算决议计划伪权重
a, pseduo_weights = PseudoWeights(weights).do(F, return_pseudo_weights=True)
#* (2) 假定四个方向的重要性不共同的状况
weights = np.array([0.4, 0.2, 0.15, 0.25])
b, pseduo_weights = PseudoWeights(weights).do(F, return_pseudo_weights=True)
#! 3. 成果可视化
plot = Petal(bounds=(0, 0.5), reverse=True)
plot.add(F[[a, b]])
plot.show()
1234567891011121314151617181920212223242526

代码履行成果如下图所示:

Pymoo:基于多准则决策制定 (MCDM) 方法的算法设计

2.3 高折中点(High Trade-off Points)

该办法的详细原理能够参考文献2,pymoo在核算高折中点指标的办法便是参考这篇文献的。下面分别给出3D空间决议计划的示例:

  • (1)获取3D(三方针)Pareto前沿
    咱们这儿首要应该得到一个多方针优化的一个3D空间的一组Pareto前沿。我的获取办法是,从Stanford 3D 扫描库房取得bunny.tar.gz数据,解压得到top3.ply文件,将其放到与脚本文件夹下。截取前400行top3.ply的点阵数据作为Pareto前沿核算成果,代码如下所示:
import numpy as np
from pymoo.visualization.scatter import Scatter
from pymoo.mcdm.high_tradeoff import HighTradeoffPoints
from plyfile import PlyData
# 1. 读取top3.ply点阵文件的前400行数据作为Pareto前沿
plydata = PlyData.read("top3.ply")
pf = np.array([plydata['vertex']['x'], plydata['vertex']['y'], plydata['vertex']['z']])
pf = pf.T
pf = pf[0:400, :]
# 2. 运用HighTradeoffPoints办法核算决议计划点
dm = HighTradeoffPoints()
I = dm(pf)
# 3. 高折中点核算成果可视化
plot = Scatter(angle=(30, 130))
plot.add(pf, alpha=0.2)
plot.add(pf[I], color="red", s=100)
plot.show()
1234567891011121314151617181920

代码履行成果如下图所示:

Pymoo:基于多准则决策制定 (MCDM) 方法的算法设计

参考文献


  1. Kalyanmoy Deb and Deb Kalyanmoy. Multi-Objective Optimization Using Evolutionary Algorithms. John Wiley & Sons, Inc., New York, NY, USA, 2001. ISBN 047187339X.↩︎
  2. L. Rachmawati and D. Srinivasan.Multiobjective evolutionary algorithm with controllable focus on the knees of the pareto front. IEEE Transactions on Evolutionary Computation, 13(4):810–824, Aug 2009.