Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Universidad de Sevilla
x
Algoritmos de búsqueda de soluciones óptimas
u Buscar la mejor solución dentro de un espacio de posibles soluciones
u Maximizar o minimizar
u En nuestro caso, minimizar (análogamente maximizar)
x
Mejoras iterativas
u Empezar con un estado inicial cualquiera
u Mejorar su calidad paso a paso
x
Algoritmos:
u Escalada (tema 4)
u Reparación heurı́stica (tema 5)
u Escalada con reinicio aleatorio
u Enfriamiento simulado
u Algoritmos genéticos
IA-I 2002–2003 Cc Ia Técnicas avanzadas de búsqueda 7.2
Problema del viajante
x
Problema: dada una lista de ciudades, pasar por todas ellas recorriendo
la menor distancia posible (suponiendo que existe conexión directa entre
todas ellas)
CO
JA
SE
HU
GR
AL
MA
CA
x
Una posible representación:
u Estados: ciudades visitadas + ciudades por visitar
u Operadores: ir a una ciudad
u Un operador es aplicable si la ciudad está entre las que quedan por visitar
u Aplicar una búsqueda que encuentre una solución óptima
x
Alternativa:
u Estados: permutación de las ciudades
u Operadores: obtener una nueva permutación
x
Estados y soluciones al problema
u No buscamos el camino (los estados contienen toda la información)
u Se busca optimizar el valor de una determinada función objetivo
x
Estado inicial
u No está claramente definido
x
Operadores
u Se puede definir cierta noción de nodo “sucesor” o “vecino”
u En algunos casos, gran cantidad de vecinos
u Introducimos cierta componente aleatoria
x
Lista de todas las ciudades
(defparameter *ciudades*
’(almeria cadiz cordoba granada huelva jaen malaga sevilla))
x
Generación aleatoria del estado inicial
(defun escoge-aleatoriamente (n l)
(if (= n 0)
’()
(let ((pos-escogida (random (length l))))
(cons (nth pos-escogida l)
(escoge-aleatoriamente (- n 1)
(append (subseq l 0 pos-escogida)
(subseq l (1+ pos-escogida))))))))
(defun genera-estado-inicial ()
(escoge-aleatoriamente (length *ciudades*) *ciudades*))
x
Generación de un sucesor:
c1 c1
c2 c8 c2 c8
c3 c7 c3 c7
c4 c6 c4
c6
c5 c5
x
Heurı́stica + aleatoriedad
x
Generación de un sucesor (aleatorio):
(defparameter *lista-indices*
(loop for i from 0 to (- (length *ciudades*) 1) collect i))
x
Función objetivo:
(defparameter *coordenadas-ciudades*
’((almeria (409.5 93)) (cadiz ( 63 57))
(cordoba (198 207)) (granada (309 127.5))
(huelva ( 3 139.5)) (jaen (295.5 192))
(malaga (232.5 75)) (sevilla ( 90 153))))
(GENERA-ESTADO-INICIAL)
(GENERA-SUCESOR ESTADO)
(F-OBJETIVO ESTADO)
x
Caso particular del problema del viajante
u Parametrizado
(0,n) (n,n)
(0,3)
(0,2)
(0,1)
(0,0)
(1,0) (2,0) (3,0) (n,0)
x
Parámetros del problema
(defvar *lado*)
(defvar *puntos*)
(defun crea-puntos ()
(setf *puntos*
(append
(loop for i from 0 to *lado*
collect (cons 0 i))
(loop for i from 1 to *lado*
collect (cons i 0))
(loop for i from 1 to *lado*
collect (cons *lado* i))
(loop for i from 1 to (1- *lado*)
collect (cons i *lado*)))))
(defun crea-lista-indices ()
(setf *lista-indices*
(loop for i from 0 to (- (length *puntos*) 1)
collect i)))
x
Generación del estado inicial
(defun genera-estado-inicial ()
(escoge-aleatoriamente (length *puntos*) *puntos*))
x
Generación de un sucesor
(defun genera-sucesor (estado)
(let* ((indices (escoge-aleatoriamente 2 *lista-indices*))
(indices-ord (if (< (first indices) (second indices))
(list (first indices) (second indices))
(list (second indices) (first indices))))
(primero (first indices-ord))
(segundo (second indices-ord)))
(append (subseq estado 0 primero) (reverse (subseq estado primero segundo))
(subseq estado segundo))))
x
Función objetivo
(defun distancia (p1 p2)
(sqrt (+ (expt (- (car p1) (car p2)) 2)
(expt (- (cdr p1) (cdr p2)) 2))))
(defun escalada-aleatoria ()
(let* ((actual (genera-estado-inicial)) ;;; 1.1
(vecino (genera-sucesor actual)) ;;; 1.2
(valor-actual (f-objetivo actual)) ;;; 1.3
(valor-vecino (f-objetivo vecino))) ;;; 1.4
(loop while (< valor-vecino valor-actual) do
(setf actual vecino ;;; 2
valor-actual valor-vecino
vecino (genera-sucesor actual)
valor-vecino (f-objetivo vecino)))
(list actual valor-actual))) ;;; 3
x
Ejemplos
> (load "viajante")
...
> (escalada-aleatoria)
((CADIZ HUELVA CORDOBA JAEN ALMERIA
SEVILLA GRANADA MALAGA) 1366.7968)
> (escalada-aleatoria)
((SEVILLA JAEN HUELVA CORDOBA
MALAGA ALMERIA GRANADA CADIZ) 1488.9255)
> (escalada-aleatoria)
((SEVILLA GRANADA ALMERIA CORDOBA
JAEN CADIZ MALAGA HUELVA) 1431.388)
x
Problemas:
u Optimos locales, mesetas
x
Idea:
u Buscar aleatoriamente el inicio de la pendiente
u Hacer escalada (o descenso) a partir de ahı́
u Iterar el proceso
x
Ejemplos, viajante:
> (load "viajante")
...
> (escalada-con-reinicio-aleatorio 50)
((JAEN CORDOBA SEVILLA CADIZ
HUELVA MALAGA ALMERIA GRANADA) 1009.58923)
> (escalada-con-reinicio-aleatorio 300)
((CORDOBA GRANADA ALMERIA JAEN
MALAGA SEVILLA HUELVA CADIZ) 1080.9673)
> (escalada-con-reinicio-aleatorio 1000)
((MALAGA CADIZ HUELVA SEVILLA
CORDOBA JAEN ALMERIA GRANADA) 929.9256)
x
Ejemplos, cuadrado (soluciones no óptimas):
> (load "puntos")
...
> (cuadrado 3)
> (escalada-con-reinicio-aleatorio 10000)
(((3 . 3) (3 . 2) (2 . 3) (3 . 1) (2 . 0) (3 . 0)
(1 . 0) (0 . 0) (0 . 1) (0 . 3) (0 . 2) (1 . 3))
17.478706)
> (escalada-con-reinicio-aleatorio 100000)
(((1 . 0) (0 . 0) (0 . 1) (0 . 2) (0 . 3) (1 . 3)
(3 . 2) (3 . 3) (2 . 3) (3 . 0) (3 . 1) (2 . 0))
15.812559)
x
Idea principal:
u Aceptar probabilı́sticamente estados “peores”, con
una probabilidad en función del incremento producido
en la función objetivo
u Permitir salir de óptimos locales, sin salir del óptimo
global
x
Basado en proceso de enfriamiento de metales
u Sistema estable: mı́nimo de energı́a
u Dada una temperatura, el sistema necesita tiempo pa-
ra estabilizarse (perder energı́a)
u Es posible pasar momentáneamente por estados de
mayor energı́a, con probabilidad dada por
∆E
p(∆E, T ) = e− k·T
x
Generación estado inicial y estados vecinos
u Aleatoria, heurı́stica
x
Programa de enfriamiento, en nuestro caso:
u Temperatura inicial
u Variación de la temperatura: T ← α · T
u Número fijo de iteraciones para cada T
x
Criterio de parada
u Valor suficientemente bueno de la función objetivo
u Número máximo de iteraciones sin mejora
u En nuestro caso, número fijo de iteraciones totales
x
Ejemplo (problema del viajante)
> (enfriamiento-simulado 100 0.95 100 100)
((MALAGA GRANADA ALMERIA JAEN CORDOBA SEVILLA HUELVA CADIZ) 929.92554)
x
Ejemplo (problema de los puntos)
> (cuadrado 3)
(0 1 2 3 4 5 6 7 8 9 10 11)
> (enfriamiento-simulado 5 0.95 100 100)
(((0 . 1) (0 . 0) (1 . 0) (2 . 0) (3 . 0) (3 . 1)
(3 . 2) (3 . 3) (2 . 3) (1 . 3) (0 . 3) (0 . 2))
12)
> (cuadrado 4)
...
> (second (enfriamiento-simulado 8 0.95 100 100))
16
> (cuadrado 7)
...
> (second (enfriamiento-simulado 15 0.95 100 100))
28
> (cuadrado 10)
...
> (second (enfriamiento-simulado 20 0.95 100 100))
43.414215
> (second (enfriamiento-simulado 20 0.95 100 100))
40
> (cuadrado 15)
...
> (second (enfriamiento-simulado 35 0.95 100 100))
99.498474
> (second (enfriamiento-simulado 35 0.95 500 500))
60
x
Procesos evolutivos
x
La evolución ocurre en los cromosomas de los individuos
x
Selección natural: las “buenas estructuras” sobreviven con más proba-
bilidad que las demás
x
Reproducción mediante cruces y mutaciones
x
Algoritmo genético:
u Aplicación de estas ideas en la búsqueda de soluciones óptimas
x
Posibles soluciones representadas como indivi-
duos
u Codificación como cromosoma (lista de genes)
u Población de individuos
u Generaciones
u Genotipo y fenotipo
x
Bondad de los individuos
u Según el valor de la función objetivo
x
Reproducción de las generaciones
u Cruces: combinación de estructuras, aleatorio
u Mutaciones: cambio de algunos genes, aleatorio
x
Mecanismo de evolución
u Selección probabilı́stica de los individuos con mejor
valoración
x
Cruces:
1 0 0 0 1 1 1 0 0 0 0 0
0 1 1 0 0 0 0 1 1 0 1 1
x
Mutaciones:
1 0 0 0 1 1 1 0 1 0 1 1
t := 0
Inicia-Población P(t)
Evalúa-Población P(t)
x
Número total de individuos en la población (en cada generación)
x
Individuos que intervienen en la reproducción en cada generación (pa-
dres)
u Dado como proporción de la población total (proporción de cruces)
x
Padres que se escogen entre los mejores
u Dado como proporción del total de padres (proporción de mejores)
u El resto de padres se escogen aleatoriamente
x
Probabilidad de que ocurra una mutación
u Generalmente un número muy bajo
;;; Ejemplo:
;;; > (decodifica ’(1 0 0 1 0 0 0 1 0 0))
;;; 137
x
Función objetivo:
(defun f-objetivo (x) (expt x 2))
x
Criterio de parada:
(defun es-optimo (x)
(= (f-objetivo (decodifica x)) 0))
x
Elementos en la representación del problema:
*GENES*
*LONGITUD-INDIVIDUOS*
(DECODIFICA X)
(F-OBJETIVO X)
(ES-OPTIMO X)
x
Variables globales
(defvar *numero-total-individuos*)
(defvar *numero-total-padres*)
(defvar *numero-mejores*)
(defvar *probabilidad-mutacion*)
x
Iniciar variables globales
(defun inicia-variables-globales (numero-total-individuos
proporcion-cruces
proporcion-mejores
probabilidad-mutacion)
(setf *numero-total-individuos* numero-total-individuos
*numero-total-padres* (fuerza-numero-par
(round (* proporcion-cruces
numero-total-individuos)))
*numero-mejores* (round (* *numero-total-padres* proporcion-mejores))
*probabilidad-mutacion* probabilidad-mutacion))
IA-I 2002–2003 Cc Ia Técnicas avanzadas de búsqueda 7.33
Generación de la población inicial
x
Población inicial (aleatoria)
(defun crea-gen ()
(nth (random (length *genes*)) *genes*))
x
Ordenación de la población
(defun evalua-cromosoma (cromosoma)
(f-objetivo (decodifica cromosoma)))
x
Cruce en un punto seleccionado aleatoriamente
(defun cruza-pareja (individuo1 individuo2)
(let ((posicion-cruce (1+ (random (- *longitud-individuos* 1)))))
(list (append (subseq individuo1 0 posicion-cruce)
(subseq individuo2 posicion-cruce))
(append (subseq individuo2 0 posicion-cruce)
(subseq individuo1 posicion-cruce)))))
x
Ejemplo (función cuadrado):
> (cruza-pareja ’(1 1 1 1 1 1 1 1 1 1) ’(0 0 0 0 0 0 0 0 0 0))
((1 1 1 1 1 1 0 0 0 0) (0 0 0 0 0 0 1 1 1 1)
> (cruza-pareja ’(1 0 1 0 1 0 1 0 1 0) ’(1 1 1 1 1 0 0 0 0 0))
((1 0 1 0 1 0 0 0 0 0) (1 1 1 1 1 0 1 0 1 0))
x
Mutación probabilı́stica de un gen:
(defun muta-individuo (ind)
(if (endp ind)
nil
(cons (if (< (random 100) (* *probabilidad-mutacion* 100))
(crea-gen)
(first ind))
(muta-individuo (rest ind)))))
x
Ejemplo (función cuadrado, con probabilidad de mutación 0,1):
> (muta-individuo ’(1 1 1 1 1 1 1 1 1 1))
(1 1 1 1 1 1 1 1 1 1)
> (muta-individuo ’(1 1 1 1 1 1 1 1 1 1))
(1 1 0 1 1 1 1 1 1 1)
x
Obtención de una nueva generación
(defun nueva-generacion (g)
(supervivientes
(une-dos-generaciones
(muta (cruza (selecciona-padres g)))
g)))
x
Selección de padres
(defun selecciona-padres (g)
(let ((mejores (subseq g 0 *numero-mejores*))
(numero-restantes-padres (- *numero-total-padres*
*numero-mejores*))
(restantes (subseq g *numero-mejores*)))
(append mejores
(escoge-aleatoriamente numero-restantes-padres restantes))))
x
Cruce de padres
(defun cruza (g)
(cruza-de-dos-en-dos (reordena-aleatoriamente g)))
x
Mutación de la población
(defun muta (g)
(if (endp g)
’()
(cons (muta-individuo (first g)) (muta (cdr g)))))
x
Supervivencia de los mejores
(defun une-dos-generaciones (g1 g2)
(append g1 g2))
x
Ejemplo de obtención de una nueva generación
(en el problema de la función cuadrado):
> (setf poblacion-inicial
(poblacion-inicial-ordenada
*numero-total-individuos*
*longitud-individuos*))
((1 1 0 1 1 0 0 0 0 1) (1 1 1 1 1 0 0 0 0 1)
(0 1 1 1 0 1 1 0 0 1) (1 1 1 1 0 1 1 1 0 1)
(1 1 0 1 0 1 0 1 1 1) (0 1 1 1 0 1 0 1 1 1)
(1 1 0 1 1 1 0 1 1 1) (1 1 0 1 1 1 0 1 1 1)
(0 0 0 1 0 0 1 1 1 1) (1 1 0 0 0 1 1 1 1 1))
> (setf poblacion-siguiente
(nueva-generacion poblacion-inicial))
((1 0 0 1 1 0 0 1 1 0) (0 0 0 1 0 0 1 1 1 0)
(1 0 0 1 0 0 1 1 1 0) (1 1 0 1 1 0 1 1 1 0)
(1 1 1 0 0 1 1 1 1 0) (0 0 0 0 1 1 1 1 1 0)
(1 0 0 0 1 1 1 1 1 0) (1 1 1 0 1 1 1 1 1 0)
(1 1 1 0 1 1 1 1 1 0) (1 1 0 1 1 1 1 1 1 0))
x
Mejora de la población:
Media valores individuos poblacion-inicial = 545886.3
Valor mejor individuo poblacion-inicial = 290521
Media valores individuos poblacion-siguiente = 230295.2
Valor mejor individuo poblacion-siguiente = 167281
x
Genes y longitud de los individuos
(defparameter *genes*
’(almeria cadiz cordoba granada huelva jaen malaga sevilla))
(defparameter *longitud-individuos* 8)
x
Decodificación
(defun decodifica (x) x)
x
Criterio de parada:
(defun es-optimo (x)
(declare (ignore x))
nil)
x
La codificación permite ciudades repetidas
u La función objetivo penaliza las repeticiones
x
Función objetivo:
u Penalización por camino incompleto
x
Una evaluación
;;; (algoritmo-genetico 100 50 0.75 0.6 0.05)
;;; Mejor individuo:
;;; (HUELVA SEVILLA CORDOBA GRANADA ALMERIA JAEN MALAGA CADIZ)
;;; Valor: 2015.8258
x
Varios intentos
(defun intentos (n-intentos)
(loop for i from 1 to n-intentos do
(let ((res (algoritmo-genetico 100 50 0.75 0.6 0.05)))
(format t "~& Experimento: ~a, Mejor individuo: ~a, Valor: ~a"
i res (f-objetivo res)))))
;; Experimento: 84,
;; Mejor individuo:
;; (MALAGA GRANADA ALMERIA JAEN CORDOBA SEVILLA HUELVA CADIZ),
;; Valor: 1859.8511 (Solución óptima)
IA-I 2002–2003 Cc Ia Técnicas avanzadas de búsqueda 7.46
Representación problema cuadrado mágico
x
Colocar en un cuadrado n × n los números naturales de 1 a n2, de tal
manera que las filas, las columnas y las diagonales principales sumen los
mismo
x
Una solución para n = 3:
4 3 8
9 5 1
2 7 6
x
Soluciones representadas como listas de números entre 1 y n2
u Admitimos repeticiones
u La función objetivo penaliza las repeticiones
x
Problema parametrizado:
(defvar *n*)
(defun asigna-suma ()
(defparameter *suma*
(/ (* *n* (+ (expt *n* 2) 1)) 2)))
(defun asigna-genes ()
(defparameter *genes*
(loop for i from 1 to (expt *n* 2)
collect i)))
(defun asigna-longitud-individuos ()
(defparameter *longitud-individuos* (expt *n* 2)))
x
Criterio de parada:
(defun no-repetidos (l)
(if (endp l)
t
(and (not (member (first l) (rest l)))
(no-repetidos (rest l)))))
(defun todos-suman (n l)
(if (endp l)
t
(and (= n (apply #’+ (first l))) (todos-suman n (rest l)))))
x
Función objetivo:
(defun suma-diferencias (l)
(apply #’+ (mapcar #’(lambda (s) (abs (- s *suma*))) l)))
(defun ocurrencias (x l)
(cond ((endp l) 0)
((equal x (first l)) (1+ (ocurrencias x (rest l))))
(t (ocurrencias x (rest l)))))
x
Caso n = 3
;;; Soluciones N=3 (se encuentra fácilmente)
;;; ((8 1 6) (3 5 7) (4 9 2))
x
Caso n = 4
;;; Soluciones N=4
;;; Encontrado con
;;; (algoritmo-genetico 1000 500 0.75 0.6 0.1)
;;; en la generación 125:
;;; ((7 14 9 4) (16 2 5 11) (1 15 12 6) (10 3 8 13))
7 14 9 4
16 2 5 11
1 15 12 6
10 3 8 13
x
Existen muchas variantes del algoritmo descrito
x
Variantes en el cruce
u Cruce multipunto
x
Variantes en la selección de los padres
u Cada individuo i es seleccionado para ser padre con probabilidad proporcional a su
valor de la función objetivo:
Fobj (i)
P (i) = P
j Fobj (j)
u Ruleta probabilı́stica