python - 如何在 Python 中使用 DEAP 绘制多目标帕累托边界

标签 python matplotlib visualization genetic-programming deap

对于我正在从事的项目,我在 DEAP 中设置了 3 个不同的目标作为优化目标,an evolution framework based on Python .

它可以使用像NSGA-II这样的算法来处理多目标问题。有没有办法生成帕累托边界面来可视化结果。

最佳答案

遵循本 link 中的食谱(不是我自己的)来计算您可以做的Pareto Points:

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 点应用三角剖分并将其绘制为三角形表面。结果是这样的(红色形状是帕累托前沿):

Pareto front in matplotlib

编辑:您也可能想看看 this (虽然它似乎是针对二维空间的)。

关于python - 如何在 Python 中使用 DEAP 绘制多目标帕累托边界,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37000488/

相关文章:

python - 在 matplotlib 轴上设置科学限制后调整指数文本

java - 用于创建 "The Secret Lives of Numbers"的工具

python - Cython:使用 C++ 流

python - Neo4Django - SyncDB 不创建表和图

python - Websocket 握手状态 426

python - Pandas :数东西

python - 将 mark_inset 与不同的范围图一起使用

opencv - 为什么 pyplot.imshow() 改变数组中的颜色 channel

python - Seaborn PairPlot 旋转 x 刻度标签。分类数据标签重叠

python - 具有不同轴范围的 Pandas 平行图