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.
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
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.
J'ai essayé de l'optimiser en tant que problème à 3 objectifs comme DTLZ2 (3).
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.
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")
Platypus - Multiobjective Optimization in Python
Recommended Posts