METAHEURISTICAS (5ta clase) Irene Loiseau 2do Cuatrimestre 2016 Hay otras metaheurísticas que mejoran el algoritmo de búsqueda local: por ejemplo ILS y VNS Iterative Local Search (ILS) procedure Iterated Local Search s0 = GenerarSolucionInicial S* = BúsquedaLocal(s ) 0 Repeat s´ = Perturbación (s*) s´* = BúsquedaLocal(s´) s* = Criteriodeaceptacion ( s*, s´*) until se cumpla la condición de terminación end Variable Neighborhood Search (VNS) La idea es usar en el contexto de la búsqueda local varias definiciones de vecindarios. Se supone que los mínimos locales de los distintos vecindarios no son iguales, pero si el mínimo global. • Cómo elegir los vecindarios?. • Algoritmos de búsqueda local. Variable Neighborhood Search (VNS) Se han propuesto varias extensiones del VNS básico. Ejemplo VNDS ALGORITMOS GENETICOS Primeras ideas Holland ( 1975) (hay algún trabajo anterior) Basados en los principios de evolución y herencia. Modelar o simular fenómenos naturales, evolución de las especies, procesos de selección natural, mutación, etc. Vocabulario de la genética: individuos, cromosomas, etc. Programas o algoritmos evolutivos Estructura general de un algoritmo evolutivo -----------------------------------------------------------------Empezar t := 0 inicializar P(t) evaluar P(t) Mientras no se cumpla la condición de parada hacer Empezar t:= t + 1 construir P (t) a partir de P( t-1) modificar P(t) evaluar P (t) Fin Fin ----------------------------------------------------------------------- P(t) = {x1, x2, x3........xn} población de la generación t Los xk son los individuos de esa población. Cada uno representa una solución del problema que se está tratando. Se evalúa cada individuo usando una función apropiada para medirlo. Para formar la población de la siguiente generación se eligen los mejores, se realiza el cruzamiento y eventualmente se realiza una mutación. Después de un numero de generaciones se espera que el mejor individuo represente una buena solución (casi óptima). Qué hace falta para construir un algoritmo genético para un problema particular? • representación “genética” de las soluciones • forma de generar la población inicial • función de evaluación • operadores genéticos que alteren la composición de los hijos. • determinación de parámetros (tamaño de la población, probabilidad de aplicar operadores genéticos, etc.) Minimización de una función max f(x) = x sen (10 Π x) + 1 s.a. –1 < x < 2 Se puede resolver analíticamente Representación: Cromosoma: vector binario de longitud relacionada con la precisión requerida (en este caso queremos 6 decimales) [-1,2] tiene que dividirse en 3000000 intervalos (22 bits) 2097152 = 2**21 < 3000000 < 2**22 = 4194304 Para convertir un string binario en un número real: pasar (b21...............b0) de base 2 a base 10 y obtener x’ x = -1 + x’ * [3/( 2**22 –1)] Población inicial Se construye una población de vectores de binarios de 22 bits. Evaluación La función de evaluación es la función f Operadores genéticos Mutación Se altera uno o mas genes con una probabilidad igual a la tasa de mutación predeterminada Por ejemplo si el 5to gen de v3 = (1110100000111111000101) es elegido para mutación el nuevo cromosoma queda v3”= (1110000000111111000101) En cambio si se eligiera el 10mo gen quedaría v3” = (1110000001111111000101) Cruzamiento Supongamos que tienen que cruzarse v2 y v3 y que el punto de cruzamiento queda en el 5to gen. Entonces si v2 = (0000001110000000010000) v3 =(1110000000111111000101) los nuevos cromosomas son v2”= (0000000000111111000101) v3” = (1110001110000000010000) Parámetros: • Tamaño de la población • Probabilidad de cruzamiento • Probabilidad de mutación 50 0.25 0.01 Resultados Después de 150 generaciones: vmax = (111........................) = 1.850773 f(vmax) = 2.85 # de Generación Función de evaluación 1 1.441942 6 2.250003 8 2.250283 9 2.250284 10 2.250363 12 2.328077 39 2.344251 40 2.345087 51 2.738930 99 2.849346 137 2.850217 145 2.850227 Como funciona un algoritmo genético básico para un problema de maximización: 1. Población inicial: al azar de tamaño predeterminado pop. 2. Para seleccionar la nueva población: • eval(vi) es la función objetivo que se quiere maximizar. • se calcula eval (vi) para cada cromosoma vi de la población actual. • Se define el valor de la población: F= Σi eval (vi) • se calcula la probabilidad de selección de vi pi = eval(vi) / F • Se calcula la probabilidad acumulada de selección: qi = Σ1j pj Para seleccionar los individuos de la nueva población entonces, hacer pop veces: • Generar un número al azar r en el intervalo (0,1) • Si r < q1 elegir v1 sino elegir vi tal que qi-1 < r < qi (algunos cromosomas pueden ser elegidos más de una vez, los mejores son elegidos más veces, los peores “mueren”) 3. Crossover (entre los individuos de la nueva población): Dada la probabilidad dada de crossover pc (parámetro) se toman pc * pop cromosomas para participar del cruzamiento. • Para cada cromosoma de la nueva población: generar r al azar en (0,1) • si r < pc elegir el cromosoma para cruzamiento Aparear los cromosomas elegidos. Para cada par determinar al azar pos (b1,b2.....bpos,bpos+1,...........bm) (c1,c2.....cpos,cpos+1,............cm) se reemplazan en la nueva población por (b1,b2.....bpos,cpos+1,...........cm) (c1,c2.....cpos,bpos+1,............bm) 4. Mutación: Dada la probabilidad de mutación pm se cambian pm * m * pop bits. • Para cada cromosoma y para cada bit generar r al azar entre 0 y 1. • Si r < pm cambiar el bit. Con esto queda formada la nueva población. El dilema del prisionero Cuento : “dos prisioneros están en celdas separadas, imposibilitados de comunicarse y se les pide que traicionen al otro en forma independiente............” • El dilema del prisionero puede jugarse como un juego de 2 jugadores, donde cada uno a su turno traiciona o coopera con el otro. El puntaje que cada uno saca esta dado por la siguiente tabla: Jugador 1 Traiciona Traiciona Coopera Coopera Jugador 2 Traiciona Coopera Traiciona Coopera P1 P2 1 1 5 0 0 5 3 3 Queremos diseñar un algoritmo que aprenda una estrategia para jugar al dilema del prisionero: Representación de la estrategia • Consideraremos estrategias determinísticas, que usen los resultados de las tres últimas jugadas para decidir la jugada actual. • Una estrategia se representa por un string de 64 bits indicando que hacer después de cada una de las posibles historias, más 6 bits para describir las jugadas previas al inicio del juego (total 70 bits). Esquema del algoritmo: • Para determinar la población inicial a cada jugador se le asigna al azar un string de 70 bits. • Para determinar el score de cada jugador se lo hace jugar con los otros. El score es el promedio de todos los juegos. • Un jugador con score promedio se le asigna un par, a uno por debajo del promedio ninguna, y a los que están por encima 2 parejas. • Los jugadores exitosos se aparean al azar para producir dos descendientes por pareja. La estrategia de cada descendiente se arma a partir de la estrategia de sus padres usando las definiciones básicas de crossover y mutación. Resultados experimentales: • Partiendo de una población al azar se obtuvieron poblaciones donde el jugador medio era tan exitoso como el de las mejores heurísticas conocidas hasta el momento. • Se sacaron conclusiones acerca del “comportamiento” de los mejores jugadores: i) Continúe cooperando después de tres cooperaciones mutuas .... (ponga C después de recibir (CC)(CC)(CC)) ii)Provoque: traicione después que el otro traiciona después de varias cooperaciones (ponga D después de recibir (CC)(CC)(CD)) • Acepte una disculpa: continúe cooperando después que la cooperación se retomó (ponga C después de (CD)(DC)(CC)). • Olvide: coopera después que la cooperación se retomó (ponga C después de (DC)(CC)(CC)). • Traicione después de 3 traiciones mutuas (ponga D después de (DD)(DD)(DD)) El problema del viajante de comercio Representación: Conviene usar vector binario en este caso?. Haría falta un vector binario de [log2 n] bits para cada ciudad, n [log2 n] en total. Que pasaría con el crossover y la mutación?. Algoritmos de reparación Es mejor usar una representación entera. Usamos un vector (i1,i2,......in) para representar un tour. Inicialización: Se pueden usar heurísticas constructivas empezando de distintas ciudades o generar los tours al azar. Crossover: Hay muchas posibilidades, por ejemplo: Padres : (1,2,3,4,5,6,7,8,9,10,11,12) (7,3,1,11,4,12,5,2,10,9,6,8) Se toma por ejemplo el segmento (4,5,6,7) y queda el descendiente: (1,11,12,4,5,6,7,2,10,9,8,3) De la misma forma se construye el otro hijo. Se puede hacer mutación acá?.Cómo? Otra representación: La ciudad i está en la posición j si el tour va de la ciudad i a la ciudad j. Posible cruzamiento: Elegir al azar un eje del primer padre, después elegir el eje que sigue del segundo y así siguiendo. (Si elige un eje que genera subtour, se elige al azar uno que no genere subtour). Ej: padres (2 3 8 7 9 1 5 4 6) (7 5 1 6 9 2 8 4 3) Hijo: (2 5 8 6 9 1 4 7 3) Otra posibilidad de cruzamiento. Elegir una ciudad al azar y después el menor eje de ambos padres saliendo de esa ciudad. Si ese produce ciclo elegir el otro. Si ese también produce ciclo elegir otro dentro de un pool de q ejes elegidos al azar. Otra representación: Si tenemos la siguiente lista de referencia: C= (1 2 4 3 8 5 9 6 7) Por ejemplo (1 1 2 1 4 1 3 1 1) representa un tour. (i representa la posición en la que está la ciudad que sigue en el orden en el tour que queda después que se fueron sacando las anteriores). Acá se puede usar el cruzamiento “clásico”. Padres: (1 1 2 1 4 1 3 1 1) ( 5 1 5 5 5 3 3 2 1) Hijos: (1 1 2 1 5 3 3 2 1) (5 1 5 5 4 1 3 1 1) Los hijos corresponden a tours válidos Ver que significa esto respecto de los circuitos representados por los padres y los hijos. Representaciones matriciales M matriz binaria donde mij = 1 si la ciudad i está antes que la ciudad j en el circuito. Características de estas matrices?. Ideas de cruzamiento? Ver más detalles en el libro de Michalewicz Teorema del esquema Porqué funcionan los algoritmos genéticos (con representación binaria)?. Esquemas ( x x 1 1 x x 0 0 1 1 x 1) ( 1 1 0 1 1 x x 1 1 1 1 0) • Orden de un esquema • Longitud de un esquema • Evaluación de un esquema dentro de una población dada. Se quiere tener una idea de porqué sobreviven los mejores esquemas a través de las generaciones de un algoritmo genético. Se puede demostrar el siguiente resultado: Teorema del esquema. (“Schema Theorem”): Los esquemas cortos, de bajo orden, de valor (“fitness”) por encima de la media van a ser revisados un número exponencialmente creciente de veces en las generaciones de un algoritmo genético. Hipótesis: Un algoritmo genético busca obtener soluciones casi óptimas a través de juntar esquemas cortos, de bajo orden y alta perfomance, llamados “bloques”. Ver demostración de este teorema y detalles de las definiciones en el capítulo 3 del libro de Michalewicz.