Algorithme multi-objectif

Algorithme multi-objectif

Dans ce notebook, nous utiliserons l’algorithme évolutif guidé par vecteurs de référence (RVEA) pour trouver les solutions optimales du problème DTLZ2.

import time
import torch

from evox.algorithms import RVEA
from evox.metrics import igd
from evox.problems.numerical import DTLZ2
from evox.workflows import StdWorkflow, EvalMonitor

(Optionnel) Utiliser le GPU pour exécuter le code

Nous préférons souvent exécuter notre code sur un GPU pour une exécution plus rapide. Cependant, si un GPU n’est pas disponible, l’exécution sur CPU est également acceptable.

# Utiliser le GPU en priorité pour exécuter le code.
torch.set_default_device("cuda" if torch.cuda.is_available() else "cpu")
print(torch.get_default_device())

Exemple d’exécution : RVEA sur le problème DTLZ2

Le code suivant est utilisé pour configurer le problème DTLZ2 et l’algorithme RVEA. Plus d’informations sur le problème et l’algorithme peuvent être trouvées dans la section correspondante de la documentation.

# Initialiser le problème, l'algorithme et le workflow.
prob = DTLZ2(m=3)
pf = prob.pf()
algo = RVEA(pop_size=100, n_objs=3, lb=-torch.zeros(12), ub=torch.ones(12))
monitor = EvalMonitor()
workflow = StdWorkflow(algo, prob, monitor)
compiled_step = torch.compile(workflow.step)

Avec cette configuration en place, nous pouvons maintenant commencer l’optimisation. Nous configurons l’algorithme multi-objectif pour optimiser pendant 100 étapes sur ce problème.

# Exécuter le workflow pendant 100 étapes
t = time.time()
workflow.init_step()
for i in range(100):
    compiled_step()
    fit = workflow.algorithm.fit
    fit = fit[~torch.isnan(fit).any(dim=1)]
    if i % 10 == 0:
        print(igd(fit, pf))
monitor.plot()