1
Fork 0
mirror of https://github.com/Steffo99/appunti-magistrali.git synced 2024-12-01 13:44:19 +00:00
appunti-steffo/9 - Algoritmi distribuiti/2 - Algoritmi di approssimazione/3 - Approssimazione di commesso viaggiatore/approssimazione a 2 di problema del commesso viaggiatore con costo degli archi triangolare.md

93 lines
2.6 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]].
## 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]], e ne si seleziona un [[nodo di un grafo|nodo]] qualsiasi che ne diventi la radice;
> 2. poi, si effettua una [[depth-first search]] sul [[grafo]], aggiungendo in [[pre-visita]] i [[nodo di un grafo|nodi]] a una lista, determinando così un [[percorso hamiltoniano]];
> 3. infine, si connettono primo e ultimo [[nodo di un grafo|nodo]], ottenendo così un [[circuito hamiltoniano]].
## [[algoritmo corretto|Correttezza]]
> [!Success]
> L'[[algoritmo]] produce sempre una [[9 - Algoritmi distribuiti/1 - Problemi algoritmici/soluzione|soluzione ammissibile]] in tempo finito.
## [[fattore di approssimazione|Fattore di approssimazione]]
Definiamo la somma dei pesi del [[minimum spanning tree]] utilizzato come:
$$
\def \varTree {{\color{SpringGreen} Tree}}
\large \varTree
$$
---
Effettuando una [[depth-first search]] sul [[minimum spanning tree]] e aggiungendo ad una [[lista]] tutti i [[nodo di un grafo|nodi]] attraversati in [[pre-visita]] e [[post-visita]], otteniamo un [[circuito hamiltoniano]]:
$$
\def \varFullWalk {{\color{Purple} FullWalk}}
\large \varFullWalk
$$
Esso attraversa tutti gli [[arco di un grafo|archi]] due volte:
$$
\varFullWalk
=
2 \cdot \varTree
$$
---
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 un [[circuito hamiltoniano]] più breve:
$$
\def \varApprox {{\color{Magenta} Approx}}
\large \varApprox
$$
Ottenendo che:
$$
\varApprox \leq \varFullWalk
$$
E quindi che:
$$
\varApprox \leq 2 \cdot \varTree
$$
---
Consideriamo il costo del [[circuito hamiltoniano]] [[soluzione ottima|ottimale]]:
$$
\def \varOptimal {{\color{Gold} Optimal}}
\large \varOptimal
$$
Da esso, possiamo ottenere uno [[spanning tree]] rimuovendo un [[canale di comunicazione|arco]] qualsiasi:
$$
\varTree \leq \varOptimal
$$
Pertanto, abbiamo che:
$$
\frac{1}{2} \cdot \varFullWalk \leq \varOptimal
$$
Portando dall'altra parte:
$$
\varFullWalk \leq 2 \cdot \varOptimal
$$
Quindi:
$$
\varApprox \leq 2 \cdot \varOptimal
$$
Ottenendo così un [[fattore di approssimazione]] di:
$$
\Large 2
$$
## [[costo computazionale]]
| Costo | [[notazione O-grande]] |
|-|-|
| [[9 - Algoritmi distribuiti/1 - Problemi algoritmici/spazio]] | $O(Nodes)$ |
| [[9 - Algoritmi distribuiti/1 - Problemi algoritmici/tempo]] | polinomiale |