1
Fork 0
mirror of https://github.com/Steffo99/appunti-magistrali.git synced 2024-11-24 19:24:19 +00:00
appunti-steffo/9 - Algoritmi distribuiti/2 - Algoritmi di approssimazione/3 - Approssimazione di commesso viaggiatore/approssimazione di problema del commesso viaggiatore con branch-and-bound.md

62 lines
2.5 KiB
Markdown
Raw Normal View History

2023-12-19 01:19:27 +00:00
[[algoritmo di approssimazione]] di [[problema del commesso viaggiatore]].
## Funzionamento
> [!Summary]
> Il [[grafo]] viene diviso in più [[sottografo|sottografi]], di cui si cercano i rispettivi [[circuito hamiltoniano|circuiti hamiltoniani]] [[problema di minimizzazione|minimi]].
### [[branch-and-bound|Branch]]
Si seleziona un [[nodo di un grafo|nodo]]:
- se questa è la prima iterazione, se ne seleziona uno qualsiasi;
- altrimenti, uno che ha grado $\geq 3$ nell'[[1-tree]];
- se non ce ne sono, abbiamo trovato il [[circuito hamiltoniano]] [[minimo locale]].
Per ciascuna selezione possibile di due [[arco di un grafo|archi]] incidenti su di esso, si crea un nuovo [[branch-and-bound|branch]] che esclude tutti gli altri.
> [!Example]-
>
> #### 1-tree con nodi selezionabili evidenziati
>
> ![[Branch 1.svg]]
>
> #### Tre dei sei branch risultanti
>
> ![[Branch 1A.svg]]
>
> ![[Branch 1B.svg]]
>
> ![[Branch 1C.svg]]
### [[branch-and-bound|Bound]]
Per ciascun [[branch-and-bound|branch]]:
1. si crea un [[sottografo]] escludendo il [[nodo di un grafo|nodo]] in questione tutti gli [[arco di un grafo|archi]] incidenti su esso
2. si determina il [[minimum spanning tree]] del grafo
3. si selezionano i due [[arco di un grafo|archi]] pertinenti al [[branch-and-bound|branch]] in questione
4. si [[unione|uniscono]] [[minimum spanning tree]] e due [[arco di un grafo|archi]], formando un **[[1-tree]]**
5. si usa come valore di bounding il [[funzione costo|costo]] dell'[[1-tree]]
> [!Example]-
>
> #### Grafo pesato iniziale
> ![[Grafo pesato iniziale.svg]]
>
> #### Selezionato il nodo 1
> ![[Bound 1.svg]]
> [!Success] Correttezza
>
> Il [[funzione costo|costo]] di un [[circuito hamiltoniano]] può essere visto come la somma di:
> - il [[funzione costo|costo]] di un [[percorso di un grafo|percorso]] che collega i [[nodo di un grafo|nodi]] del [[sottografo]] del [[branch-and-bound|branch]] (uno [[spanning tree]])
> - il [[funzione costo|costo]] dei due [[arco di un grafo|archi]] che collegano il [[nodo di un grafo|nodo]] escluso e il [[sottografo]]
>
> Nell'effettuare il [[branch-and-bound|bounding]], non siamo sicuri che il [[minimum spanning tree]] determinato sia anche un [[circuito hamiltoniano]], ma sappiamo che qualsiasi altra selezione di archi avrà sicuramente un costo maggiore.
### [[branch-and-bound|Pruning]]
Vengono eliminati i [[branch-and-bound|branch]]:
- con un [[entità|nodo]] di [[grado di un nodo|grado]] $\leq 1$
- senza un [[grafo connesso]]