文章目录
- 1 多标准决策
- 2 Compromise编程
- 3 伪权重
- 参考文献
1 多标准决策
在获取一组非支配解后,可以由决策者决定保留一些甚至是单个的解。这个针对多目标问题的决策过程也称为多标准决策 (Multi-criteria decision making, MCDM)。尽管Pymoo的主要精力放在优化上,其也依然提供了一些初级工具来找到一个合适的解。
一个双目标优化的示意可以从中找到,其给出了Pareto最优解的示意:
需要注意不同目标的值的尺度可能差距很大,需要对其进行标准处理。如果没有标准化,横坐标所对应的优化目标将目标搜索空间中的任何距离计算,因为它的规模更大。处理不同尺度的目标是任何多目标算法的固有部分,而一种常见的标准化方法是使用所谓的理想和最低点。
出于决策和概括目的,我们假设理想和最低点 (也称为边界点) 和Pareto前沿) 是未知的。因此,这些点可以近似为:
相应代码为:
import matplotlib.pyplot as plt
# 理想点和最低点
approx_ideal = F.min(axis=0)
approx_nadir = F.max(axis=0)
plt.figure(figsize=(7, 5))
plt.tight_layout()
plt.scatter(F[:, 0], F[:, 1], s=30, facecolors='none', edgecolors='blue')
plt.scatter(approx_ideal[0], approx_ideal[1], facecolors='none', edgecolors='red', marker="*", s=100, label="Ideal Point (Approx)")
plt.scatter(approx_nadir[0], approx_nadir[1], facecolors='none', edgecolors='black', marker="p", s=100, label="Nadir Point (Approx)")
plt.title("Search Space")
plt.legend()
plt.show()
基于理想和最低点,可以获取缩放后的Pareto最优解:
代码如下:
import matplotlib.pyplot as plt
# 理想点和最低点
approx_ideal = F.min(axis=0)
approx_nadir = F.max(axis=0)
nF = (F - approx_ideal) / (approx_nadir - approx_ideal)
fl = nF.min(axis=0)
fu = nF.max(axis=0)
print(f"Scale f1: [{fl[0]}, {fu[0]}]")
print(f"Scale f2: [{fl[1]}, {fu[1]}]")
plt.figure(figsize=(7, 5))
plt.scatter(nF[:, 0], nF[:, 1], s=30, facecolors='none', edgecolors='blue')
plt.title("Objective Space")
plt.show()
2 Compromise编程
另一种决策方法是使用分解函数,其需要定义反映用户意愿的权重向量。向量中的权重值只能是正浮点数,和为1,向量长度等于目标数。
对于当前的双目标优化,假设权重为:
weights = np.array([0.2, 0.8])
导入分解函数:
from pymoo.decomposition.asf import ASF
decomp = ASF()
当前使用的分解函数是ASF,其应当被最小化,所以选择从所有解决方案中计算出的最小ASF值:
i = decomp.do(nF, 1/weights).argmin()
此时的权重为1/weights。对于ASF,存在数值除法和数值相乘两种方式。在pymoo中,我们进行不体现用户标准的思想的划分。因此,需要应用逆运算,这将在后续介绍,目前需要知道关于分解函数的决策是至关重要的。
此时,我们可以在原始尺度上表示找到的最优解:
代码如下:
plt.figure(figsize=(7, 5))
plt.scatter(F[:, 0], F[:, 1], s=30, facecolors='none', edgecolors='blue')
plt.scatter(F[i, 0], F[i, 1], marker="x", color="red", s=200)
plt.title("Objective Space")
plt.show()
3 伪权重
个目标的伪权重给定为:
该方程计算关于每个目标的最差解的归一化距离。对于非凸Pareto前沿,伪权重不对应于使用加权和进行优化的结果。而对于凸Pareto前沿,伪权重表示目标空间中的位置:
代码如下:
from pymoo.mcdm.pseudo_weights import PseudoWeights
i = PseudoWeights(weights).do(nF)
plt.figure(figsize=(7, 5))
plt.scatter(F[:, 0], F[:, 1], s=30, facecolors='none', edgecolors='blue')
plt.scatter(F[i, 0], F[i, 1], marker="x", color="red", s=200)
plt.title("Objective Space")
plt.show()
参考文献
【1】https://pymoo.org/getting_started/part_3.html