Introducción El problema planteado puede ser modelado como un problema de optimización combinatoria. Específicamente como un problema del agente viajero o TSP (Traveling Salesman Problem). Para resolverlo se debe determinar la solución óptima o la mejor solución (solución aproximada). Con la primera forma se corre el riesgo de obtener la solución en tiempos muy largos. En cambio, hallando la solución aproximada, se obtendrá una respuesta en un tiempo razonable pero con el riesgo de estar lejos de la solución óptima. Este tipo de problema está clasificado como problema de complejidad* NP (Non-Deterministic Polynomial-time) es decir que puede ser resuelto por una máquina de Turing no determinista** en tiempo polinómico. * La teoría de la complejidad computacional es la rama de la teoría de la computación que estudia, de manera teórica, los recursos requeridos durante el cómputo de un algoritmo para resolver un problema. Los recursos comúnmente estudiados son el tiempo (mediante el número de pasos) y el espacio (cantidad de memoria). (Wikipedia) **Mientras que una máquina determinista sigue un solo "camino computacional", una máquina no determinista tiene un "árbol computacional" (Wikipedia) Algoritmo GRASP (Greedy Randomized Adaptive Search Procedure) Descripción • Procedimiento de búsqueda: Procedimiento de búsqueda goloso, aleatorio y adaptativo. Denominado así por sus siglas en ingles. Se trata de un procedimiento que realiza búsquedas sin evaluar todas las posibilidades. Se denomina goloso o voraz porque toma soluciones (elegidas de forma aleatoria) que le proveen un beneficio inmediato. Además posee un componente adaptativo porque la función golosa pude variar en cada iteración del algoritmo. • Optimización combinatoria. Comúnmente aplicado para resolver problemas de optimización combinatoria. Ejemplos: - Problema de rutas de vehículos (Vehicle routing problem - VRP) -Árbol expandido mínimo (Minimum spanning tree - MST) -Problema de las 8 reinas -Problema de la mochila -Problema de cortes • Algoritmo meta heurístico. Las técnicas heurísticas y meta-heurísticas son métodos aproximados que ofrecen soluciones óptimas a problemas NP* a un bajo coste computacional. *problema de complejidad NP (Non-Deterministic Polynomial-time) es decir que puede ser resuelto por una máquina de Turing no determinista** en tiempo polinómico. **Mientras que una máquina determinista sigue un solo "camino computacional", una máquina no determinista tiene un "árbol computacional" Aquí el prefijo meta ("más allá") tiene el sentido de "nivel superior". Se sitúan conceptualmente “por encima” de los heurísticos en el sentido que guían el diseño de éstos. Están diseñados para resolver problemas en los que los heurísticos clásicos no son efectivos. Proporcionan un marco general para crear nuevos algoritmos híbridos combinando diferentes conceptos derivados de la inteligencia artificial, la evolución biológica y los mecanismos estadísticos”. Un algoritmo meta-heurístico es un método heurístico que supera limitaciones de los heurísticos como la miopía del procedimiento* y la voracidad. *Se escoge la mejor opción disponible en una iteración sin “ver” que esto puede obligar a realizar malas elecciones en iteraciones posteriores. • Procedimiento iterativo, cada paso consta de dos fases: GRASP es un procedimiento iterativo en donde cada paso consiste en una fase de construcción y una de mejora. Construcción En la fase de construcción se aplica un procedimiento heurístico constructivo para obtener una buena solución inicial. Mejora Esta solución se mejora en la segunda fase mediante un algoritmo de búsqueda local. La mejor de todas las soluciones examinadas se guarda como resultado final. Forma General Procedimiento GRASP() P = Cargar_problema(instancia, α); Los datos o instancias que serán procesados por el sistema El parámetro de relajación (α) Los datos de la condición de parada (ej: el número de iteraciones, tiempo de procesamiento) Mientras (no se cumpla la condición de parada) hacer S = Algoritmo_Constructivo(P); Es cualquier algoritmo que devuelva alguna solución del problema, ésta en general estará lejos de la solución óptima. Cada iteración debe regresarnos una solución diferente para explorar el espacio de soluciones. S = Busqueda_Local(S); Aplica pequeñas transformaciones a la solución inicial hasta llegar a un óptimo local. Registrar_Mejor_Sol(S); Si la solución obtenida es mejor que solución que tenemos hasta el momento entonces la guardamos. Fin Mientras; Retornar_Mejor_Sol(); Fin GRASP Algoritmo Constructivo Añade iterativamente elementos a una estructura, inicialmente vacía, hasta obtener una solución del problema. La estrategia para indicar que elemento se añade consiste en elegir, no al mejor elemento, sino elegir al azar a uno de los mejores elementos de un conjunto llamado lista restringida de candidatos (restricted candidate list - RCL). Algoritmo_Constructivo(P) S = φ; E = P.elementos; α=P.alfa; Mientras (E <> φ) hacer τ = Peor {f(e)|e ∈ E}; β = Mejor{f(e)|e ∈ E}; RCL = {e ∈ E | β-α(β-τ)≤f(e)≤β }; c = escoger_elem_azar(RCL); S = S U {c}; E = E - {c}; Fin Mientras; Retornar_Sol(S); Fin Algoritmo_Constructivo S es la solución parcial al problema, E es el conjunto de elementos del problema, α es el valor del parámetro de relajación que controla la aleatoriedad del procedimiento. τ es un elemento mínimo del conjunto E según la función voraz f. β es un elemento máximo del conjunto E según la función voraz f. RCL es la lista restringida de candidatos (restricted candidate list), contiene elementos de E que cumplen con que evaluados con la función voraz sus valores se encuentran acotados inferiormente por β-α(β-τ) y superiormente por β. α = 0 Criterio totalmente goloso α = 1 Criterio totalmente aleatorio 0 < a < 1 Criterio Goloso + aleatorio Busqueda_Local Consiste en realizar pequeñas transformaciones a una solución dada S de un problema P, de forma de obtener otras soluciones S’ distintas pero “cercanas” o “vecinas” a la solución original S. Una vez hallado el espacio de soluciones vecinas simplemente nos quedamos con la mejor de todas ellas. Busqueda_Local(S) S_Max= φ; Mientras (no es posible mejorar S) hacer V = Construir_Vecindad(S); sol = Max{F(s)|s ∈ V}; Si ( F(sol) > F (S_Max) ) Entonces S_Max = sol; Fin Mientras Retornar (S_Max); Fin Busqueda_Local Ventajas Recomendable cuando el conjunto de datos a trabajar es grande y se requiere una solución aceptable. Sencillez y facilidad de implementación. Permiten una mayor flexibilidad para el manejo de las características del problema (Variables de holgura y condiciones de parada) • Ofrecen más de una solución, lo cual permite ampliar las posibilidades de elección del que decide Desventajas No se puede conocer la calidad de la solución; es decir, precisar cuan cerca se está de la solución óptima. La solución obtenida no es la óptima Es deterministico? Que otras clasificaciones aplican a este algoritmo? En que consiste cada fase?