[PYTHON] Essayez d'utiliser Platypus, une bibliothèque d'optimisation polyvalente

Optimisation polyvalente

L'optimisation multi-objectifs est l'optimisation simultanée de plusieurs fonctions objectives qui sont dans une relation de compromis. Dans le cas de l'optimisation mono-objectif, il existe une solution optimale, mais dans le cas de l'optimisation multi-objectifs, il n'y a pas toujours une solution optimale. La solution optimale en optimisation multi-objectifs est appelée ** solution optimale de Pareto **. Voici un diagramme de la solution optimale de Pareto. multi.png

platypus platypus semble être l'une des bibliothèques pour l'optimisation polyvalente. Plus précisément, il semble que de nombreuses méthodes telles que NSGA-II, NSGA-III, MOEA / D, IBEA, Epsilon-MOEA, SPEA2, GDE3, OMOPSO, SMPSO, Epsilon-NSGA-II peuvent être utilisées.

Installer avec pip à utiliser.

pip install platypus-opt

Questions de test

Platypus fournit également des questions de test. Cette fois, utilisons une question test appelée DTLZ2.

from platypus import NSGAII, Problem, Real, nondominated, Integer
import matplotlib.pyplot as plt
from platypus.problems import DTLZ2

def main():
    #problème,Définir l'algorithme,Exécution de la recherche
    problem = DTLZ2(2)
    algorithm = NSGAII(problem, population_size=100)
    algorithm.run(10000)

    #Extraire la non-infériorité
    nondominated_solutions = nondominated(algorithm.result)

    #Dessinez un graphique
    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()

Le résultat de l'optimisation en tant que problème à deux objectifs comme DTLZ2 (2) est le suivant: il a été confirmé que la solution optimale de Pareto a été obtenue. pareto1.png

J'ai essayé de l'optimiser en tant que problème à 3 objectifs comme DTLZ2 (3). pareto2.png

Créer et optimiser les problèmes

Platypus vous permet également d'optimiser vos propres problèmes. Commençons par définir la fonction objectif. Cette fois, nous optimiserons le problème de minimisation des objectifs à 2 variables 2. Les 2 suivantes sont les fonctions objectives.

f(x)=2x_1^2+x_2^2
g(x)=-x_1^2-2x_2^2
#Définition de la fonction objectif
def objective(vars):
    x1 = int(vars[0])
    x2 = int(vars[1])
    return [2*(x1**2) + x2**2, -x1**2 -2*(x2**2)]

Après avoir défini la fonction objectif, définissons la recherche. Vous pouvez définir le problème avec Problème (nombre de variables, nombre de fonctions objectif).

#2 variables 2 problème de but
problem = Problem(2, 2)

problem.directions [:] = Problem.MINIMIZE le définit comme un problème de minimisation. Si vous souhaitez l'agrandir, vous pouvez le définir comme Problem.MAXIMIZE. Si vous souhaitez combiner minimisation et maximisation, vous pouvez le définir pour chaque variable objectif. Par exemple, problem.directions [:] = [Problem.MINIMIZE, Problem.MAXIMIZE].

#Définir minimiser ou maximiser
problem.directions[:] = Problem.MINIMIZE

Ensuite, définissons la variable de décision. Cette fois, $ x_1 $ et $ x_2 $ sont des entiers, et la plage est $ 0 \ leq x_1 \ leq100 $ et $ 0 \ leq x_2 \ leq50 $. Cette fois, la variable de décision est un entier, mais si vous voulez la traiter comme un nombre réel, vous pouvez changer Integer en Real.

#Définir la plage de variables de décision
int1 = Integer(0, 100)
int2 = Integer(0, 50)
problem.types[:] = [int1, int2]

Le code ci-dessus peut être résumé comme suit.

def main():
    #2 variables 2 problème de but
    problem = Problem(2, 2)
    #Définir minimiser ou maximiser
    problem.directions[:] = Problem.MINIMIZE
    #Définir la plage de variables de décision
    int1 = Integer(0, 100)
    int2 = Integer(0, 50)
    problem.types[:] = [int1, int2]
    problem.function = objective
    #Définir l'algorithme,Exécution de la recherche
    algorithm = NSGAII(problem, population_size=50)
    algorithm.run(1000)

Les résultats suivants ont été obtenus. Ce n'est pas une courbe lisse comme DTLZ2 (), mais j'ai pu obtenir une solution optimale de Pareto. multi3.png

En passant, vous pouvez ajouter les informations de la solution optimale Pareto à DataFrame en ajoutant le code suivant.

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

Site de référence

Platypus - Multiobjective Optimization in Python

Recommended Posts

Essayez d'utiliser Platypus, une bibliothèque d'optimisation polyvalente
Essayez l'optimisation des fonctions à l'aide d'Hyperopt
Essayez le scraping HTML avec la bibliothèque Python
Essayez d'utiliser un langage de programmation probabiliste (Pyro)
Essayez d'utiliser Tkinter
Essayez d'utiliser docker-py
Apprentissage par renforcement 10 Essayez d'utiliser un réseau neuronal formé.
Essayez d'obtenir une page Web et un fichier JSON en utilisant la bibliothèque Requests de Python
Essayez d'utiliser PDFMiner
Essayez d'utiliser le code QR avec Raspberry Pi
Essayez d'utiliser Sourcetrail, un outil de visualisation de code source
Essayez d'utiliser des géopandas
Essayez d'utiliser Selenium
Essayez d'utiliser scipy
Essayez d'utiliser django-swiftbrowser
Essayez d'utiliser matplotlib
Essayez d'utiliser tf.metrics
Essayez d'utiliser PyODE
Une note sur l'implémentation de la bibliothèque qui explore les hyperparamètres à l'aide de l'optimisation bayésienne en Python
(Python) Essayez de développer une application Web en utilisant Django
Essayez de dessiner un graphe social à l'aide de l'API Twitter v2
Essayez la détection des visages en temps réel à l'aide d'une webcam
Essayez d'utiliser virtualenv (virtualenvwrapper)
[Azure] Essayez d'utiliser Azure Functions
Essayez d'utiliser virtualenv maintenant
Essayez d'utiliser W & B
Bibliothèque d'optimisation Python Pulp
Essayez d'utiliser Django templates.html
[Kaggle] Essayez d'utiliser LGBM
Essayez d'utiliser l'analyseur de flux de Python.
Essayez d'utiliser Tkinter de Python
Essayez d'utiliser Tweepy [Python2.7]
Essayez d'utiliser collate_fn de Pytorch
Essayez une recherche similaire de recherche d'images à l'aide du SDK Python [Recherche]
Essayez de modéliser une distribution multimodale à l'aide de l'algorithme EM
Essayez d'exécuter une fonction écrite en Python à l'aide de Fn Project
Essayez d'utiliser [Tails], qui est le favori des hackers (?), Par démarrage USB.