• No se han encontrado resultados

Exactos

In document T E S I S Q U E P R E S E N T A (página 70-73)

Capítulo 2. Optimización

2.2 Optimización Discreta

2.2.4 Clasificación de los Métodos

2.2.4.1 Exactos

Este tipo de métodos se caracterizan por encontrar el óptimo global de un problema dado, con base en explorar el espacio completo de soluciones factibles. Por tal motivo estos métodos no tienen mucha aplicabilidad, salvo en casos muy específicos, donde se asegura que la exploración completa no consumirá muchos recursos. Ha resultado común en estos métodos aplicar algunas estrategias para hacerlos más competitivos con respecto a otras metodologías.

La primera de éstas es el uso de simetrías del problema para reducir el espacio de búsqueda, y en algunas ocasiones el uso de máquinas en paralelo, lo que provoca una disminución en tiempo de CPU considerable, por supuesto, esto depende de la capacidad del equipo usado, tanto en número de procesadores, como en la velocidad de éstos. Por otro lado, muchos de estos métodos aplican la regla de descartar partes del espacio de búsqueda donde se puede estar seguro de que el óptimo no se encuentra; finalmente se puede poner un límite al número de iteraciones en el algoritmo, lo cual en cierta manera contradice la definición misma de dichos métodos. No obstante, debe quedar claro que aún con las estrategias mencionadas anteriormente, estos métodos no pueden ser implementados en la mayoría de los problemas, debido a la cantidad de recursos necesarios para realizar la búsqueda total.

Los métodos más comunes en este campo son los siguientes: Divide y Vencerás (Divide and Conquer), Retroceso (Backtracking), Ramificación y Poda (Branch and Bound), así como las técnicas de Programación Dinámica o los de Plano de Corte. Algunos de estos métodos forman parte de los denominados constructivos.

2.2.4.1.1 Backtracking

Esta técnica se clasifica dentro del campo de los catalogados de búsqueda exhaustiva. La idea es muy fácil de entender, sea v(a1,a2,a3,a4,…) un vector finito pero de longitud indeterminada, la solución de un problema planteado que satisface ciertas restricciones. En este caso, cada ai es un miembro de un conjunto linealmente ordenado Ai. Con lo anterior, la búsqueda exhaustiva debe considerar todos los elementos de A1 x A2 x … x Ai, para i=0,1,2,… como soluciones potenciales.

El proceso empieza con un vector nulo v( ) como la solución parcial, además las restricciones del problema indicarán cuáles de los miembros de A1 son candidatos idóneos para a1, el cual formará el subconjunto llamado S1. Posteriormente se elije el menor elemento de S1 como a1, con lo cual se tiene la solución parcial v(a1). En general, las restricciones del problema indicarán cuáles subconjuntos Sk de Ak son considerados candidatos para extender la solución parcial de (a1, a2,…, ak-1) a (a1, a2,…, ak-1,ak). Es importante aclarar que si la solución parcial (a1, a2,…, ak-1) no admite al elemento ak entonces Sk = ∅, con lo cual será necesario retroceder y elegir un nuevo ak-1 y así

sucesivamente, en caso de que no hubiera una elección para ak-1, será necesario retroceder hasta elegir un nuevo ak-2 y así sucesivamente.

Una forma adecuada de entender mejor las ideas anteriores es en forma esquemática, para lo cual la Figura 2.4 ayudará al lector en dicha tarea. En la figura mencionada el subconjunto de A1 x A2 x … x Ai, para i = 0,1,2,… que se busca, se representa como un árbol de búsqueda de la siguiente manera, la raíz del árbol (nivel 0) será el vector nulo, sus hijos son las posibles elecciones para a1, de hecho, en general se tiene que los nodos del k-ésimo nivel son las posibles elecciones para ak, una vez hechas las elecciones para a1, a2, a3,…, a k-1 como se indican los antecesores de dichos nodos. En la Figura 2.4 el recorrido realizado se indica por medio de las líneas achuradas.

inicio

posibles elecciones para a1

posibles elecciones para a2

dado a1

posibles elecciones para a3

dados a1 y a2

posibles elecciones para a4

dados a1, a2 y a3

Figura 2.4. El árbol de búsqueda de las soluciones parciales.

A continuación se presenta el algoritmo backtracking para encontrar todas las soluciones. Si únicamente se encuentra una solución, entonces el algoritmo se detiene después de haberla almacenado; además, es importante aclarar que si el algoritmo termina la instrucción while implicará que no existe solución al problema. Por otro lado, cuando el algoritmo termina en la variable count se encuentra el número de nodos que fueron explorados durante el proceso.

Algoritmo backtracking generalizado S1 ← A1 count ← 0 k ← 1 while k > 0 do While Sk ≠ ∅ do k ← k + 1 Ak ← un elemento en Sk Sk ← Sk – {ak} count ← count +1

if (a1,a2,…,ak) es una solución grabarla

k ← k+1 calcular Sk

2.2.4.1.2 Branch and Bound

En términos generales es la obtención de un óptimo global a través de un árbol de búsqueda, en el cual la raíz corresponde al problema original que se desea resolver. Cada rama del árbol corresponde a un subproblema del problema original. El algoritmo Ramificación y Poda [19] tiene dos partes bien definidas, la primera de ellas es la ramificación, la cual consiste en cubrir la región factible por medio de subregiones empleando un proceso recursivo; cada uno de los nodos de la ramificación corresponde a un subproblema, en otras palabras dado un nodo N del árbol, los hijos de N son subproblemas derivados de N y las ramas corresponden a las soluciones factibles. La segunda parte corresponde a la eliminación parcial, en este caso, para cada nodo N del árbol se tiene asociada una función g de acotación cuyo valor es un número real llamado cota del nodo; esta implementación tiene el objetivo de encontrar rápidamente cotas superiores e inferiores para una solución óptima en subregiones factibles. La función g debe satisfacer las siguientes condiciones:

• g(Ni) ≤ f(Ni) para todos los nodos Ni en el árbol • g(Ni) = f(Ni) para todas las hojas en el árbol • g(Ni) ≥ g(Nj) si Nj es el padre de Ni

donde f es la función objetivo2. Lo anterior le asigna a g el status de función de acotación.

La búsqueda en el árbol se desarrolla en forma dinámica, al inicio del proceso el árbol sólo incluye a la raíz. En algunos casos es recomendable tener una

solución inicial utilizando algún otro método. En cada iteración del proceso se selecciona un nodo para realizar la exploración, tomando en cuenta, del grupo de hijos, los nodos no explorados, implementando una estrategia de selección, las más comunes son la rápida y la floja. El paso siguiente es aplicar la función de acotación para cada nodo explorado, de donde puede surgir el óptimo del subproblema, en cuyo caso se debe comparar con la mejor solución que se tiene hasta el momento, para reemplazarla o desecharla con toda su ramificación, dependiendo de la estrategia elegida. A continuación se presenta un seudo código del algoritmo Ramificación y Poda, tomando en cuenta una estrategia de selección rápida.

Algoritmo de Ramificación y Poda Inicializar Mejor=∞; LB(No)=g(No); Vivos={(No,LB(No))} Repetir hasta que Vivos=∅

Seleccione el nodo N∈Vivos para procesar; Vivos=Vivos - {N} Ramificar sobre N generando N1,…,Nk

Para 1 ≤ i ≤ k hacer

Podar Ni si LB(Ni)=g(Ni)

Si (LB(Ni)=f(X) para una solución factible X) && (f(X)<Mejor) entonces Mejor=f(X); Solución=Xi Terminar la Poda Si LB(Ni) ≥ Mejor entonces sondear Ni en otro caso Vivos= Vivos∪{(Ni,LB(Ni))} Solución Optima=Solución; Valor Optimo=Mejor

In document T E S I S Q U E P R E S E N T A (página 70-73)

Documento similar