Algoritmo Multi-Obiettivo

Algoritmo Multi-Obiettivo

In questo notebook, useremo l’Algoritmo Evolutivo Guidato da Vettori di Riferimento (RVEA) per trovare le soluzioni ottimali del problema 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

(Opzionale) Usa la GPU per eseguire il codice

Spesso preferiamo eseguire il nostro codice su una GPU per un’esecuzione più veloce. Tuttavia, se una GPU non è disponibile, l’esecuzione su CPU è comunque accettabile.

# Usa prima la GPU per eseguire il codice.
torch.set_default_device("cuda" if torch.cuda.is_available() else "cpu")
print(torch.get_default_device())

Esempio di esecuzione: RVEA sul problema DTLZ2

Il seguente codice viene usato per configurare il problema DTLZ2 e l’algoritmo RVEA. Maggiori informazioni sul problema e sull’algoritmo possono essere trovate nella sezione corrispondente della documentazione.

# Inizializza il problema, l'algoritmo e il 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)

Con questa configurazione in atto, possiamo ora iniziare a ottimizzare. Impostiamo l’algoritmo multi-obiettivo per ottimizzare per 100 passi su questo problema

# Esegui il workflow per 100 passi
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()