Die Mehrzieloptimierung ist die gleichzeitige Optimierung mehrerer Zielfunktionen, die in einer Kompromissbeziehung stehen. Bei der Einzelzieloptimierung gibt es eine optimale Lösung, bei der Mehrzieloptimierung jedoch nicht immer eine optimale Lösung. Die optimale Lösung bei der Mehrzieloptimierung wird als ** Pareto-optimale Lösung ** bezeichnet. Unten sehen Sie ein Diagramm der optimalen Pareto-Lösung.
platypus Schnabeltier scheint eine der Bibliotheken für die Mehrzweckoptimierung zu sein. Insbesondere scheinen viele Verfahren wie NSGA-II, NSGA-III, MOEA / D, IBEA, Epsilon-MOEA, SPEA2, GDE3, OMOPSO, SMPSO, Epsilon-NSGA-II verwendet werden zu können.
Installieren Sie mit Pip zu verwenden.
pip install platypus-opt
Platypus bietet auch Testfragen. Verwenden wir dieses Mal eine Testfrage namens DTLZ2.
from platypus import NSGAII, Problem, Real, nondominated, Integer
import matplotlib.pyplot as plt
from platypus.problems import DTLZ2
def main():
#Problem,Stellen Sie den Algorithmus ein,Suchausführung
problem = DTLZ2(2)
algorithm = NSGAII(problem, population_size=100)
algorithm.run(10000)
#Nicht-Minderwertigkeit extrahieren
nondominated_solutions = nondominated(algorithm.result)
#Zeichnen Sie ein Diagramm
plt.scatter([s.objectives[0] for s in nondominated_solutions if s.feasible],
[s.objectives[1] for s in nondominated_solutions if s.feasible])
plt.show()
if __name__ == '__main__':
main()
Das Ergebnis der Optimierung als Zweizweckproblem als DTLZ2 (2) ist wie folgt: Es wurde bestätigt, dass die optimale Pareto-Lösung erhalten wurde.
Ich habe versucht, es als 3-Zweck-Problem als DTLZ2 (3) zu optimieren.
Mit Platypus können Sie auch Ihre eigenen Probleme optimieren. Lassen Sie uns zunächst die Zielfunktion festlegen. Dieses Mal werden wir das Zielminimierungsproblem mit 2 Variablen 2 optimieren. Die folgenden 2 sind die Zielfunktionen.
f(x)=2x_1^2+x_2^2
g(x)=-x_1^2-2x_2^2
#Einstellen der Zielfunktion
def objective(vars):
x1 = int(vars[0])
x2 = int(vars[1])
return [2*(x1**2) + x2**2, -x1**2 -2*(x2**2)]
Nachdem Sie die Zielfunktion festgelegt haben, legen wir die Suche fest. Sie können das Problem mit Problem einstellen (Anzahl der Variablen, Anzahl der Zielfunktionen).
#2 Variablen 2 Zweckproblem
problem = Problem(2, 2)
problem.directions [:] = Problem.MINIMIZE legt es als Minimierungsproblem fest. Wenn Sie es maximieren möchten, können Sie es als Problem.MAXIMIZE festlegen. Wenn Sie Minimierung und Maximierung mischen möchten, können Sie sie für jede Zielvariable festlegen. Beispiel: problem.directions [:] = [Problem.MINIMIZE, Problem.MAXIMIZE].
#Stellen Sie Minimieren oder Maximieren ein
problem.directions[:] = Problem.MINIMIZE
Als nächstes setzen wir die Entscheidungsvariable. Dieses Mal sind sowohl $ x_1 $ als auch $ x_2 $ ganze Zahlen, und der Bereich ist $ 0 \ leq x_1 \ leq100 $ und $ 0 \ leq x_2 \ leq50 $. Diesmal ist die Entscheidungsvariable eine Ganzzahl. Wenn Sie sie jedoch als reelle Zahl behandeln möchten, können Sie die Ganzzahl in Real ändern.
#Legen Sie den Bereich der Entscheidungsvariablen fest
int1 = Integer(0, 100)
int2 = Integer(0, 50)
problem.types[:] = [int1, int2]
Der obige Code kann wie folgt zusammengefasst werden.
def main():
#2 Variablen 2 Zweckproblem
problem = Problem(2, 2)
#Stellen Sie Minimieren oder Maximieren ein
problem.directions[:] = Problem.MINIMIZE
#Legen Sie den Bereich der Entscheidungsvariablen fest
int1 = Integer(0, 100)
int2 = Integer(0, 50)
problem.types[:] = [int1, int2]
problem.function = objective
#Stellen Sie den Algorithmus ein,Suchausführung
algorithm = NSGAII(problem, population_size=50)
algorithm.run(1000)
Die folgenden Ergebnisse wurden erhalten. Es ist keine glatte Kurve wie DTLZ2 (), aber ich konnte eine Pareto-optimale Lösung erhalten.
Übrigens können Sie DataFrame die Informationen der optimalen Pareto-Lösung hinzufügen, indem Sie den folgenden Code hinzufügen.
df = pd.DataFrame(columns=("x1", "x2", "f1", "f2"))
for i in range(len(nondominated_solutions)):
df.loc[i, "x1"] = int1.decode(nondominated_solutions[i].variables[0])
df.loc[i, "x2"] = int2.decode(nondominated_solutions[i].variables[1])
df.loc[i, "f1"] = nondominated_solutions[i].objectives[0]
df.loc[i, "f2"] = nondominated_solutions[i].objectives[1]
df.to_csv("NSGAII.csv")
Platypus - Multiobjective Optimization in Python
Recommended Posts