En esta unidad el estudiante podrá vincular la práctica y la teoría relacionada con los sistemas de búsqueda en una inteligencia artificial.
Debido a que la búsqueda es el núcleo de muchos procesos inteligentes, es adecuado estructurar los programas de IA de forma que se facilite describir y desarrollar el proceso de búsqueda. Los sistemas de producción proporcionan tales estructuras.
Un sistema de producción consiste en:
El proceso de solución del problema puede modelarse como un sistema de producción. El problema que se plantea es escoger la estructura de control apropiada para el sistema de producción (base de datos, hechos, conocimiento o información sobre el problema, conjunto de reglas o aplicador) con el fin de que el proceso de búsqueda sea lo más eficiente posible.
Existen varias taxonomías de los sistemas de producción / búsqueda / estrategia de control (J. Molina, C. Torres, 2008):
Al finalizar la unidad, el alumno podrá vincular la práctica y la teoría relacionada con los sistemas de búsqueda en una inteligencia artificial.
¡Bienvenidos a esta unidad!
La búsqueda en inteligencia pretende resolver los problemas o tareas complejas a través de algoritmos que garanticen la solución del problema o tarea. Los sistemas o las técnicas de búsqueda son una serie de esquemas de representación del conocimiento, que mediante diversos algoritmos nos permite resolver problemas desde el punto de vista de lA.
A continuación se profundiza en las diferentes técnicas de búsqueda:
2.2 Si la profundidad de m es igual a lp regresar a 2.1. En caso contrario
continuar. 2.3 Expandir m (generar todos los sucesores). Para cada operador
aplicable y cada forma de aplicación:
1. Crear una lista de nodos
llamada ABIERTA e “inicializarla”
con un
único nodo raíz, al que se le asigna el estado inicial del
problema.
2. Hasta que ABIERTA esté vacía o se encuentre una meta o
se
devuelva fallo realizar las siguientes acciones:
2.1 Si ABIERTA está vacía terminar con fallo: en
caso
contrario continuar.
2.2 Extraer el primer nodo de ABIERTA y llamar a ese nodo m.
2.3 Si la
profundidad de m es igual a lp o si m no tiene más
sucesores posibles (que no hayan sido examinados
anteriormente) eliminarlo de
ABIERTA y regresar a regresar a 2. En caso contrario continuar.
2.4
Generar un
“nuevo” sucesor m ́ de m. e introducirlo al
principio de ABIERTA. , creando un puntero a m, y señalar
que dicha
rama ya ha
sido considerada.
2.4.1 Si m ́ es meta, abandonar el proceso iterativo iniciado
en el
paso 2
devolviendo el camino de la solución, que se obtiene recorriendo
los punteros de sus
antepasados.
2.4.2 Si m
́se encuentra en un callejón sin salida
eliminarlo de ABIERTA. Se continúa el proceso iterativo en el
paso 2.
También se denominan técnicas de búsqueda ciega, porque realizan una búsqueda sistemática y objetiva (en el sentido de que el control del proceso no depende del problema concreto que se esté resolviendo).
Por el contrario las técnicas de búsqueda heurística realizan una búsqueda informada e intentan optimizar dicho proceso eligiendo los caminos que a priori van a suponer un menor coste.
Es aquella estrategia de control en la que se revisan todas las trayectorias de una determinada longitud antes de crear una trayectoria más larga. Es decir, no se genera ningún nodo de nivel N hasta que no se hayan obtenido todos los del nivel N-1.
m
.
m
(generar todos los sucesores). Para cada operador aplicable y cada forma de
aplicación:
m
, obtener un nuevo estado y crear un puntero que
permita saber que su predecesor es m
m
- cuando no se
haya encontrado una meta- se continúa el proceso iterativo en el paso 2).
Ventajas: si el problema tiene una solución este procedimiento garantiza el encontrarla. Si hubiera varias soluciones se obtiene la de menor coste (la óptima), es decir, la que requiere un menor número de pasos (si consideramos un coste uniforme de aplicación de los operadores)
Desventajas: si el nivel de profundidad asociado a la solución es significativamente menor que el factor de ramificación se expandirían demasiados nodos inútilmente. Por otro lado la principal desventaja de este método es el espacio de almacenamiento requerido. Esto lo hace prácticamente inviable para problemas complejos, como suelen ser los del mundo real.
Es aquél procedimiento de control en el que se centra en expandir un único camino desde la raíz. En el caso de llegar a un callejón sin salida se retrocede hasta el nodo más cercano desde donde se puede tomar una ruta alternativa para poder seguir avanzando.
Para llevar a cabo este tipo
de búsqueda debe utilizarse una estructura de tipo pila (LIFO - Last-In, First-Out) que vaya
almacenando los nodos generados. Suele establecerse el llamado límite de exploración (lp
),
que marca la máxima longitud que puede alcanzar cualquier camino desde la
raíz durante el proceso de búsqueda (J. Molina, C. Torres, 2008):
m
.
m
es igual a lp
o si m
no tiene más
sucesores posibles (que no hayan sido examinados
anteriormente), eliminarlo de ABIERTA y regresar al paso 2. En caso contrario,
continuar.
m
(generar todos los sucesores). Para cada operador aplicable y cada forma de
aplicación:
m
, obtener un nuevo estado y crear un puntero que permita
saber que su predecesor es m
.
m
es meta, abandonar el
proceso iterativo señalado en 2.1 devolviendo el camino de la solución que se
obtiene recorriendo los punteros de sus antepasados.
m
se encuentra en un
callejón sin salida eliminarlo de ABIERTA y continuar en 2.2
Ventajas: la principal ventaja de esta algoritmo radica en el reducido valor de su complejidad espacial. Cuando existen múltiples soluciones posibles la eficiencia del algoritmo aumenta.
Desventajas: la dificultad estriba en el tiempo requerido. El algoritmo puede dedicarse a recorrer un camino demasiado largo que no conduzca a ninguna solución. Es más, si no se guarda constancia de los nodos que forman el camino recorrido se podría caer en ciclos y el proceso no acabaría.
lp
)
El problema por tanto es
determinar cuál debe ser lp
. Si éste es inferior a la longitud real del
camino de la solución, ésta nunca se encontraría, y si es mucho mayor sería
ineficiente. Esta es la razón por la que lp
debería llamarse límite de
exploración.
Es una técnica que a diferencia de los algoritmos en amplitud y en profundidad (que consideran todos los sucesores) solamente expande un sucesor en cada iteración, restringiendo por lo tanto el espacio de estados considerado.
Cuanto mejor sea el criterio para limitar el número de estados considerados más eficiente será el proceso de búsqueda.
Es decir, es como el recorrido en profundidad pero nos ahorramos tener que expandir todos los nodos para obtener sus sucesores. El camino sigue avanzando por ese sucesor, y si nos encontramos con un callejón sin salido retrocedemos hasta el primer antepasado desde el que todavía partan caminos inexplorados.
(Nota: El texto original no proporciona los pasos detallados para este algoritmo. Se recomienda añadir los pasos aquí para una explicación completa.)
Ventajas: la principal ventaja de esta algoritmo respecto al de profundidad es la de necesitar un menor espacio de almacenamiento. Sólo hay que recordar en cada instante un sucesor del nodo seleccionado. Otra ventaja es que no se generan las ramas del árbol que se encuentran después (a la derecha) de la solución.
Desventajas:
Vuelve a ser el problema determinar cuál debe ser lp
. Para conocer su valor
deberíamos saber de antemano en qué nivel se encuentra la solución(J.
Molina, C. Torres, 2008):.
Las técnicas de búsqueda heurística disponen de alguna información sobre la proximidad de cada estado a un estado objetivo, lo que permite explorar en primer lugar los caminos más prometedores.
Las características de las técnicas heurísticas:
En general, las técnicas heurísticas son preferibles a los métodos no informados en la solución de problemas difíciles para los que una búsqueda exhaustiva necesitaría un tiempo demasiado grande. Esto cubre prácticamente la totalidad de los problemas reales que interesan en Inteligencia Artificial.
La información del problema concreto que estamos intentando resolver se suele expresar por medio de heurísticas.
El concepto de heurística es difícil de aprender. Newell, Shaw y Simon en 1963 dieron la siguiente definición: "Un proceso que puede resolver un problema dado, pero que no ofrece ninguna garantía de que lo hará, se llama una heurística para ese problema".
Si nos planteamos seguir concretando como
aprovechar la información sobre el problema en sistemas de producción, la siguiente
idea consiste en concentrar toda la información heurística en una única
función que se denomina función de evaluación heurística. Se trata de una
función que asocia a cada estado del espacio de estados una cierta cantidad
numérica que evalúa de algún modo lo prometedor que es ese estado para
acceder a un estado objetivo. Habitualmente, se denota esa función por h(e)
.
La función heurística puede tener dos interpretaciones. Por una parte, la función puede ser una estimación de lo próximo que se encuentra el estado de un estado objetivo. Bajo esta perspectiva, los estados de menor valor heurístico son los preferidos. Pero en otros casos puede suceder que lo que convenga sea maximizar esa función.
Veamos ejemplos de heurísticas para algunos problemas concretos. Para el problema del 8-puzzle tenemos la siguientes heurísticas:
x
e y
). La función heurística es la suma de
las distancias de cada una de las casillas (excluyendo la que se encuentra
vacía).
2 |
3 |
|
1 |
8 |
4 |
7 |
6 |
5 |
H = n(Ei) = 2 (1 de la casilla 1 más 1 de la casilla 8)
Ejercicio:
Otra heurística posible para el 8-puzzle, si el
estado objetivo es el recogido en la figura 1, es la siguiente: h(e) = 3 *
seq(e)
, donde seq(e)
cuenta 1 si hay un dígito central en e
y 2 por cada
dígito x
no central que no es seguido (en el sentido de la agujas del reloj)
por su sucesor x+1
(imponemos por convenio que 8 + 1 = 1
).
Distancia (Madrid, Santander) = Distancia(Madrid, Palencia) + Distancia
aérea (Palencia, Santander)
que es más pequeña que la obtenida a través de Cáceres
(Madrid,Santander) = Distancia(Madrid, Cáceres) + Distancia aérea (Cáceres, Santander)
Distancia (Madrid, Santander) = Distancia(Madrid,
Palencia) + Distancia (Palencia, Santander)
Los algoritmos genéticos pertenecen a la computación evolutiva, son considerados también una técnica de inteligencia artificial. A través de millones de años, los organismos han evolucionado biológicamente para sobrevivir y crecer en un mundo cambiante.
Los materiales genéticos de todos los organismos vivos consisten de cromosomas que están divididos en genes; su codificación y desarrollo son considerados un proceso clave en la continuación de las especies. El proceso de selección natural y el sobrevivir de los más aptos son considerados elementos importantes en la evolución, que ha sido estudiada desde el siglo XVII. Los Algoritmos Genéticos están basados en estos aspectos de evolución.
Los algoritmos genéticos utilizan ideas de biología como población de cromosomas, selección natural para selección de pareja, cruza para producción de descendencia y mutación para diversidad. El punto importante de los algoritmos genéticos es la representación de un problema-solución que use un cromosoma de longitud constante o cambiante. La variable representada por la posición es un gen, y su valor se conoce como alelo. Una vez que obtenida la representación (codificado), es decir la manera en que el espacio de soluciones potenciales se transforma en el dominio de trabajo, la metodología de Algoritmos Genéticos puede ser aplicada para alcanzar una buena solución del problema. El codificado más popular por su simplicidad es el binario, donde los alelos son los valores de 0 ó 1. De ser necesario, el codificado basado en valor o de caracteres puede ser usado también. A pesar de que el codificado fijo es popular, los investigadores han usado uno que puede adaptarse para algunos problemas para mejorar los resultados.
El uso de los Algoritmos genéticos está relacionado con el concepto de Optimización, por lo que también es abordada, siendo el objetivo, maximizar el beneficio o minimizar el costo. Adicionalmente se muestran algunas aplicaciones de los algoritmos genéticos: escoger el arreglo de trabajos y de máquinas para minimizar el tiempo de producción, el problema del agente viajero, minimizar la cantidad de merma en el corte de madera, vidrio, entre otros; todos ellos problemas combinatorios que pueden modelarse a través de programación matemática pero que conforme crecen el número de variables no son factibles de resolverse en un tiempo computacional razonable; por lo que resulta interesante uso de los algoritmos genéticos.
Para poder explicar la estructura de los algoritmos genéticos voy a introducir primero algunos términos que serán útiles:
Individuo: los individuos de nuestra población son las posibles soluciones al problema que estamos tratando.
Población: conjunto de individuos (soluciones).
Función fitness o de adaptación: función que evalúa a los individuos y les asigna una puntuación en función de lo buenas soluciones que sean para el problema.
Función de cruce: función que, dados dos individuos, genera dos ‘descendientes’ a partir de la combinación de genes de sus ‘padres’. Esta función se diseña especialmente para el problema que se esté tratando y, por lo general, se encarga de que los hijos sean mejores soluciones que los padres.
Entonces, la estructura de un algoritmo genético es la siguiente:
Los algoritmos genéticos finalizan o bien cuando alcanzan un número de generaciones concreto o cuando cumplen una condición de parada (M, Gestal, 2013).
A continuación, para ejemplificar, diagrama de flujo de un algoritmo genético.
El hombre es el sistema del que mejor se conoce el cómo lleva a cabo las tareas con las que estamos familiarizados y por lo tanto tiene sentido fijarse en él para buscar pistas de cómo crear inteligencia artificial. Si lo que se quiere es escribir programas que simulen el comportamiento humano ante una tarea, la forma de medir el éxito está en que el comportamiento del programa corresponda con el humano, así como mediante distintas clases de experimentos y análisis de protocolos. Cuando se quiere diseñar un programa de IA, se debe intentar especificar tan bien como sea posible el criterio de éxito para el funcionamiento del programa en su particular y restringido dominio.
Para construir un sistema que resuelva un problema específico, es necesario realizar estas cuatro acciones:
Los Algoritmos Genéticos (AGs) son métodos adaptativos que pueden usarse para resolver problemas de búsqueda y optimización. Están basados en el proceso genético de los organismos vivos. A lo largo de las generaciones, las poblaciones evolucionan en la naturaleza de acorde con los principios de la selección natural y la supervivencia de los más fuertes, postulados por Darwin. Por imitación de este proceso, los Algoritmos Genéticos son capaces de ir creando soluciones para problemas del mundo real. La evolución de dichas soluciones hacia valores óptimos del problema depende en buena medida de una adecuada codificación de las mismas.
Un algoritmo genético consiste en una función matemática o una rutina de software que toma como entradas a los ejemplares y retorna como salidas cuáles de ellos deben generar descendencia para la nueva generación.
Versiones más complejas de algoritmos genéticos generan un ciclo iterativo que directamente toma a la especie (el total de los ejemplares) y crea una nueva generación que reemplaza a la antigua una cantidad de veces determinada por su propio diseño. Una de sus características principales es la de ir perfeccionando su propia heurística en el proceso de ejecución, por lo que no requiere largos períodos de entrenamiento especializado por parte del ser humano, principal defecto de otros métodos para solucionar problemas, como los Sistemas Expertos.
La aplicación más común de los algoritmos genéticos ha sido la solución de problemas de optimización, en donde han mostrado ser muy eficientes y confiables. Sin embargo, no todos los problemas pudieran ser apropiados para la técnica, y se recomienda en general tomar en cuenta las siguientes características del mismo antes de intentar usarla:
El primer punto es muy importante, y lo más recomendable es intentar resolver problemas que tengan espacios de búsqueda discretos aunque éstos sean muy grandes. Sin embargo, también podrá intentarse usar la técnica con espacios de búsqueda continuos, pero preferentemente cuando exista un rango de soluciones relativamente pequeño.
La función de aptitud no es más que la función objetivo de nuestro problema de optimización. El algoritmo genético únicamente maximiza, pero la minimización puede realizarse fácilmente utilizando el recíproco de la función maximizante (debe cuidarse, por supuesto, que el recíproco de la función no genere una división por cero). Una característica que debe tener esta función es que tiene ser capaz de "castigar" a las malas soluciones, y de "premiar" a las buenas, de forma que sean estas últimas las que se propaguen con mayor rapidez.
La codificación más común de las soluciones es a través de cadenas binarias, aunque se han utilizado también números reales y letras. El primero de estos esquemas ha gozado de mucha popularidad debido a que es el que propuso originalmente Holland, y además porque resulta muy sencillo de implementar
Como información para completar lo explicado en la secuencia sobre algoritmo genético, el desarrollo de software basados en A.G es importante para terminar de comprender la importancia de este con respecto a las búsquedas y temas anteriores, dirígete a la siguiente presentación en slideshare.
Nombre: Desarrollo de software con algorítmicos genéticos
Link: https://es.slideshare.net/uni_fcys_sistemas/desarollo-de-sofware-con-algoritmos-genticos
El Algoritmo Genético Simple, también denominado Canónico, se necesita una codificación o representación del problema, que resulte adecuada al mismo. Además se requiere una función de ajuste ó adaptación al problema, la cual asigna un número real a cada posible solución codificada. Durante la ejecución del algoritmo de más abajo, los padres deben ser seleccionados para la reproducción, a continuación dichos padres seleccionados se cruzaran generando dos hijos, sobre cada uno de los cuales actuará un operador de mutación.
El resultado de la combinación de las anteriores funciones será un conjunto de individuos (posibles soluciones al problema), los cuales en la evolución del Algoritmo Genético formaran parte de la siguiente población.
BEGIN /* Algoritmo Genético Simple */
Generar una población inicial.
Computar la función de evaluación de cada individuo.
WHILE NOT Terminado DO
BEGIN /* Producir nueva generación */
FOR Tamaño población/2 DO
BEGIN /*Ciclo Reproductivo */
Seleccionar dos individuos de la anterior generación,
para el cruce (probabilidad de selección proporcional
a la función de evaluación del individuo).
Cruzar con cierta probabilidad los dos
individuos obteniendo dos descendientes.
Mutar los dos descendientes con cierta probabilidad.
Computar la función de evaluación de los dos
descendientes mutados.
Insertar los dos descendientes mutados en la nueva generación.
END
IF la población ha convergido THEN Terminado:= TRUE
END
END
INICIO
// Generar población inicial
Generar una población inicial de individuos.
// Evaluar población inicial
Evaluar la función de aptitud (fitness) de cada individuo.
MIENTRAS NO se cumpla la condición de parada HACER:
// Iniciar nueva generación
PARA i = 1 HASTA (Tamaño de la población / 2) HACER:
// Selección
Seleccionar dos individuos de la población actual.
(La probabilidad de selección es proporcional a su aptitud).
// Cruce
Con cierta probabilidad, cruzar los dos individuos seleccionados,
produciendo dos descendientes.
// Mutación
Con cierta probabilidad, mutar cada descendiente.
// Evaluar descendientes
Evaluar la aptitud de los dos descendientes.
// Insertar en nueva generación
Insertar los descendientes en la nueva población.
FIN PARA
// Comprobar convergencia
SI la población ha convergido ENTONCES
Terminar := VERDADERO
FIN MIENTRAS
FIN
Los Algoritmos Genéticos (AGs) son métodos adaptativos que pueden usarse para resolver problemas de búsqueda y optimización. Están basados en el proceso genético de los organismos vivos. A lo largo de las generaciones, las poblaciones evolucionan en la naturaleza de acorde con los principios de la selección natural y la supervivencia de los más fuertes, postulados por Darwin. Por imitación de este proceso, los Algoritmos Genéticos son capaces de ir creando soluciones para problemas del mundo real. La evolución de dichas soluciones hacia valores óptimos del problema depende en buena medida de una adecuada codificación de las mismas.
Un algoritmo genético consiste en una función matemática o una rutina de software que toma como entradas a los ejemplares y retorna como salidas cuáles de ellos deben generar descendencia para la nueva generación.
Versiones más complejas de algoritmos genéticos generan un ciclo iterativo que directamente toma a la especie (el total de los ejemplares) y crea una nueva generación que reemplaza a la antigua una cantidad de veces determinada por su propio diseño. Una de sus características principales es la de ir perfeccionando su propia heurística en el proceso de ejecución, por lo que no requiere largos períodos de entrenamiento especializado por parte del ser humano, principal defecto de otros métodos para solucionar problemas, como los Sistemas Expertos.
La aplicación más común de los algoritmos genéticos ha sido la solución de problemas de optimización, en donde han mostrado ser muy eficientes y confiables. Sin embargo, no todos los problemas pudieran ser apropiados para la técnica, y se recomienda en general tomar en cuenta las siguientes características del mismo antes de intentar usarla:
El primer punto es muy importante, y lo más recomendable es intentar resolver problemas que tengan espacios de búsqueda discretos aunque éstos sean muy grandes. Sin embargo, también podrá intentarse usar la técnica con espacios de búsqueda continuos, pero preferentemente cuando exista un rango de soluciones relativamente pequeño.
La función de aptitud no es más que la función objetivo de nuestro problema de optimización. El algoritmo genético únicamente maximiza, pero la minimización puede realizarse fácilmente utilizando el recíproco de la función maximizante (debe cuidarse, por supuesto, que el recíproco de la función no genere una división por cero). Una característica que debe tener esta función es que tiene ser capaz de "castigar" a las malas soluciones, y de "premiar" a las buenas, de forma que sean estas últimas las que se propaguen con mayor rapidez.
La codificación más común de las soluciones es a través de cadenas binarias, aunque se han utilizado también números reales y letras. El primero de estos esquemas ha gozado de mucha popularidad debido a que es el que propuso originalmente Holland, y además porque resulta muy sencillo de implementar.
Como información para completar lo explicado en la secuencia sobre algoritmo genético, el desarrollo de software basados en A.G es importante para terminar de comprender la importancia de este con respecto a las búsquedas y temas anteriores, dirígete a la siguiente presentación en slideshare.
Nombre: Desarrollo de software con algorítmicos genéticos
Link: https://es.slideshare.net/uni_fcys_sistemas/desarollo-de-sofware-con-algoritmos-genticos