---
title: "Branch and bound (metodo)"
source: "https://systems-analysis.info/int/Branch_and_bound_(metodo)"
wiki: "systems-analysis.info/int"
article: "Branch_and_bound_(metodo)"
language: "it"
categories:
  - "Category:Italian"
  - "Category:Operations research"
revision_id: 810
wiki_created_at: 2026-09-06T22:39:10Z
wiki_modified_at: 2026-09-06T22:39:10Z
downloaded_at: 2026-09-07T22:42:29Z
---

# Branch and bound (metodo)

**Il metodo dei rami e dei limiti** (in inglese *Branch and Bound*, abbreviato **B&B** o **BnB**) è un paradigma generale per la costruzione di algoritmi esatti per la risoluzione di problemi di ottimizzazione discreta e combinatoria, in particolare di problemi NP-difficili<sup>[\[1\]](https://systems-analysis.info/int/Branch_and_bound_(metodo)#cite_note-en-wiki-bnb-1)</sup>. Il metodo rappresenta una strategia di enumerazione guidata, in cui l'intero insieme delle soluzioni ammissibili viene suddiviso sequenzialmente in sottoinsiemi (**ramificazione**), e per ciascuno di essi vengono calcolate stime (**limiti**) del valore della funzione obiettivo. Queste stime consentono di scartare (potare) quei sottoinsiemi che non possono certamente contenere soluzioni ottimali, riducendo in modo sostanziale lo spazio di ricerca<sup>[\[2\]](https://systems-analysis.info/int/Branch_and_bound_(metodo)#cite_note-ru-wiki-bnb-2)</sup>.

Il metodo fu proposto per la prima volta da A. Land e A. Doig nel 1960 per la risoluzione di problemi di programmazione intera<sup>[\[3\]](https://systems-analysis.info/int/Branch_and_bound_(metodo)#cite_note-land-doig-1960-3)</sup>. Da allora è diventato uno degli approcci più fondamentali nella ricerca operativa e nell'informatica. La caratteristica chiave del metodo è la sua flessibilità: non si tratta di un algoritmo specifico, bensì di uno schema strategico di alto livello (framework), adattivo alla struttura del problema da risolvere.

## Componenti chiave del metodo

Il metodo si basa su tre operazioni fondamentali, applicate ai sottoinsiemi dello spazio delle soluzioni, organizzati sotto forma di albero di ricerca.

- **Ramificazione** (in inglese *Branching*) — è il processo di suddivisione ricorsiva dell'insieme corrente di soluzioni ammissibili $S_{i}$ in diversi sottoinsiemi più piccoli, generalmente disgiunti $S_{i1},S_{i2},\ldots,S_{ik}$. Ciascun sottoinsieme corrisponde a un nuovo sottoproblema ed è rappresentato come nodo figlio nell'albero di ricerca. Ad esempio, nei problemi di programmazione intera la ramificazione viene spesso effettuata sulla variabile che assume un valore frazionario nella soluzione della rilassazione LP.

<!-- -->

- **Calcolo dei limiti** (in inglese *Bounding*) — per ogni nodo dell'albero di ricerca (cioè per ogni sottoproblema) viene calcolata una stima del valore della funzione obiettivo. Per un problema di minimizzazione, questa è il **limite inferiore** (*lower bound*), che costituisce una stima garantita dal basso per qualsiasi soluzione del sottoinsieme dato. Nella maggior parte dei casi questa stima si ottiene risolvendo la *rilassazione* del sottoproblema originale — una versione semplificata in cui alcuni vincoli complessi (ad esempio, l'integrità) vengono temporaneamente ignorati. La più comune è la rilassazione LP.

<!-- -->

- **Potatura** (in inglese *Pruning*) — è il processo di esclusione dalla considerazione di nodi (e dei sottoalberi a essi corrispondenti) che certamente non possono contenere la soluzione ottimale. Un nodo viene potato in uno dei seguenti casi:

1.  **Potatura per limite**: Il limite inferiore per il nodo dato risulta non migliore (cioè maggiore o uguale, nel caso di minimizzazione) rispetto al valore della migliore soluzione ammissibile trovata fino a quel momento, denominata **incumbent** (*incumbent*).
2.  **Potatura per ammissibilità**: La soluzione della rilassazione del nodo è ammissibile per il problema originale (ad esempio, tutte le variabili sono intere). Tale soluzione viene confrontata con l'incumbent corrente e, se è migliore, l'incumbent viene aggiornato. Non è necessaria alcuna ulteriore ramificazione da questo nodo.
3.  **Potatura per inammissibilità**: Il sottoproblema corrispondente al nodo non ha soluzioni ammissibili.

## Algoritmo generale

L'algoritmo generalizzato del metodo dei rami e dei limiti per un problema di minimizzazione può essere descritto nei seguenti passi:

1.  **Inizializzazione:** Trovare una soluzione ammissibile iniziale (ad esempio, tramite un'euristica) e impostare il suo valore come limite superiore iniziale (incumbent) $U$. Creare la coda dei nodi attivi $Q$, contenente il nodo radice (il problema originale).
2.  **Ciclo principale:** Finché la coda $Q$ non è vuota:
    - Selezionare un nodo da $Q$ in accordo con la strategia di ricerca (ad esempio, ricerca in profondità o per migliore stima).
    - Risolvere la rilassazione per questo nodo, ottenendo il limite inferiore $L$.
    - **Potare** il nodo se $L \geq U$.
    - Se la soluzione della rilassazione è ammissibile per il problema originale, aggiornare l'incumbent: $U\leftarrow L$.
    - Se il nodo non è stato potato e la soluzione non è ammissibile, eseguire la **ramificazione**, suddividendolo in nodi figli, e aggiungerli alla coda $Q$.
3.  **Terminazione:** Quando la coda $Q$ diventa vuota, l'algoritmo termina. La soluzione trovata, corrispondente all'incumbent $U$, è globalmente ottimale.

## Proprietà chiave e teoremi

- **Correttezza e convergenza:** L'algoritmo garantisce di trovare la soluzione globalmente ottimale in un numero finito di passi, a condizione che l'insieme delle soluzioni ammissibili sia finito e che la procedura di ramificazione sia convergente (ovvero che, nella suddivisione ricorsiva, i sottoinsiemi si «contraggano» verso dei punti)<sup>[\[4\]](https://systems-analysis.info/int/Branch_and_bound_(metodo)#cite_note-conitzer-duke-4)</sup>.
- **Strategia di ricerca:** L'efficienza dell'algoritmo dipende fortemente dalla strategia di scelta del prossimo nodo da ramificare (ad esempio, ricerca in profondità, ricerca in ampiezza, ricerca per migliore stima) e dalla scelta della variabile di ramificazione. I moderni solver utilizzano spesso strategie ibride<sup>[\[5\]](https://systems-analysis.info/int/Branch_and_bound_(metodo)#cite_note-maudet-danoy-2024-5)</sup>.

## Esempi

- **Problema di programmazione intera**: Applicazione classica del metodo. Come rilassazione si utilizza la programmazione lineare. La ramificazione avviene sulla variabile frazionaria $x_{j}$, creando due sottoproblemi con vincoli aggiuntivi $x_{j} \leq \lfloor x_{j}^{\ast}\rfloor$ e $x_{j} \geq \lceil x_{j}^{\ast}\rceil$.
- **Problema del commesso viaggiatore**: Lo spazio delle soluzioni è costituito da tutti i possibili cicli hamiltoniani nel grafo. La ramificazione può essere effettuata sugli archi (includere/escludere un arco dal percorso). Come limiti inferiori possono essere utilizzate le soluzioni di problemi più semplici, come il problema di assegnamento o la costruzione dell'albero di copertura minimo<sup>[\[6\]](https://systems-analysis.info/int/Branch_and_bound_(metodo)#cite_note-little-1963-6)</sup>.

## Concetti correlati e applicazioni

- **Metodo dei rami e dei tagli** (*Branch-and-Cut*): Metodo ibrido che combina B&B con il metodo dei piani di taglio. In ogni nodo dell'albero di ricerca, oltre alla soluzione della rilassazione, vengono generate disuguaglianze aggiuntive (tagli) che rafforzano il limite inferiore, portando a una potatura più efficiente dei rami.
- **Ricerca con backtracking** (*Backtracking*): Il metodo dei rami e dei limiti può essere considerato una generalizzazione di questo algoritmo per problemi di ottimizzazione.
- **Potatura alfa-beta**: Analogia concettuale utilizzata negli alberi di gioco per potare i rami sicuramente perdenti.

## Vedi anche

- Programmazione intera
- Ottimizzazione combinatoria
- Problema del commesso viaggiatore
- Problema NP-difficile
- Metodo del simplesso

## Note

<sup>[\[1\]](https://systems-analysis.info/int/Branch_and_bound_(metodo)#cite_note-en-wiki-bnb-1)</sup> <sup>[\[2\]](https://systems-analysis.info/int/Branch_and_bound_(metodo)#cite_note-ru-wiki-bnb-2)</sup> <sup>[\[3\]](https://systems-analysis.info/int/Branch_and_bound_(metodo)#cite_note-land-doig-1960-3)</sup> <sup>[\[4\]](https://systems-analysis.info/int/Branch_and_bound_(metodo)#cite_note-conitzer-duke-4)</sup> <sup>[\[5\]](https://systems-analysis.info/int/Branch_and_bound_(metodo)#cite_note-maudet-danoy-2024-5)</sup> <sup>[\[6\]](https://systems-analysis.info/int/Branch_and_bound_(metodo)#cite_note-little-1963-6)</sup> \</references\>

1.  <span id="cite_note-en-wiki-bnb-1">↑ <sup>[1.0](https://systems-analysis.info/int/Branch_and_bound_(metodo)#cite_ref-en-wiki-bnb_1-0)</sup> <sup>[1.1](https://systems-analysis.info/int/Branch_and_bound_(metodo)#cite_ref-en-wiki-bnb_1-1)</sup> Wikipedia contributors. (2025). Branch and bound. In *Wikipedia, The Free Encyclopedia*. Retrieved 2025-10-26, from <a href="https://en.wikipedia.org/wiki/Branch_and_bound" class="external free" rel="nofollow">https://en.wikipedia.org/wiki/Branch_and_bound</a></span>
2.  <span id="cite_note-ru-wiki-bnb-2">↑ <sup>[2.0](https://systems-analysis.info/int/Branch_and_bound_(metodo)#cite_ref-ru-wiki-bnb_2-0)</sup> <sup>[2.1](https://systems-analysis.info/int/Branch_and_bound_(metodo)#cite_ref-ru-wiki-bnb_2-1)</sup> Wikipedia contributors. (2023). Метод ветвей и границ. In *Русская Википедия*. Retrieved 2025-10-26, from <a href="https://ru.wikipedia.org/wiki/Метод_ветвей_и_границ" class="external free" rel="nofollow">https://ru.wikipedia.org/wiki/Метод_ветвей_и_границ</a></span>
3.  <span id="cite_note-land-doig-1960-3">↑ <sup>[3.0](https://systems-analysis.info/int/Branch_and_bound_(metodo)#cite_ref-land-doig-1960_3-0)</sup> <sup>[3.1](https://systems-analysis.info/int/Branch_and_bound_(metodo)#cite_ref-land-doig-1960_3-1)</sup> Land, A. H.; Doig, A. G. (1960). An automatic method of solving discrete programming problems. *Econometrica*, 28(3), 497–520. DOI: 10.2307/1910129. URL: <a href="https://www.jstor.org/stable/1910129" class="external free" rel="nofollow">https://www.jstor.org/stable/1910129</a></span>
4.  <span id="cite_note-conitzer-duke-4">↑ <sup>[4.0](https://systems-analysis.info/int/Branch_and_bound_(metodo)#cite_ref-conitzer-duke_4-0)</sup> <sup>[4.1](https://systems-analysis.info/int/Branch_and_bound_(metodo)#cite_ref-conitzer-duke_4-1)</sup> Conitzer, V. (2008). *Solving (mixed) integer programs using branch and bound*. Duke University, Department of Computer Science. URL: <a href="https://courses.cs.duke.edu/spring08/cps296.2/branch_and_bound.pdf" class="external free" rel="nofollow">https://courses.cs.duke.edu/spring08/cps296.2/branch_and_bound.pdf</a></span>
5.  <span id="cite_note-maudet-danoy-2024-5">↑ <sup>[5.0](https://systems-analysis.info/int/Branch_and_bound_(metodo)#cite_ref-maudet-danoy-2024_5-0)</sup> <sup>[5.1](https://systems-analysis.info/int/Branch_and_bound_(metodo)#cite_ref-maudet-danoy-2024_5-1)</sup> Maudet, G.; Danoy, G. (2024). Search Strategy Generation for Branch and Bound Using Genetic Programming. *arXiv preprint arXiv:2412.09444*. DOI: 10.48550/arXiv.2412.09444. URL: <a href="https://arxiv.org/abs/2412.09444" class="external free" rel="nofollow">https://arxiv.org/abs/2412.09444</a></span>
6.  <span id="cite_note-little-1963-6">↑ <sup>[6.0](https://systems-analysis.info/int/Branch_and_bound_(metodo)#cite_ref-little-1963_6-0)</sup> <sup>[6.1](https://systems-analysis.info/int/Branch_and_bound_(metodo)#cite_ref-little-1963_6-1)</sup> Little, J. D. C.; Murty, K. G.; Sweeney, D. W.; Karel, C. (1963). An Algorithm for the Traveling Salesman Problem. *Operations Research*, 11(6), 972–989. DOI: 10.1287/opre.11.6.972. URL: <a href="https://dspace.mit.edu/bitstream/handle/1721.1/46907/branchboundmetho00litt.pdf" class="external free" rel="nofollow">https://dspace.mit.edu/bitstream/handle/1721.1/46907/branchboundmetho00litt.pdf</a></span>
