如何用Python中的DEAP绘制多目标帕累托前沿

如何用Python中的DEAP绘制多目标帕累托前沿,python,matplotlib,visualization,genetic-programming,deap,Python,Matplotlib,Visualization,Genetic Programming,Deap,对于我正在从事的项目,我在DEAP中设置了3个不同的目标作为优化目标 它可以使用NSGA-II等算法处理多目标问题。是否仍然可以生成帕累托前沿曲面以可视化结果。按照本文中的方法计算帕累托点,而不是我自己的方法: def simple_cull(inputPoints, dominates): paretoPoints = set() candidateRowNr = 0 dominatedPoints = set() while True: can

对于我正在从事的项目,我在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点应用三角剖分并将其绘制为三角形曲面。结果是,红色形状是帕累托前沿:


编辑:您可能还想看一看,尽管它似乎是针对二维空间的。

下面是一个不是我自己的方法来计算您可以做的帕累托点:

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


编辑:您可能还想看一看,尽管它似乎适用于二维空间。

您可能还想看一看,它通过块嵌套循环BNL实现了一种更有效的方法来求解二维帕累托边界。这比上面的蛮力法快30倍。

您可能还想看看这一点,它实现了一种通过块嵌套循环BNL更有效地求解二维帕累托边界的方法。这比上面的暴力方法快30倍。

鼓励链接到外部资源,但请在链接周围添加上下文,以便您的其他用户了解它是什么以及为什么存在。始终引用重要链接中最相关的部分,以防无法访问目标站点或永久脱机。请参阅:。更新的链接:鼓励使用指向外部资源的链接,但请在链接周围添加上下文,以便您的其他用户了解它是什么以及它的存在原因。始终引用重要链接中最相关的部分,以防无法访问目标站点或永久脱机。请参阅:。更新的链接: