2016-05-03 9 views
0

Für das Projekt, an dem ich arbeitete, habe ich 3 verschiedene Ziele als Optimierungsziel in DEAP (das ist ein Evolution-Framework basierend auf Python).Wie man Pareto-Grenze mit DEAP in Python multipliziert

Es kann Multi-Objektive Problem mit Algorithmus wie NSGA-II bewältigen. Gibt es überhaupt eine Pareto-Grenzfläche zur Visualisierung der Ergebnisse?

Antwort

3

Nach einem Rezept in diesem link (meine eigene nicht), um die Pareto berechnen Punkte, die Sie tun können:

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() 

, werden Sie feststellen, dass der letzte Teil einer Triangulation auf die Pareto-Punkte anwendet und Zeichnen Sie es als eine dreieckige Oberfläche. Die Ergebnisse sind dies (wo die rote Form ist die Pareto-Front):

Pareto front in matplotlib

EDIT: Auch mögen Sie vielleicht einen Blick auf this nehmen (obwohl es für 2D-Räume zu sein scheint).