对于我正在从事的项目,我在基于 Python 的进化框架DEAP 中设置了 3 个不同的目标作为优化目标。
它可以使用类似NSGA-II 的算法来处理多目标问题。无论如何要生成帕累托前沿表面以可视化结果。
对于我正在从事的项目,我在基于 Python 的进化框架DEAP 中设置了 3 个不同的目标作为优化目标。
它可以使用类似NSGA-II 的算法来处理多目标问题。无论如何要生成帕累托前沿表面以可视化结果。
按照此链接中的食谱(不是我自己的)来计算您可以执行的帕累托点:
def simple_cull(inputPoints, dominates):
paretoPoints = set()
candidateRowNr = 0
dominatedPoints = set()
while True:
candidateRow = inputPoints[candidateRowNr]
inputPoints.remove(candidateRow)
rowNr = 0
nonDominated = True
while len(inputPoints) != 0 and rowNr < len(inputPoints):
row = inputPoints[rowNr]
if dominates(candidateRow, row):
# If it is worse on all features remove the row from the array
inputPoints.remove(row)
dominatedPoints.add(tuple(row))
elif dominates(row, candidateRow):
nonDominated = False
dominatedPoints.add(tuple(candidateRow))
rowNr += 1
else:
rowNr += 1
if nonDominated:
# add the non-dominated point to the Pareto frontier
paretoPoints.add(tuple(candidateRow))
if len(inputPoints) == 0:
break
return paretoPoints, dominatedPoints
def dominates(row, candidateRow):
return sum([row[x] >= candidateRow[x] for x in range(len(row))]) == len(row)
import random
inputPoints = [[random.randint(70,100) for i in range(3)] for j in range(500)]
paretoPoints, dominatedPoints = simple_cull(inputPoints, dominates)
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
dp = np.array(list(dominatedPoints))
pp = np.array(list(paretoPoints))
print(pp.shape,dp.shape)
ax.scatter(dp[:,0],dp[:,1],dp[:,2])
ax.scatter(pp[:,0],pp[:,1],pp[:,2],color='red')
import matplotlib.tri as mtri
triang = mtri.Triangulation(pp[:,0],pp[:,1])
ax.plot_trisurf(triang,pp[:,2],color='red')
plt.show()
,您会注意到最后一部分是对 Pareto 点应用三角剖分并将其绘制为三角形表面。结果是这样的(红色形状是帕累托前沿):
编辑:您也可能想看看这个(尽管它似乎是针对 2D 空间的)。
此外,您可能想看看这个Link,它通过块嵌套循环 (BNL) 实现了一种更有效的方法来解决 2D 帕累托边界。这比上面的蛮力方法快 30 倍。