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

141 lines
4.9 KiB
Markdown
Raw Normal View History

2023-12-19 01:19:27 +00:00
[[algoritmo di approssimazione]] di [[problema del commesso viaggiatore|minimizzazione di circuito hamiltoniano]], che migliora la [[approssimazione a 2 di problema del commesso viaggiatore con costo degli archi triangolare]].
## Restrizioni aggiuntive
- [[costo degli archi triangolare]]
## 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|indotto]] dai [[nodo di un grafo|nodi]] che nel [[minimum spanning tree]] hanno [[grado di un nodo|grado]] dispari;
> 3. si determina l'[[abbinamento perfetto]] di [[funzione costo|costo]] [[problema di minimizzazione|minimo]] del sottografo;
> 4. si [[unione|uniscono]] [[minimum spanning tree]] e [[abbinamento perfetto]] [[problema di minimizzazione|minimo]] 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|nodi]], ottenendo un [[circuito hamiltoniano]].
## [[algoritmo corretto|Correttezza]]
> [!Success] ==Sì==
## [[fattore di approssimazione|Fattore di approssimazione]]
Esiste un [[circuito hamiltoniano]] [[soluzione ottima|ottimale]] di costo:
$$
\def \varOptimal {{\color{Gold} Optimal}}
\large \varOptimal
$$
---
Si [[induzione di sottografo|induce]] un [[sottografo]] da tutti i [[nodo di un grafo|nodi]] con [[grado di un nodo|grado]] dispari nel [[minimum spanning tree]].
Essendo il [[grafo]] originale [[grafo completo|completo]], anche il [[sottografo]] lo sarà, pertanto, dovrà sicuramente esistere in esso un [[circuito hamiltoniano]] [[problema di minimizzazione|minimo]] di peso:
$$
\def \varSubHamilton {{\color{DarkKhaki} SubHamilton}}
\large \varSubHamilton
$$
Avendo tolto dei [[nodo di un grafo|nodi]] dal [[grafo]] iniziale, per la [[costo degli archi triangolare|proprietà triangolare per il costo degli archi]] possiamo dire che:
$$
\varSubHamilton \leq \varOptimal
$$
---
Dividiamo gli [[arco di un grafo|archi]] del sotto-[[circuito hamiltoniano]] [[problema di minimizzazione|minimo]] in due [[insieme|insiemi]], visitandoli e alternandoli uno ad uno nel primo e nel secondo insieme, ottenendo così due [[abbinamento perfetto|abbinamenti perfetti]] (non minimi) di [[funzione costo|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|costo]] [[problema di minimizzazione|minimo]] realizzato dall'algoritmo:
$$
\def \varMatchingOpt {{\color{PaleGreen} Matching}}
\large \varMatchingOpt
$$
Essendo l'[[abbinamento]] [[problema di minimizzazione|minimo]] ed il [[grafo]] [[grafo completo|completo]], abbiamo che:
$$
\varMatchingOpt \leq \varMatchingA
$$
$$
\varMatchingOpt \leq \varMatchingB
$$
E quindi:
$$
2 \cdot \varMatchingOpt \leq \varMatchingA + \varMatchingB
$$
Dato che i due [[abbinamento perfetto|abbinamenti perfetti]] contengono tutti gli [[arco di un grafo|archi]] del sotto-[[circuito hamiltoniano]] [[problema di minimizzazione|minimo]]:
$$
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|arco]] qualsiasi dal [[circuito hamiltoniano]] [[soluzione ottima|ottimale]]:
$$
\varTree \leq \varOptimal
$$
---
Il [[circuito euleriano]] restituito dall'[[algoritmo di Fleury per circuito euleriano|algoritmo di Fleury]] ha un peso totale di:
$$
\def \varFleury {{\color{Purple} Fleury}}
\large \varFleury
$$
Dato che esso attraversa tutti gli [[arco di un grafo|archi]] del [[minimum spanning tree]] e dell'[[abbinamento perfetto]], possiamo dire che:
$$
\varFleury = \varTree + \varMatchingOpt
$$
---
Possiamo usare però la [[costo degli archi triangolare|proprietà triangolare per il costo degli archi]] per rimuovere tutti i [[nodo di un grafo|nodi]] 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]]