CO-5423 (V08) 17/05/2008 28 Con estos preliminares estamos listos para enunciar de forma precisa un algoritmo general de B + B basado en PL para problemas enteros puros de la forma: máx. cT x s.a. Ax ≤ b x ≥ 0, xi entera ∀i Para mayor claridad en la exposición, supondremos que este problema y su relajación lineal son acotados. En la descripción N es el conjunto de nodos, H es el conjunto de hojas y A es el conjunto de nodos abiertos. Algoritmo Branch and Bound begin Inicialización: T0 := {x | Ax ≤ b, x ≥ 0} , H := A := N := {0}, z := −∞, z := +∞, k := 0. Loop Análisis en el nodo k y actualización de cotas superiores: Calcular e z∗k para el programa lineal en el nodo k (región Tk ). z∗k y z := max{zj | j ∈ H}. Asignar zk := e if (zk > z y xk tiene todas sus componentes enteras (zk = z∗k )) then Completación satisfactoria: La nueva cota inferior es z := zk Cerrar todos los nodos i con zi ≤ z (A := A − {i | zi ≤ z}). else if (zk ≤ z) then Completación no satisfactoria: Cerrar el nodo k: A := A − {k}. end if CO-5423 (V08) 17/05/2008 if (A = ∅) then break 29 (* Prueba de optimalidad *) (* z = z = z∗ (si este valor es nito tenemos una solución óptima) *) end if Selección de nodo: Tomar el mayor j en A tal que zj = z. if (ez∗j ya se obtuvo) then (* Selección del tipo de análisis a realizar *) Selección de la variable para ramicación: Sea i el mínimo índice tal que xji no es entera en xj j k j0 := |N | , Tj0 := Tj ∩ {x | xi ≤ xji }, zj0 := zj j k zj00 := zj j00 := j0 + 1, Tj00 := Tj ∩ {x | xi ≥ xji + 1}, A := A − {j} + {j0 , j00 }, H := H−{j} + {j0 , j00 }, N := N + {j0 , j00 } k = j0 else k=j end if end Loop end Formas de completar un nodo j. Un nodo j se cierra cuando zj ≤ z. Hay dos posibilidades: 1. Se ha obtenido, en el nodo j una nueva y mejor solución entera z = zj = z∗j > −∞ (Completación satisfactoria ) CO-5423 (V08) 17/05/2008 2. No sabemos si z∗j = z pero sí que zj ≤ z (Completación insatisfactoria 30 ) El análisis ulterior del nodo j no produciría soluciones mejores que la actual, como mucho, una del mismo valor. Pero no buscamos soluciones óptimas alternativas. En el ejemplo, los nodos 3 y 5 se cerraron por 1. mientras que los nodos 2 y 6 se cerraron por 2. Observaciones: La parte computacionalmente más cara del algoritmo es el análisis del nodo, donde debe aplicarse un algoritmo de programación lineal (Simplex). La estrategia de selección de nodo se llama de mejor nodo abierto (best open node BON). Notar que al ramicar, se analiza primero el nodo j0 . Luego, cuando se llega a la selección de nodo otra vez, por herencia, j00 debe ser el mejor nodo abierto y es seleccionado. Luego se analiza j00 . En otras palabras, al ramicar, los dos nuevos nodos generados se analizan inmediatamente antes de analizar cualquier otro nodo. Las cotas generadas por este algoritmo satisfacen la siguiente propiedad que luego será usada para garantizar la correctitud. Teorema Los valores z y z generados por el algoritmo satisfacen: z ≤ z∗ ≤ z. La sucesión de cotas superiores generadas es monótona no creciente y la de cotas inferiores es monótona creciente. Prueba: Inicialmente z = −∞ y z = +∞, entonces las dos desigualdades se satisfacen. Cuando se genera una nueva cota superior z en el análisis del nodo, por el lema anterior, es una cota superior sobre z∗ . Cuando cambia H, al menos un elemento del conjunto {zj | j ∈ H} se borra y los elementos que se añaden al ramicar tienen valores iguales al borrado. Es decir, el máximo sobre este conjunto no puede . En realidad el máximo sólo puede cambiar en el crecer análisis del nodo al decrecer uno de los elementos del conjunto. Tenemos, entonces lo referente a las cotas superiores. CO-5423 (V08) 17/05/2008 31 Las cotas z siempre acotan inferiormente a z∗ ya que provienen de la completación satisfactoria como valores objetivo de soluciones factibles de P. De hecho, cuando se actualizan lo hacen sólo para . crecer Con esto estamos listos para demostrar la correctitud del algoritmo, esto es, termina si el algoritmo entonces produce el resultado correcto. La nitud del algoritmo es otra cosa. La terminación es fácil de ver en el caso 0-1 y aún en el caso de región factible acotada. Basta acotar las posibles ramicaciones para cada variable. Sin embargo en el caso general no hay garantía de terminación y aún habiéndola, como en los casos mencionados, no hay garantía de viabilidad computacional. Teorema Prueba: Si en el algoritmo A = ∅, entonces z = z = z∗ . Es sencilla. Según el teorema anterior z ≤ z∗ ≤ z, basta probar que z = z. Como A = ∅, los nodos de H están todos cerrados. Pero z = max{zj | j ∈ H}. Si z y z no fuesen iguales (z < z) existiría una hoja k tal que zk > z que entonces debería estar abierta.