Sei sulla pagina 1di 54

Inteligencia Artificial I Curso 2002–2003

Tema 7: Técnicas avanzadas de


búsqueda

José A. Alonso Jiménez


Francisco J. Martı́n Mateos
José L. Ruiz Reina

Dpto. de Ciencias de la Computación e Inteligencia Artificial

Universidad de Sevilla

IA-I 2002–2003 Cc Ia Técnicas avanzadas de búsqueda 7.1


Introducción

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

IA-I 2002–2003 Cc Ia Técnicas avanzadas de búsqueda 7.3


Problema del viajante

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

IA-I 2002–2003 Cc Ia Técnicas avanzadas de búsqueda 7.4


Caracterı́sticas de algunos problemas de optimizació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

IA-I 2002–2003 Cc Ia Técnicas avanzadas de búsqueda 7.5


Representación del problema del viajante

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*))

IA-I 2002–2003 Cc Ia Técnicas avanzadas de búsqueda 7.6


Representación del problema del viajante

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

IA-I 2002–2003 Cc Ia Técnicas avanzadas de búsqueda 7.7


Representación del problema del viajante

x
Generación de un sucesor (aleatorio):
(defparameter *lista-indices*
(loop for i from 0 to (- (length *ciudades*) 1) collect i))

(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))))

IA-I 2002–2003 Cc Ia Técnicas avanzadas de búsqueda 7.8


Problema del viajante

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))))

(defun distancia (c1 c2)


(sqrt (+ (expt (- (abscisa c1) (abscisa c2)) 2)
(expt (- (ordenada c1) (ordenada c2)) 2))))

(defun abscisa (ciudad)


(first (second (assoc ciudad *coordenadas-ciudades*))))

(defun ordenada (ciudad)


(second (second (assoc ciudad *coordenadas-ciudades*))))

(defun suma-distancias (camino)


(if (endp (rest camino))
0
(+ (distancia (first camino) (second camino))
(suma-distancias (rest camino)))))

(defun longitud-viaje (camino)


(+ (distancia (first (last camino)) (first camino))
(suma-distancias camino)))

(defun f-objetivo (estado)


(longitud-viaje estado))

IA-I 2002–2003 Cc Ia Técnicas avanzadas de búsqueda 7.9


Elementos de la representación

(GENERA-ESTADO-INICIAL)
(GENERA-SUCESOR ESTADO)
(F-OBJETIVO ESTADO)

IA-I 2002–2003 Cc Ia Técnicas avanzadas de búsqueda 7.10


Problema del cuadrado de puntos

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)

IA-I 2002–2003 Cc Ia Técnicas avanzadas de búsqueda 7.11


Problema del cuadrado de puntos

x
Parámetros del problema
(defvar *lado*)
(defvar *puntos*)

(defun cuadrado (n)


(setf *lado* n)
(crea-puntos)
(crea-lista-indices))

(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)))

IA-I 2002–2003 Cc Ia Técnicas avanzadas de búsqueda 7.12


Problema del cuadrado de puntos

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))))

IA-I 2002–2003 Cc Ia Técnicas avanzadas de búsqueda 7.13


Problema del cuadrado de puntos

x
Función objetivo
(defun distancia (p1 p2)
(sqrt (+ (expt (- (car p1) (car p2)) 2)
(expt (- (cdr p1) (cdr p2)) 2))))

(defun suma-distancias (camino)


(if (endp (rest camino))
0
(+ (distancia (first camino) (second camino))
(suma-distancias (rest camino)))))

(defun distancia-viaje (camino)


(+ (distancia (first camino) (first (last camino)))
(suma-distancias camino)))

(defun f-objetivo (estado)


(distancia-viaje estado))

IA-I 2002–2003 Cc Ia Técnicas avanzadas de búsqueda 7.14


Busqueda en escalada aleatoria

1. Crear las siguientes variables locales


1.1 ACTUAL (para almacenar el estado actual), cuyo valor inicial es
un estado aleatoriamente generado por la función GENERA-ESTADO-INICIAL.
1.2 VECINO (para almacenar un estado vecino de ACTUAL), cuyo valor
inicial es un estado generado por la función GENERA-SUCESOR.
1.3 VALOR-ACTUAL (para almacenar el valor de ACTUAL).
1.4 VALOR-VECINO (para almacenar el valor de VECINO).

2. Mientras VALOR-VECINO sea menor que VALOR-ACTUAL, hacer que ACTUAL y


VALOR-ACTUAL sean repectivamente VECINO y VALOR-VECINO, y generar,
usando GENERA-SUCESOR, nuevos valores para VECINO y VALOR-VECINO.

3. Devolver ACTUAL y VALOR-ACTUAL

IA-I 2002–2003 Cc Ia Técnicas avanzadas de búsqueda 7.15


Busqueda en escalada aleatoria

(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

IA-I 2002–2003 Cc Ia Técnicas avanzadas de búsqueda 7.16


Busqueda en escalada aleatoria

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

IA-I 2002–2003 Cc Ia Técnicas avanzadas de búsqueda 7.17


Escalada con reinicio aleatorio
1. Crear las siguientes variables locales
1.1 MEJOR-ESTADO (para almacenar el mejor estado obtenido hasta el
momento) cuyo valor inicial está generado por GENERA-ESTADO-INICIAL
1.2 MEJOR-VALOR (para almacenar el valor de MEJOR-ESTADO)

2. Hacer un número de dado de ITERACIONES:


2.1 Realizar una escalada aleatoria.
2.2 Si el estado obtenido tiene un valor mejor que MEJOR-VALOR,
actualizar MEJOR-ESTADO y MEJOR-VALOR con el nuevo estado y valor
obtenido.

3. Devolver MEJOR-ESTADO y MEJOR-VALOR

IA-I 2002–2003 Cc Ia Técnicas avanzadas de búsqueda 7.18


Escalada con reinicio aleatoria
(defun escalada-con-reinicio-aleatorio (iteraciones)
(let* ((mejor-estado (genera-estado-inicial)) ;;; 1.1
(mejor-valor (f-objetivo mejor-estado))) ;;; 1.2
(loop for i from 1 to iteraciones do ;;; 2
(let* ((resultado (escalada-aleatoria)) ;;; 2.1
(estado (first resultado))
(valor (second resultado)))
(when (< valor mejor-valor) ;;; 2.2
(setf mejor-estado estado mejor-valor valor))))
(list mejor-estado mejor-valor))) ;;; 3

IA-I 2002–2003 Cc Ia Técnicas avanzadas de búsqueda 7.19


Escalada con reinicio aleatoria

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)

IA-I 2002–2003 Cc Ia Técnicas avanzadas de búsqueda 7.20


Enfriamiento simulado

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

u Después de estabilizarse, se vuelve a bajar la tempe-


ratura, y el sistema se estabiliza nuevamente en un
estado de menor energı́a
x
Programa de enfriamiento
u Al princio (T grande) mayor probabilidad de acepta-
ción de soluciones candidatas (diversificación)
u Al final (T pequeña), se aceptan pocas soluciones can-
didatas (intensificación)

IA-I 2002–2003 Cc Ia Técnicas avanzadas de búsqueda 7.21


Enfriamiento simulado: parámetros

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

IA-I 2002–2003 Cc Ia Técnicas avanzadas de búsqueda 7.22


Enfriamiento simulado
1. Crear las siguiente variables locales:
1.1 TEMPERATURA (para almacenar la temperatura actual),
inicialmente con la temperatura inicial de entrada.
1.2 ACTUAL (para almacenar el estado actual), cuyo valor
inicial es un estado generado por la función
GENERA-ESTADO-INICIAL.
1.3 VALOR-ACTUAL (para almacenar el valor de ACTUAL).
1.4 MEJOR (para almacenar el valor del mejor estado encontrado
hasta el momento), inicialmente ACTUAL.
1.5 VALOR-MEJOR (para almacenar el valor de mejor).

2. Iterar un número de veces igual a N_ENFRIAMIENTOS lo siguiente:

2.1 Iterar un número de veces igual a N_ITERACIONES lo siguiente:

2.1.1 Crear las siguientes variables locales:


2.1.1.1 CANDIDATA, una solución vecina de ACTUAL,
generada por GENERA-SUCESOR.
2.1.1.2 VALOR-CANDIDATA, el valor de CANDIDATA.
2.1.1.3 INCREMENTO, la diferencia entre VALOR-CANDIDATA y
VALOR-ACTUAL

2.1.2 Cuando INCREMENTO es negativo, o se acepta


probabilı́sticamente la solución candidata, hacer ACTUAL y
VALOR-ACTUAL iguales a VECINA y VALOR-VECINA, respectivamente.

2.1.3 Si VALOR-ACTUAL es mejor que VALOR-MEJOR, actualizar MEJOR y


VALOR-MEJOR con con ACTUAL y VALOR-ACTUAL, respectivamente.

2.2 Disminuir TEMPERATURA usando FACTOR-DESCENSO

3. Devolver MEJOR y VALOR-MEJOR

IA-I 2002–2003 Cc Ia Técnicas avanzadas de búsqueda 7.23


Enfriamiento simulado
(defun enfriamiento-simulado (t-inicial
factor-descenso
n-enfriamientos
n-iteraciones)
(let* ((temperatura t-inicial) ;;; 1.1
(actual (genera-estado-inicial)) ;;; 1.2
(valor-actual (f-objetivo actual)) ;;; 1.3
(mejor actual) ;;; 1.4
(valor-mejor (f-objetivo actual))) ;;; 1.5
(loop for i from 1 to n-enfriamientos do ;;; 2
(loop for j from 1 to n-iteraciones do ;;; 2.1
(let* ((candidata
(genera-sucesor actual))
(valor-candidata
(f-objetivo candidata))
(incremento
(- valor-candidata valor-actual)))
(when (or (< incremento 0)
(< (/ (random 1001) 1000.0)
(exp (max (/ (- incremento)
temperatura) -80))))
(setf actual candidata
valor-actual valor-candidata)
(when (< valor-actual valor-mejor)
(setf mejor actual
valor-mejor valor-actual)))))
(setf temperatura ;;; 2.2
(* factor-descenso temperatura)))
(list mejor valor-mejor))) ;;; 3

IA-I 2002–2003 Cc Ia Técnicas avanzadas de búsqueda 7.24


Enfriamiento simulado

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

IA-I 2002–2003 Cc Ia Técnicas avanzadas de búsqueda 7.25


Algoritmos genéticos: evolución natural

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

IA-I 2002–2003 Cc Ia Técnicas avanzadas de búsqueda 7.26


Algoritmos genéticos

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

IA-I 2002–2003 Cc Ia Técnicas avanzadas de búsqueda 7.27


Operaciones genéticas

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

IA-I 2002–2003 Cc Ia Técnicas avanzadas de búsqueda 7.28


Algoritmo genético (pseudocódigo)

t := 0
Inicia-Población P(t)
Evalúa-Población P(t)

Mientras no Fin hacer


P’ := Selecciona-Padres P(t)
P’’ := Cruza P’
P’’’ := Muta P’’
Evalua-Población P’’’
P(t+1) := Selecciona-Mejores P’’’,P(t)
t:= t+1
Fin-Mientras

Devolver el mejor de P(t)

IA-I 2002–2003 Cc Ia Técnicas avanzadas de búsqueda 7.29


Parámetros del algoritmo genético

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

IA-I 2002–2003 Cc Ia Técnicas avanzadas de búsqueda 7.30


Representación problema función cuadrado
x
Objetivo: encontrar el mı́nimo de la función f (x) = x2 en [0, 210) ∩ N
u Los cromosomas representan números en binario (inverso)
u Genes y longitud de los cromosomas:

(defparameter *genes* ’(0 1))

(defparameter *longitud-individuos* 10)


x
Función de decodificación (fenotipo):
(defun decodifica (x)
(if (endp x)
0
(+ (first x) (* 2 (decodifica (rest x))))))

;;; Ejemplo:
;;; > (decodifica ’(1 0 0 1 0 0 0 1 0 0))
;;; 137

IA-I 2002–2003 Cc Ia Técnicas avanzadas de búsqueda 7.31


Representación problema función cuadrado

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)

IA-I 2002–2003 Cc Ia Técnicas avanzadas de búsqueda 7.32


Algoritmo genético (parámetros)

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*))

(defun individuo-aleatorio (num-genes)


(if (= num-genes 0)
’()
(cons (crea-gen) (individuo-aleatorio (1- num-genes)))))

(defun poblacion-inicial (num-individuos num-genes)


(if (= num-individuos 0)
’()
(cons (individuo-aleatorio num-genes)
(poblacion-inicial (1- num-individuos) num-genes))))

IA-I 2002–2003 Cc Ia Técnicas avanzadas de búsqueda 7.34


Generación de la población inicial

x
Ordenación de la población
(defun evalua-cromosoma (cromosoma)
(f-objetivo (decodifica cromosoma)))

(defun ordena-poblacion-por-valor (poblacion)


(sort poblacion #’< :key #’evalua-cromosoma))

(defun poblacion-inicial-ordenada (num-individuos num-genes)


(ordena-poblacion-por-valor
(poblacion-inicial num-individuos num-genes)))
x
Ejemplo (función cuadrado):
> (poblacion-inicial-ordenada 10 10)
((0 0 1 0 1 1 0 0 0 0) (0 0 1 0 1 0 1 1 0 0) (1 1 1 0 1 1 1 1 0 0)
(0 0 1 1 0 0 1 1 1 0) (1 1 0 1 1 0 0 1 0 1) (1 1 0 1 1 1 0 1 0 1)
(0 0 0 0 1 0 1 1 0 1) (1 0 0 0 1 0 0 0 1 1) (0 1 1 1 1 0 1 0 1 1)
(0 0 1 1 0 1 1 0 1 1))
IA-I 2002–2003 Cc Ia Técnicas avanzadas de búsqueda 7.35
Cruces

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))

IA-I 2002–2003 Cc Ia Técnicas avanzadas de búsqueda 7.36


Mutaciones

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)

IA-I 2002–2003 Cc Ia Técnicas avanzadas de búsqueda 7.37


Métodos de reproducción

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))))

IA-I 2002–2003 Cc Ia Técnicas avanzadas de búsqueda 7.38


Métodos de reproducción

x
Cruce de padres
(defun cruza (g)
(cruza-de-dos-en-dos (reordena-aleatoriamente g)))

(defun reordena-aleatoriamente (l)


(escoge-aleatoriamente (length l) l))

(defun cruza-de-dos-en-dos (g)


(if (endp g)
nil
(append (cruza-pareja (first g) (second g))
(cruza-de-dos-en-dos (cddr g)))))

IA-I 2002–2003 Cc Ia Técnicas avanzadas de búsqueda 7.39


Métodos de reproducción

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))

(defun supervivientes (poblacion)


(subseq (ordena-poblacion-por-valor poblacion)
0 *numero-total-individuos*))

IA-I 2002–2003 Cc Ia Técnicas avanzadas de búsqueda 7.40


Métodos de reproducción

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

IA-I 2002–2003 Cc Ia Técnicas avanzadas de búsqueda 7.41


Algoritmo genético

(defun algoritmo-genetico (num-generaciones


numero-total-individuos
proporcion-cruces
proporcion-mejores
probabilidad-mutacion)
(inicia-variables-globales numero-total-individuos
proporcion-cruces
proporcion-mejores
probabilidad-mutacion)
(let* ((generacion-actual
(poblacion-inicial-ordenada
*numero-total-individuos*
*longitud-individuos*))
(mejor-individuo (first generacion-actual))
(n-gen 1)
(final (or (es-optimo mejor-individuo)
(> n-gen num-generaciones))))
(loop until final do
(setf generacion-actual
(nueva-generacion generacion-actual)
mejor-individuo (first generacion-actual)
n-gen (1+ n-gen)
final (or (es-optimo mejor-individuo)
(> n-gen num-generaciones))))
(decodifica mejor-individuo)))

IA-I 2002–2003 Cc Ia Técnicas avanzadas de búsqueda 7.42


Ejemplo (función cuadrado)

> (load "funcion-cuadrado")


...
> (algoritmo-genetico-con-salida 20 10 0.75 0.6 0.1)
Generacion: 1. Media: 361954.9, Mejor: (0 1 1 0 0 1 0 0 0 0), Valor: 1444
Generacion: 2. Media: 79730.6, Mejor: (0 1 1 0 0 1 0 0 0 0), Valor: 1444
Generacion: 3. Media: 22278.6, Mejor: (0 1 1 0 0 1 0 0 0 0), Valor: 1444
Generacion: 4. Media: 3537.7, Mejor: (1 1 1 1 0 0 0 0 0 0), Valor: 225
Generacion: 5. Media: 1597.3, Mejor: (0 0 1 1 0 0 0 0 0 0), Valor: 144
Generacion: 6. Media: 912.8, Mejor: (0 1 0 0 0 0 0 0 0 0), Valor: 4
Generacion: 7. Media: 345.3, Mejor: (0 1 0 0 0 0 0 0 0 0), Valor: 4
Generacion: 8. Media: 60.7, Mejor: (0 1 0 0 0 0 0 0 0 0), Valor: 4
Generacion: 9. Media: 14.0, Mejor: (0 1 0 0 0 0 0 0 0 0), Valor: 4
Generacion: 10. Media: 4.5, Mejor: (0 1 0 0 0 0 0 0 0 0), Valor: 4
Generacion: 11. Media: 3.7, Mejor: (1 0 0 0 0 0 0 0 0 0), Valor: 1
Generacion: 12. Media: 3.4, Mejor: (1 0 0 0 0 0 0 0 0 0), Valor: 1
Generacion: 13. Media: 2.4, Mejor: (0 0 0 0 0 0 0 0 0 0), Valor: 0
0

IA-I 2002–2003 Cc Ia Técnicas avanzadas de búsqueda 7.43


Representación problema del viajante

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)

IA-I 2002–2003 Cc Ia Técnicas avanzadas de búsqueda 7.44


Representación problema del viajante

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

(defun penalizacion-por-incompleto (camino)


(* 100
(+ (length (set-difference camino *genes*))
(length (set-difference *genes* camino)))))

u Combinación de distancia con penalización

(defun f-objetivo (x)


(+ (* 2 (distancia-viaje x))
(* 50 (penalizacion-por-incompleto x))))

IA-I 2002–2003 Cc Ia Técnicas avanzadas de búsqueda 7.45


Solución al problema del viajante

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

IA-I 2002–2003 Cc Ia Técnicas avanzadas de búsqueda 7.47


Problema cuadrado mágico

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)))

(defun cuadrado-magico-genetico (n)


(setf *n* n)
(asigna-suma)
(asigna-genes)
(asigna-longitud-individuos)
(list ’cuadrado-magico-genetico n))

IA-I 2002–2003 Cc Ia Técnicas avanzadas de búsqueda 7.48


Problema cuadrado mágico
x
Decodificación
(defun decodifica (l)
(if (endp l)
’()
(cons (subseq l 0 *n*)
(decodifica (subseq l *n*)))))

;;; Ejemplo (para *n* igual a 3):


;;; > (decodifica ’(1 7 5 3 2 8 4 6 9))
;;; ((1 7 5) (3 2 8) (4 6 9))
x
Columnas y diagonales
(defun columnas (l)
(loop for i from 0 to (- *n* 1)
collect
(mapcar #’(lambda (x) (nth i x)) l)))

(defun diagonales (l)


(let ((lista-posiciones
(loop for i from 0 to (- *n* 1) collect i)))
(list (mapcar #’(lambda (i x) (nth i x))
lista-posiciones l)
(mapcar #’(lambda (i x) (nth i x))
(reverse lista-posiciones) l))))

;;; Ejemplo (para *n* igual a 3):


;;; > (columnas ’((1 7 5) (3 2 8) (4 6 9)))
;;; ((1 3 4) (7 2 6) (5 8 9))
;;; > (diagonales ’((1 7 5) (3 2 8) (4 6 9)))
;;; ((1 2 9) (5 2 4))
IA-I 2002–2003 Cc Ia Técnicas avanzadas de búsqueda 7.49
Problema cuadrado mágico

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)))))

(defun es-optimo (m)


(let ((l (decodifica m)))
(and (todos-suman *suma* (append l (columnas l) (diagonales l)))
(no-repetidos m))))

IA-I 2002–2003 Cc Ia Técnicas avanzadas de búsqueda 7.50


Problema cuadrado mágico

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)))))

(defun numero-repeticiones (l)


(if (endp l)
0
(+ (ocurrencias (first l) (rest l)) (numero-repeticiones (rest l)))))

(defun f-objetivo (x)


(* (suma-diferencias (suma-hileras (append x (columnas x) (diagonales x))))
(1+ (numero-repeticiones (apply #’append x)))))

IA-I 2002–2003 Cc Ia Técnicas avanzadas de búsqueda 7.51


Solución al cuadrado mágico

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

IA-I 2002–2003 Cc Ia Técnicas avanzadas de búsqueda 7.52


Variantes

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

IA-I 2002–2003 Cc Ia Técnicas avanzadas de búsqueda 7.53


Bibliografı́a
x
Rich, E. y Knight, K. Inteligencia artificial (segunda edición)
(McGraw–Hill Interamericana, 1994).
u Cap. 3: “Técnicas de búsqueda heurı́stica”.
x
Russell, S. y Norvig, P. Artificial Intelligence (A Modern Approach)
(Prentice–Hall, 1995).
u Cap. 4 “Informed search methods”.
x
Goldberg, D.E. Genetic Algorithms (in Search, Optimization & Ma-
chine Learning) (Addison–Wesley, 1989).
x
Grillmeyer, O. Exploring Computer Science with Scheme (Springer,
1999).
u Cap. 16 “Soft Computing: Fuzzy Logic, Neural Networks and Genetic Algorithms”.

IA-I 2002–2003 Cc Ia Técnicas avanzadas de búsqueda 7.54

Potrebbero piacerti anche