[PYTHON] Versuchen Sie es mit Platypus, einer Mehrzweckoptimierungsbibliothek

Mehrzweckoptimierung

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. multi.png

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

Testfragen

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. pareto1.png

Ich habe versucht, es als 3-Zweck-Problem als DTLZ2 (3) zu optimieren. pareto2.png

Probleme erstellen und 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. multi3.png

Ü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")

Referenzseite

Platypus - Multiobjective Optimization in Python

Recommended Posts

Versuchen Sie es mit Platypus, einer Mehrzweckoptimierungsbibliothek
Versuchen Sie die Funktionsoptimierung mit Hyperopt
Versuchen Sie HTML-Scraping mit der Python-Bibliothek
Versuchen Sie es mit einer probabilistischen Programmiersprache (Pyro).
Versuchen Sie es mit Tkinter
Versuchen Sie es mit Docker-Py
Verstärkungslernen 10 Versuchen Sie es mit einem trainierten neuronalen Netz.
Versuchen Sie, mithilfe der Python-Anforderungsbibliothek eine Webseite und eine JSON-Datei abzurufen
Versuchen Sie es mit PDFMiner
Versuchen Sie, QR-Code mit Raspberry Pi zu verwenden
Versuchen Sie es mit Sourcetrail, einem Quellcode-Visualisierungstool
Versuchen Sie es mit Geopandas
Versuchen Sie es mit Selen
Versuchen Sie es mit scipy
Versuchen Sie es mit Django-Swiftbrowser
Versuchen Sie es mit matplotlib
Versuchen Sie es mit tf.metrics
Versuchen Sie es mit PyODE
Ein Hinweis zur Bibliotheksimplementierung, in der Hyperparameter mithilfe der Bayes'schen Optimierung in Python untersucht werden
(Python) Versuchen Sie, eine Webanwendung mit Django zu entwickeln
Versuchen Sie, mit der Twitter-API v2 ein soziales Diagramm zu zeichnen
Versuchen Sie die Gesichtserkennung in Echtzeit mit einer Webkamera
Versuchen Sie es mit virtualenv (virtualenvwrapper)
[Azure] Versuchen Sie, Azure-Funktionen zu verwenden
Versuchen Sie es jetzt mit virtualenv
Versuchen Sie es mit W & B.
Python-Optimierungsbibliothek Pulp
Versuchen Sie es mit Django templates.html
[Kaggle] Versuchen Sie es mit LGBM
Versuchen Sie es mit dem Feed-Parser von Python.
Versuchen Sie es mit Pythons Tkinter
Versuchen Sie es mit Tweepy [Python2.7]
Versuchen Sie es mit Pytorchs collate_fn
Probieren Sie die ähnliche Suche von Image Search mit Python SDK [Search] aus.
Versuchen Sie, eine multimodale Verteilung mithilfe des EM-Algorithmus zu modellieren
Versuchen Sie, eine in Python geschriebene Funktion mit Fn Project auszuführen
Versuchen Sie es mit [Tails], dem Favoriten eines Hackers (?), Durch USB-Booten.