El método de ramificación y acotación ( BB , B&B o BnB ) es un método para resolver problemas de optimización que consiste en dividirlos en subproblemas más pequeños y utilizar una función de acotación para eliminar los subproblemas que no pueden contener la solución óptima.
Se trata de un paradigma de diseño de algoritmos para problemas de optimización discreta y combinatoria , así como para la optimización matemática . Un algoritmo de ramificación y acotación consiste en una enumeración sistemática de soluciones candidatas mediante una búsqueda en el espacio de estados : el conjunto de soluciones candidatas se concibe como un árbol con raíz , donde se encuentra el conjunto completo.
El algoritmo explora las ramas de este árbol, que representan subconjuntos del conjunto de soluciones. Antes de enumerar las soluciones candidatas de una rama, esta se compara con los límites estimados superior e inferior de la solución óptima y se descarta si no puede generar una solución mejor que la mejor encontrada hasta el momento por el algoritmo.
El algoritmo depende de una estimación eficiente de los límites inferior y superior de las regiones/ramas del espacio de búsqueda. Si no se dispone de límites, el algoritmo se reduce a una búsqueda exhaustiva.
El método fue propuesto por primera vez por Ailsa Land y Alison Doig mientras realizaban una investigación en la London School of Economics patrocinada por British Petroleum en 1960 para programación discreta , [ 1 ] [ 2 ] y se ha convertido en la herramienta más utilizada para resolver problemas de optimización NP-difíciles . [ 3 ] El nombre "ramificación y acotación" apareció por primera vez en el trabajo de Little et al. sobre el problema del viajante de comercio . [ 4 ] [ 5 ]
Descripción general
El objetivo de un algoritmo de ramificación y acotación es encontrar un valor x que maximice o minimice el valor de una función real f ( x ) , llamada función objetivo , dentro de un conjunto S de soluciones admisibles o candidatas . El conjunto S se denomina espacio de búsqueda o región factible . El resto de esta sección asume que se desea minimizar f ( x ) ; esta suposición no implica pérdida de generalidad , ya que se puede encontrar el valor máximo de f ( x ) hallando el mínimo de g ( x ) = −f ( x ) . Un algoritmo de ramificación y acotación opera según dos principios:
- Divide recursivamente el espacio de búsqueda en espacios más pequeños y luego minimiza f ( x ) en estos espacios más pequeños; esta división se llama ramificación .
- La ramificación por sí sola equivaldría a una enumeración por fuerza bruta de las soluciones candidatas y a probarlas todas. Para mejorar el rendimiento de la búsqueda por fuerza bruta, un algoritmo B&B realiza un seguimiento de los límites del mínimo que intenta encontrar y utiliza estos límites para " podar " el espacio de búsqueda, eliminando las soluciones candidatas que puede demostrar que no contienen una solución óptima.
Para convertir estos principios en un algoritmo concreto para un problema de optimización específico, se requiere algún tipo de estructura de datos que represente conjuntos de soluciones candidatas. Dicha representación se denomina instancia del problema. Denotemos el conjunto de soluciones candidatas de una instancia I por S I . La representación de la instancia debe incluir tres operaciones:
- La rama ( I ) produce dos o más instancias, cada una de las cuales representa un subconjunto de S I. (Normalmente, los subconjuntos son disjuntos para evitar que el algoritmo visite la misma solución candidata dos veces, pero esto no es obligatorio. Sin embargo, una solución óptima entre S I debe estar contenida en al menos uno de los subconjuntos. [ 6 ] )
- bound( I ) calcula una cota inferior sobre el valor de cualquier solución candidata en el espacio representado por I , es decir, bound( I ) ≤ f ( x ) para todo x en S I .
- solution( I ) determina si I representa una única solución candidata. (Opcionalmente, si no lo hace, la operación puede optar por devolver alguna solución factible de entre S I . [ 6 ] ) Si solution( I ) devuelve una solución, entonces f (solution( I )) proporciona una cota superior para el valor óptimo de la función objetivo en todo el espacio de soluciones factibles.
Mediante estas operaciones, un algoritmo B&B realiza una búsqueda recursiva descendente a través del árbol de instancias formado por la operación de ramificación. Al visitar una instancia I , comprueba si bound( I ) es igual o mayor que el límite superior actual; de ser así, I puede descartarse de la búsqueda y la recursión se detiene. Este paso de poda se suele implementar manteniendo una variable global que registra el límite superior mínimo observado entre todas las instancias examinadas hasta el momento.
Versión genérica
A continuación se muestra el esqueleto de un algoritmo genérico de ramificación y acotación para minimizar una función objetivo arbitraria f . [ 3 ] Para obtener un algoritmo real a partir de esto, se requiere una función de acotación bound , que calcula cotas inferiores de f en los nodos del árbol de búsqueda , así como una regla de ramificación específica del problema. Por lo tanto, el algoritmo genérico presentado aquí es una función de orden superior .
- Utilizando una heurística , encuentre una solución x h al problema de optimización. Almacene su valor, B = f ( x h ) . (Si no hay ninguna heurística disponible, establezca B en infinito). B denotará la mejor solución encontrada hasta el momento y se utilizará como límite superior para las soluciones candidatas.
- Inicializa una cola para almacenar una solución parcial sin que se haya asignado ninguna de las variables del problema.
- Repetir hasta que la cola esté vacía:
- Retire el nodo N de la cola.
- Si N representa una única solución candidata x y f ( x ) < B , entonces x es la mejor solución hasta el momento. Regístrela y establezca B ← f ( x ) .
- De lo contrario, ramifica en N para producir nuevos nodos N i . Para cada uno de estos:
- Si bound( N i ) > B , no haga nada; dado que el límite inferior de este nodo es mayor que el límite superior del problema, nunca conducirá a la solución óptima y puede descartarse.
- De lo contrario, almacene N i en la cola.
Se pueden utilizar varias estructuras de datos de cola diferentes . Esta implementación basada en cola FIFO produce una búsqueda en amplitud . Una pila (cola LIFO) produce un algoritmo de búsqueda en profundidad . Se puede obtener un algoritmo de ramificación y acotación de mejor primero utilizando una cola de prioridad que ordena los nodos según sus límites inferiores. [ 3 ]
Ejemplos de algoritmos de búsqueda primero en amplitud con esta premisa son el algoritmo de Dijkstra y su descendiente, la búsqueda A* . Se recomienda la variante de búsqueda en profundidad cuando no se dispone de una buena heurística para generar una solución inicial, ya que produce rápidamente soluciones completas y, por lo tanto, cotas superiores. [ 7 ]
Pseudocódigo
Una implementación en pseudocódigo similar a C++ de lo anterior es:
// Implementación de ramificación y acotación al estilo C++,// suponiendo que la función objetivo f debe minimizarseSolución combinatoria ramificación y acotación (Problema combinatorio ,FunciónObjetivo función_objetivo / *f*/ ,Función de límite inferior función de límite inferior /*límite*/ ){// Paso 1 anterior.double problem_upper_bound = std :: numeric_limits <double> :: infinity ; // = BCombinatorialSolution solución_heurística = solución_heurística ( problema ); // x_hproblem_upper_bound = objective_function ( heuristic_solution ); // B = f(x_h)CombinatorialSolution current_optimum = heuristic_solution ;// Paso 2 anteriorcola < Árbol de soluciones candidatas > cola_candidata ;// Inicialización de cola específica para el problemacola_candidatos = poblar_candidatos ( problema );while ( ! candidate_queue . empty ()) { // Paso 3 anterior// Paso 3.1nodo del árbol de soluciones candidatas = cola_candidata.pop () ;// "nodo" representa N arribaif ( node . representation_single_candidate ()) { // Paso 3.2si ( función_objetivo ( nodo . candidato ()) < límite_superior_problema ) {current_optimum = nodo.candidato ( ) ;problem_upper_bound = objective_function ( current_optimum );}// De lo contrario, el nodo es un único candidato, lo cual no es óptimo.}else { // Paso 3.3: el nodo representa una rama de soluciones candidatas// "child_branch" representa N_i arribapara ( auto && child_branch : node . candidate_nodes ) {si ( lower_bound_function ( child_branch ) <= problem_upper_bound ) {cola_candidato.encola ( rama_hija ) ; // Paso 3.3.2}// De lo contrario, bound(N_i) > B, por lo que podamos la rama; paso 3.3.1}}}devolver current_optimum ;}En el pseudocódigo anterior, las funciones heuristic_solvellamadas populate_candidatescomo subrutinas deben proporcionarse según corresponda al problema. Las funciones f ( objective_function) y bound ( lower_bound_function) se tratan como objetos de función tal como están escritas, y podrían corresponder a expresiones lambda , punteros a funciones y otros tipos de objetos invocables en el lenguaje de programación C++.
mejoras
Cuandoes un vector deLos algoritmos de ramificación y acotación se pueden combinar con el análisis de intervalos [ 8 ] y las técnicas de contratista para proporcionar recintos garantizados del mínimo global. [ 9 ] [ 10 ]
Aplicaciones
Este enfoque se utiliza para varios problemas NP-difíciles :
- Programación entera
- Programación no lineal
- Problema del viajante (TSP) [ 4 ] [ 11 ]
- Problema de asignación cuadrática (QAP)
- Problema de máxima satisfacibilidad (MAX-SAT)
- Búsqueda del vecino más cercano [ 12 ] (por Keinosuke Fukunaga )
- Programación de talleres de flujo
- Problema con el material de corte
- Filogenética computacional
- Inversión de conjuntos
- Estimación de parámetros
- Problema de la mochila 0/1
- Problema de la cubierta del conjunto
- Selección de características en aprendizaje automático [ 13 ] [ 14 ]
- Predicción estructurada en visión por computadora [ 15 ] : 267–276
- Problema de enrutamiento de arcos , incluyendo el problema del cartero chino.
- Problema de programación de talentos y organización de escenas de rodaje
El método de ramificación y acotación también puede servir de base para diversas heurísticas . Por ejemplo, se puede optar por detener la ramificación cuando la diferencia entre los límites superior e inferior sea menor que un cierto umbral. Esto se utiliza cuando la solución es suficientemente buena para fines prácticos y puede reducir considerablemente los cálculos necesarios. Este tipo de solución es especialmente aplicable cuando la función de coste utilizada es ruidosa o es el resultado de estimaciones estadísticas y, por lo tanto, no se conoce con precisión, sino que solo se sabe que se encuentra dentro de un rango de valores con una probabilidad específica .
Relación con otros algoritmos
Nau et al. presentan una generalización del método de ramificación y acotación que también engloba los algoritmos de búsqueda A* , B* y alfa-beta . [ 16 ]
Ejemplo de optimización
El método de ramificación y acotación se puede utilizar para maximizarcon las restricciones
yson números enteros.
El primer paso es relajar la restricción de enteros. Tenemos dos puntos extremos para la primera ecuación que forman una línea:yPodemos formar la segunda línea con los puntos vectorialesy.

El tercer punto esEsta es una región de envoltura convexa , por lo que la solución se encuentra en uno de los vértices de la región. Podemos encontrar la intersección usando reducción de filas, que escon un valor de 276 + 2/3. Probamos los otros extremos recorriendo la línea sobre la región y encontramos que este es el máximo sobre los números reales.
Elegimos la variable con la parte fraccionaria máxima, en este casose convierte en el parámetro para el método de ramificación y acotación. Ramificamos ay obtener 276 enHemos alcanzado una solución entera, así que pasamos a la otra rama.. Obtenemos 275.75 enTenemos un decimal, así que hacemos una bifurcación.ay encontramos 274.571 enProbamos la otra rama.y no hay soluciones factibles. Por lo tanto, el máximo es 276 cony.
Véase también
- Retroceder
- El método de ramificación y corte es un híbrido entre el método de ramificación y acotación y el método del plano de corte , que se utiliza ampliamente para resolver programas lineales enteros .
- Algoritmo evolutivo
- Poda alfa-beta
Referencias
- ↑ AH Land y AG Doig (1960). "Un método automático para resolver problemas de programación discreta". Econometrica . 28 (3): 497– 520. doi : 10.2307/1910129 . JSTOR 1910129 .
- ↑ "Noticias del personal" . www.lse.ac.uk. Archivado del original el 24 de febrero de 2021. Consultado el 8 de octubre de 2018 .
- 1 2 3 Clausen, Jens (1999). Algoritmos de ramificación y acotación: principios y ejemplos (PDF) (Informe técnico). Universidad de Copenhague . Archivado del original (PDF) el 23 de septiembre de 2015. Recuperado el 13 de agosto de 2014 .
- 1 2 Little, John DC; Murty, Katta G.; Sweeney, Dura W.; Karel, Caroline (1963). "Un algoritmo para el problema del viajante" (PDF) . Operations Research . 11 (6): 972– 989. Bibcode : 1963OpRes..11..972L . doi : 10.1287/opre.11.6.972 . hdl : 1721.1/46828 .
- ↑ Balas, Egon; Toth, Paolo (1983). Métodos de ramificación y acotación para el problema del viajante (PDF) (Informe). Escuela de Posgrado de Administración Industrial de la Universidad Carnegie Mellon . Archivado (PDF) del original el 20 de octubre de 2012.
- 1 2 Bader, David A.; Hart, William E.; Phillips, Cynthia A. (2004). "Diseño de algoritmos paralelos para ramificación y acotación" (PDF) . En Greenberg, HJ (ed.). Tutoriales sobre metodologías y aplicaciones emergentes en investigación operativa . Kluwer Academic Press. Archivado del original (PDF) el 13 de agosto de 2017. Recuperado el 16 de septiembre de 2015 .
- ↑ Mehlhorn, Kurt ; Sanders, Peter (2008). Algoritmos y estructuras de datos: la caja de herramientas básica (PDF) . Springer. pág. 249.
- ↑ Moore, RE (1966). Análisis de intervalos . Englewood Cliff, Nueva Jersey: Prentice-Hall. ISBN 0-13-476853-1.
- ^ Jaulín, L.; Kieffer, M.; Didrit, O.; Walter, E. (2001). Análisis de intervalos aplicado . Berlín: Springer. ISBN 1-85233-219-0.
- ^ Hansen, ER (1992). Optimización global mediante análisis de intervalos . Nueva York: Marcel Dekker.
- ↑ Conway, Richard Walter ; Maxwell, William L .; Miller, Louis W. (2003). Theory of Scheduling . Courier Dover Publications. pp. 56–61 . ISBN 978-0-486-42817-8.
- ↑ Fukunaga, Keinosuke; Narendra, Patrenahalli M. (1975). "Un algoritmo de ramificación y acotación para calcular los k vecinos más cercanos". IEEE Transactions on Computers . 100 (7): 750– 753. Bibcode : 1975ITCmp.100..750F . doi : 10.1109/tc.1975.224297 . S2CID 5941649 .
- ↑ Narendra, Patrenahalli M.; Fukunaga, K. (1977). "Un algoritmo de ramificación y acotación para la selección de subconjuntos de características" (PDF) . IEEE Transactions on Computers . C-26 (9): 917– 922. Bibcode : 1977ITCmp.100..917N . doi : 10.1109/TC.1977.1674939 . S2CID 26204315 .
- ↑ Hazimeh, Hussein; Mazumder, Rahul; Saab, Ali (2020). "Regresión dispersa a escala: ramificación y acotación basada en la optimización de primer orden". arXiv : 2004.06152 [ stat.CO ].
- ↑ Nowozin, Sebastian; Lampert, Christoph H. (2011). "Aprendizaje estructurado y predicción en visión por computadora". Fundamentos y tendencias en gráficos y visión por computadora . 6 ( 3– 4): 185– 365. CiteSeerX 10.1.1.636.2651 . doi : 10.1561/0600000033 . ISBN 978-1-60198-457-9.
- ↑ Nau, Dana S.; Kumar, Vipin; Kanal, Laveen (1984). "Ramificación y acotación general, y su relación con A* y AO*" (PDF) . Inteligencia Artificial . 23 (1): 29– 58. doi : 10.1016/0004-3702(84)90004-3 .
Enlaces externos
- LiPS : programa gratuito con interfaz gráfica de usuario (GUI) fácil de usar, diseñado para resolver problemas de programación lineal, entera y por objetivos.
- Cbc – (Coin-or branch and cut) es un solucionador de programación entera mixta de código abierto escrito en C++.
- Algoritmos y métodos de optimización
- Optimización combinatoria