Ottimizzazione vincoli

Finora, dato un insieme di vincoli si cercava una soluzione

Se non esiste, ha senso considerare una valutazione che soddisfa più vincoli possibili


Peso dei vincoli

In generale, i vincoli possono avere importanza diversa:

Anche tra i vincoli soft alcuni vincoli possono essere più importanti di altri

Per questo, si assegnano pesi ai vincoli


Costo di una valutazione

Data una soluzione ai vincoli hard, il suo costo è la somma dei pesi dei vincoli violati da essa

Si tratta quindi di trovare una soluzione a costo minimo


Backtracking

Si può usare il backtracking per trovare la soluzione ottima

Si mantiene il la soluzione migliore trovata finora e il suo costo

Quando si trova una soluzione, non ci si ferma ma:


Branch and bound

Simile alla variante di backtracking vista prima, ma con una aggiunta che riduce la ricerca

Data una valutazione parziale, si può valutare un limite inferiore al costo di ogni valutazione totale che la estende

Infatti, se la valutazione parziale viola dei vincoli, questi sono violati anche da tutte le valutazioni totali che la estendono

Riduzione ricerca:


Algoritmo complessivo

Rispetto al backtracking, le varianti sono

Alla fine, la soluzione memorizzata è una di quelle ottime


Miglioramenti

Invece di usare il costo di una soluzione parziale, posso usare una limite inferiore al costo delle soluzioni che la estendono

Questo limite funziona se:

La prima condizione deve essere rispettata per forza, altrimenti il metodo non funziona

Rispettando la prima condizione, va scelto un limite che sia il puù alto possibile


Prima scelta

Fornisce un limite al costo delle valutazioni parziali che può essere più alto di quello visto prima

Guarda anche i vincoli che hanno variabili non assegnate

Il sistema precedente "assumeva" che i vincoli non valutabili si potevano soddisfare

Il sistema della prima scelta va a vedere se questi vincoli presi uno per volta, sono in effetti soddisfabili


Prima scelta: esempio

Vincoli x<y e y<z con peso uno, domini tutti uguali ad {0,1}, valutazione x=0,z=0,

Con il metodo di prima, il costo era zero, dato che la valutazione non viola nessun vincolo

Con questo metodo

La valutazione parziale ha quindi peso uno invece di zero


Nota sui valori

Si va a guardare un vincolo per volta

I valori delle variabili non valutate potrebbero quindi essere diversi per i vari vincoli

Esempio: x<y, y<z con valutazione x=0,y=1

Non importa se questi valori di y sono diversi: nel valutare il peso si fa come se i due vincoli fossero soddisfatti

Motivo: cercare valori uguali per i vincoli è come risolvere il problema, mentre qui voglio una stima rapida da poter effettuare in ogni nodo dell'albero


Bambole russe

È un meccanismo ancora più complicato

Si fa backtracking in ordine fisso

Sia x1,...,xn questo ordine

Si risolvono nell'ordine i sottoproblemi su variabili xi,...,xn per i che va da n ad 1

In altre parole: ogni sottoproblema si ottiene eliminando le variabili x1,...,xi-1 e tutti i vincoli che le contengono


Soluzione di ogni sottoproblema

Per risolvere un qualsiasi sottoproblema sulle variabili xi,...,xn, serve un limite per le valutazioni sulle variabili xi,...,xj

Come limite si usa la somma di:

Rispetto all'algoritmo base, qui si migliora la soluzione usando l'ottimo del sottoproblema, che è stato già trovato in precedenza

Notare che il sottoproblema non include le variabili xi,...,xj

Comunque serve una approssimazione