1
Fork 0
mirror of https://github.com/Steffo99/appunti-magistrali.git synced 2024-11-22 02:44:17 +00:00
appunti-steffo/9 - Algoritmi distribuiti/2 - Algoritmi di approssimazione/3 - Approssimazione di commesso viaggiatore/algoritmo di Christofides.md

4.9 KiB

algoritmo di approssimazione di problema del commesso viaggiatore, che migliora la approssimazione a 2 di problema del commesso viaggiatore con costo degli archi triangolare.

Restrizioni aggiuntive

Funzionamento

[!Summary]+ Summary ma non troppo Si effettuano i seguenti passi:

  1. si crea un minimum spanning tree del grafo;
  2. da esso, si crea un sottografo induzione di sottografo dai nodo di un grafo che nel minimum spanning tree hanno grado di un nodo dispari;
  3. si determina l'abbinamento perfetto di funzione costo problema di minimizzazione del sottografo;
  4. si unione minimum spanning tree e abbinamento perfetto problema di minimizzazione per creare un grafo temporaneo su cui effettuare i calcoli;
  5. si usa l'algoritmo di Fleury per circuito euleriano per trovare un circuito euleriano sul grafo temporaneo;
  6. grazie al costo degli archi triangolare si rimuovono tutte le visite ripetute ai nodo di un grafo, ottenendo un circuito hamiltoniano.

algoritmo corretto

[!Success] ==Sì==

fattore di approssimazione

Esiste un circuito hamiltoniano soluzione ottima di costo: \def \varOptimal {{\color{Gold} Optimal}} \large \varOptimal


Si induzione di sottografo un sottografo da tutti i nodo di un grafo con grado di un nodo dispari nel minimum spanning tree.

Essendo il grafo originale grafo completo, anche il sottografo lo sarà, pertanto, dovrà sicuramente esistere in esso un circuito hamiltoniano problema di minimizzazione di peso: \def \varSubHamilton {{\color{DarkKhaki} SubHamilton}} \large \varSubHamilton Avendo tolto dei nodo di un grafo dal grafo iniziale, per la costo degli archi triangolare possiamo dire che: \varSubHamilton \leq \varOptimal


Dividiamo gli arco di un grafo del sotto-circuito hamiltoniano problema di minimizzazione in due insieme, visitandoli e alternandoli uno ad uno nel primo e nel secondo insieme, ottenendo così due abbinamento perfetto (non minimi) di funzione costo: \def \varMatchingA {{\color{Lime} Matching_A}} \def \varMatchingB {{\color{LawnGreen} Matching_B}} \large \varMatchingA \qquad \varMatchingB

Li mettiamo a confronto con l'abbinamento perfetto di funzione costo problema di minimizzazione realizzato dall'algoritmo: \def \varMatchingOpt {{\color{PaleGreen} Matching}} \large \varMatchingOpt

Essendo l'abbinamento problema di minimizzazione ed il grafo grafo completo, abbiamo che: \varMatchingOpt \leq \varMatchingA \varMatchingOpt \leq \varMatchingB E quindi: 2 \cdot \varMatchingOpt \leq \varMatchingA + \varMatchingB Dato che i due abbinamento perfetto contengono tutti gli arco di un grafo del sotto-circuito hamiltoniano problema di minimizzazione: 2 \cdot \varMatchingOpt \leq \varSubHamilton E quindi: 2 \cdot \varMatchingOpt \leq \varOptimal Cioè: \varMatchingOpt \leq \frac{1}{2} \cdot \varOptimal


Definiamo la somma dei pesi del minimum spanning tree utilizzato inizialmente come: \def \varTree {{\color{SpringGreen} Tree}} \large \varTree Dato che possiamo anche ottenerlo rimuovendo un singolo canale di comunicazione qualsiasi dal circuito hamiltoniano soluzione ottima: \varTree \leq \varOptimal


Il circuito euleriano restituito dall'algoritmo di Fleury per circuito euleriano ha un peso totale di: \def \varFleury {{\color{Purple} Fleury}} \large \varFleury Dato che esso attraversa tutti gli arco di un grafo del minimum spanning tree e dell'abbinamento perfetto, possiamo dire che: \varFleury = \varTree + \varMatchingOpt


Possiamo usare però la costo degli archi triangolare per rimuovere tutti i nodo di un grafo che compaiono due volte, ottenendo così un circuito hamiltoniano, che sarà sicuramente più breve del circuito euleriano: \def \varApprox {{\color{Magenta} Approx}} \large \varApprox Ottenendo che: \varApprox \leq \varFleury E quindi che: \varApprox \leq \varTree + \varMatchingOpt Continuando a sostituire: \varApprox \leq \varOptimal + \frac{1}{2} \cdot \varOptimal Ovvero: \varApprox \leq \frac{3}{2} \cdot \varOptimal

Il fattore di approssimazione quindi è: \Large \frac{3}{2}

Altre fonti

[!Quote]- Di Snowy !Pasted image 20231209021058.png