1 Grafi - WordPress.com

Transcript

1 Grafi - WordPress.com
1
Grafi
•
Verificare se un grafo è bipartito
– Un grafo G non orientato è bipartito se non esistono cicli dispari.
– Prendo il grafo e lo ordino in due colonne da una parte V1 e dall’altra V2.
Se è bipartito avrò un grafo in cui ogni arco di V1 va su V2 e viceversa. Non ci sono archi tra elementi dei due insiemi.
•
Definizione di matching
– Dato un grafo G non orientato, un matching M di G è un insieme di archi tali che in ogni nodo di G incide al più un arco di M.
– Un matching si dice perfetto se sono toccati tutti i nodi del grafo.
•
Determinare un matching di cardinalità massima
– Un matching di cardinalità massima si trova per un grafo bipartito in corripondenza del flusso massimo.
– Prendo un grafo bipartito.
∗
∗
∗
∗
Ne costruisco la rete incrementale. Parto da un matching vuoto.
Cerco un cammino aumentante
Se posso aumento il matching di 1 e aggiorno la rete incrementale.
Ripeto fino a quando non esistono più cammini aumentanti. In questa situazione ho il matching massimo.
– Rete incrementale: Aggiungo al grafo 2 nodi S da cui partono archi verso gli elementi di V1, e t in cui arrivano archi dagli elementi di
V2. Ogni arco appartenente al matching ha un doppio verso. Se un nodo appartiene al matching il verso della freccia da s o verso t si
inverte.
•
Node cover minimo di un matching
–
•
C = {V1 ! P } ∪{ V2 ∩ P } Dove P è l’insieme dei nodi raggiungibili da s nella rete incrementale con flusso massimo
Un cammino minimo su un grafo con tecniche di matching
– In primis prendo il grafo ne duplico i nodi e faccio partire un arco da xi a x’j se esiste un arco tra il nodo i e quello j. In più aggiungo degli
arghi tra xi e x’i (A-A’)
Di questo grafo faccio una matrice C che riporti i pesi.
– Fase 1 determinare se ci sono cicli negativi:
∗
∗
∗
∗
∗
∗
∗
∗
∗
∗
Calcola C’ a partire da C sottraendo a ogni elemento della riga il minore dei valori li presenti
Calcolo un matching sul grafo bipartito che si ottiene se si contano gli zeri in C’ come archi.
a) etichetto le righe di C’ che non appartengono al matching.
b) etichetto le colonne che hanno zeri in corrispondenza con le righe etichettare in precedenza
c) etichetto le righe non etichettate accoppiate nel matching con tali colonne
d) ripeto b e c se necessario
e) barro le righe non etichettate e le colonne che invece lo sono
f) Delta = il minimo tra i valori non barrati
g) Sottrai delta agli elementi non barrati e sommalo a quelli barrati 2 volte
h) ricalcolo il matching e riparto da a) Se
|M | = |V1 | = |V2 | allora non esiste un ciclo negativo e posso continuare . Se invece il matching massimo ha
cadinalità minore di v1 e v2 esiste un ciclo negativo.
– Se Il matching
– Fase 2 determinare il cammino minimo da A a E
∗
∗
∗
•
Elimina la colonna di A’ e la riga di E dalla matrice C
Riapplica il procedimento sopra descritto
Ottieni un matching massimo es M = AC’ BE’ CD’ DB’. Il cammino è A-C-D-B-E calcola il costo del cammino come la somma di
questi archi.
Verificare se un grafo è euleriano
– Un grafo G si dice euleriano se ammette un ciclo euleriano.
– Un grafo G ammette un ciclo euleriano se ogni nodo ha grado pari, o se è l’unione di cicli disgiunti.
– Verifico che un grafo euleriano contando gli archi uscenti dai nodi, se solo uno di questi ha un numero dispari di archi entranti il grafo è
non euleriano.
•
Determinare un ciclo euleriano
– Prendo un ciclo dal grafo, e cancello gli archi che lo compongono dal grafo. Se il grafo contiene ancora cicli li aggiungo al primo in
questo modo. A-H-G-A e H-B-C-I-H diventano A-H-B-C-I-H-G-A. Continuo fino a quando non ottengo tutti nodi esposti. Se non riesco a
raggiungere tale situazione perché mi rimangono degli archi tra i nodi allora il grafo non è euleriano.
2
PLI
•
Branch and bound
– Si ordinano i nodi in modo decrescente sul risultato della divisione de il valore della funzione obiettivo di un elemnto per il valore del
vincolo di quell’elemento es Max 5x e 3x<5 5/3.
– Si calcola una prima soluzione intera che rispetti i vincoli.
– Si fa il primo nodo soluzione probabilmente frazionaria, si calcola la z di quel nodo, si valutano i criteri di fadoming e se non ci sono
motivi di chiudere il nodo si ramifica da una parte xi = 0 dall’altra xi =1.
•
Branch and bound grafico ( con più vincoli) risolvere con l’algoritmo dei piani di taglio il problema di PLI
– Traccio su un grafico( FALLO BENE) i vari vincoli. E mi segno i vertici del problema.
– Parto dal primo problema come uno dei vertici, e ramifico per un valore tipo x=3/2 da una parte x=1 dall’altra x=2. Rispetto sempre
i criteri di fadoming. Ad ogni iterazione faccio attenzione in che parte del grafico mi trovo e quale nuovo valore ottengo ponendo una
variabile ad un certo valore.
•
Tecniche di visita di un albero
– fifo : i nodi vengono messi in una coda. Si espande quello che ad un estremo, lo si leva dalla coda e si procede con il successivo,
– lifo: i nodi vengono messi su una pila. Si espande quello in cima, lo si leva e si procede con il successivo
– bestfirst : si valuta il valore di z si sceglie il migliore e si espande quel nodo.
•
Branch and bound con gli UB e LB MAX
– Tra quali valori è compreso l’ottimo : tra i Lb e Ub massimi dell’albero.
– Per quali valori di lb e ub del nodo F è possibile chiudere F ?
∗
∗
∗
Impossibilità
Ottimalità: LBpadre<=LBf=UBf <=UBpadre
Bounding: Chiudo se la migliore soluzione di F (UBf) è più bassa delle soluzioni peggiori (lb) degli altri nodi .. devo trovare UBf
<min lv
– Per quali valori di lb e ub del nodo F è possibile individuare la soluzione ottima e chiudere tutti i nodi dell’albero? max ub <=Lbf=Ubf<=Ubpadre
– Numerare di nodi dell’albero visitati con tecnica fifo lifo bestfirst
•
Branch and bound con gli UB e LB min
– tra quali valori è compreso l’ottimo : tra i lb e ub minimi dell’albero
– per quali valori di lb e ub del nodo F è possibile chiudere F ?
∗
∗
∗
Impossibilità
Ottimalità: LBpadre<=LBf=UBf <=UBpadre
Bounding: Chiudo se la migliore soluzione di F (lBf) è più bassa delle soluzioni peggiori (lb) degli altri nodi .. devo trovare LBf >
max ub
– per quali valori di lb e ub del nodo F è possibile individuare la soluzione ottima e chiudere tutti i nodi dell’albero? Lbpadre <=Lbf=Ubf<=min
lb
– Numerare di nodi dell’albero visitati con tecnica fifo lifo bestfirst
•
Programmazione dinamica
– Non devo ordinare i nodi
– Faccio una tabella che ha sulle righe i valori crescenti da 0 alla capacità massima, e sulle colonne da 0 al massimo delle variabili.
– Inserisco da sinistra a destra dall’alto al basso. Se ho a 2 elementi x2 che costano 5 nella riga 8 posso mettere 10 a meno che x1 non
sia capace di generare più valore nella riga 8.
– la z ottima si trova in concomitanza con il valore massimo generabile e l’insieme degli elementi che lo compone è la x ottima.
•
Formulare i problemi di separazione per un vincolo
– Ho una soluzione ottima x* non intera
– Prendo la funzione obiettivo la trasformo.. da max a min e viceversa e ogni elemento diviene xj-x*j quindi se x1 vale 0.75 nella nuova fo
ho 0.25x1.
– Ricalcolo il vincolo: le variabili che nell x* è a 0 sono poste a 0 e quindi eliminate. le variabili che nell x* sono a 1 sono poste a 1 le
variabili frazionarie non cambiano. minore uguale diviene maggiore
– Provo per ispezione ponendo le varie variabili rimaste a 1 e vedo se il vincolo è soddisfatto A>b.
– Se è soddisfatto vedo se il valore della fo con le variabili a uno è <1 se è così vuol dire che esiste un cover violato altrimenti non esiste
– Se invece non c’è modo di soddisfare il vincolo non esiste cover violato.
– La disuguaglianza cover è data dalle variabili poste a 1 ( comprese nella x*) e la somma delle variabili deve essere minore di |C|-1
•
Trovare un taglio di gomory che separi la soluzione ottima del problema rilassato
Un taglio di gomory è :
xB + B −1 F xF = b̄ solo per vincoli di valore frazionario

4
B = [A1 A6 A5 ] F = [A2 A3 A7 A4 ] F =  2
4
1 7
2 1
0 −3
In questo caso l’unico è x6.
2
 1
5
−
−
3  −1
1
0
−1 −1/4
−2 1/2
1/2
−
−1/3
1
1
|
−2
+
−
|
7
| 11/2
|
1
%
&
x6 + −1 −1/4 1 F xF = 11/2 =⇒ x6 + [−4 − 1/4 + 4] x2 + [−1 − 1/2] x3 + [−7 − 1/4 − 3] x7 +
[−5 − 3/4] x4 = 11/2
di questo devo trovare la parte intera quindi x6
•
− x2 − x3 − 10x7 − 5x4 ≤ 5 Questo è il taglio di gomory!
Risolvere con l’algoritmo ungherese il seguente problema dell’assegnemnto
– La ricerca di un matching perfetto di peso minimo. Vedi cammino minimo su grafo pesato bipartito.
•
Verificare se le matrici sono tum
– A è tum se e solo se
∗ AT è tum
∗ A’ ottenuta da A permutando e o cambiando di segno alcune righe o colonne è Tum
∗ Le matrici colonne fatte di soli 0 sono tum. le matrici colonne con un solo elemento + o- 1 sono tum.
– Prendo una matrice cerco di eliminare più colonne o righe che posso dei valori che mi rimangono cerco la bi partizione.
– Se non riesco a trovare tale bipartizione faccio il determinante della matrice che ho trovato se è diverso da 0 +- 1 allora non è tum la
matrice di partenza
•
Algoritmo Propose2Reject Ricerca di un matching stabile
– Ogni mattina :
∗
Ogni uomo va dalla prima donna non ancora eliminata dalla lista di preferenze e si propone
– Ogni pomeriggio
∗
Ogni donna rifiuta le proposte ricevute tranne quella da lei preferita tra quelle ricevuto. In quel caso dice forse all’uomo preferito tra
quelli che si sono proposti e lo tiene in sospeso
– Ogni sera
∗
Ogni uomo la cui proposta è stara rifiutata elimina la donna che la ha rifiutata dalla lista delle preferenze.
– Ripeti fino a che nesuno viene rifiutato. A questo punto ogni donna sposa l’mo che tiene in sospeso.
– Gli unici che si propongono sono quelli che sono in attesa.
– Se ci si propone a una che ha già qualcuno in attesa, se quello è preferito allora la proposta viene rifiutata altrimenti lui viene scacciato
e noi diventiamo in attesa.