Articulo de referencia

Ramificar y enlazar

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 ...

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 .

  1. 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.
  2. Inicializa una cola para almacenar una solución parcial sin que se haya asignado ninguna de las variables del problema.
  3. Repetir hasta que la cola esté vacía:
    1. Retire el nodo N de la cola.
    2. 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 Bf ( x ) .
    3. De lo contrario, ramifica en N para producir nuevos nodos N i . Para cada uno de estos:
      1. 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.
      2. 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

Cuandoincógnita{\displaystyle \mathbf {x} }es un vector deRnorte{\displaystyle \mathbb {R} ^{n}}Los 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 :

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 maximizarZ=5incógnita1+6incógnita2{\displaystyle Z=5x_{1}+6x_{2}}con las restricciones

incógnita1+incógnita250{\displaystyle x_{1}+x_{2}\leq 50}

4incógnita1+7incógnita2280{\displaystyle 4x_{1}+7x_{2}\leq 280}

incógnita1,incógnita20{\displaystyle x_{1},x_{2}\geq 0}

incógnita1{\displaystyle x_{1}}yincógnita2{\displaystyle x_{2}}son 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:[incógnita1incógnita2]=[500]{\displaystyle {\begin{bmatrix}x_{1}\\x_{2}\end{bmatrix}}={\begin{bmatrix}50\\0\end{bmatrix}}}y[050]{\displaystyle {\begin{bmatrix}0\\50\end{bmatrix}}}Podemos formar la segunda línea con los puntos vectoriales[040]{\displaystyle {\begin{bmatrix}0\\40\end{bmatrix}}}y[700]{\displaystyle {\begin{bmatrix}70\\0\end{bmatrix}}}.

las dos líneas.

El tercer punto es[00]{\displaystyle {\begin{bmatrix}0\\0\end{bmatrix}}}Esta 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 es[70/380/3]{\displaystyle {\begin{bmatrix}70/3\\80/3\end{bmatrix}}}con 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 casoincógnita2{\displaystyle x_{2}}se convierte en el parámetro para el método de ramificación y acotación. Ramificamos aincógnita226{\displaystyle x_{2}\leq 26}y obtener 276 en24,26{\displaystyle \langle 24,26\rangle }Hemos alcanzado una solución entera, así que pasamos a la otra rama.incógnita227{\displaystyle x_{2}\geq 27}. Obtenemos 275.75 en22,75,27{\displaystyle \langle 22.75,27\rangle }Tenemos un decimal, así que hacemos una bifurcación.incógnita1{\displaystyle x_{1}}aincógnita122{\displaystyle x_{1}\leq 22}y encontramos 274.571 en22,27.4286{\displaystyle \langle 22,27.4286\rangle }Probamos la otra rama.incógnita123{\displaystyle x_{1}\geq 23}y no hay soluciones factibles. Por lo tanto, el máximo es 276 conincógnita1=24{\displaystyle x_{1}=24}yincógnita2=26{\displaystyle x_{2}=26}.

Véase también

Referencias

  1. 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 . 
  2. "Noticias del personal" . www.lse.ac.uk. Archivado del original el 24 de febrero de 2021. Consultado el 8 de octubre de 2018 .
  3. 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 .
  4. 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 .
  5. 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.
  6. 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 .
  7. Mehlhorn, Kurt ; Sanders, Peter (2008). Algoritmos y estructuras de datos: la caja de herramientas básica (PDF) . Springer. pág. 249. 
  8. Moore, RE (1966). Análisis de intervalos . Englewood Cliff, Nueva Jersey: Prentice-Hall. ISBN 0-13-476853-1.
  9. ^ Jaulín, L.; Kieffer, M.; Didrit, O.; Walter, E. (2001). Análisis de intervalos aplicado . Berlín: Springer. ISBN 1-85233-219-0.
  10. ^ Hansen, ER (1992). Optimización global mediante análisis de intervalos . Nueva York: Marcel Dekker.
  11. 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.
  12. 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 . 
  13. 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 . 
  14. 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 ].
  15. 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.
  16. 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 .
  • 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++.