Skip to main content
 首页 » 编程设计

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

2025年05月04日26sxdcgaq8080

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

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