Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Unidad 2 Fase 2 Lilian Osorio
Unidad 2 Fase 2 Lilian Osorio
INTELIGENCIA ARTIFICIAL
Elaborado por:
A.Lilian Osorio
Código: 1014239505
Tutor:
Fernando Rojas
Grupo: 190169_8
TÉCNICAS DE INFERENCIA
Los procesos inferenciales en un problema de satisfacción de restricciones tienen
como objetivo deducir nuevas restricciones, derivadas de las explícitamente
conocidas sobre el problema. Concretamente, estas técnicas borran valores
inconsistentes de los dominios de las variables o inducen restricciones implícitas
entre las variables, obteniendo un nuevo problema de satisfacción de restricciones,
equivalente a la inicial, donde se han hecho explícitas las nuevas restricciones
implícitamente contenidas en el primero. La obtención de estas nuevas restricciones
permite:
1. Obtener respuestas a preguntas sobre el problema, relativas a restricciones
implícitamente existentes entre las variables o sobre sus dominios.
2. Acotar el espacio de soluciones, al haberse eliminado valores inconsistentes,
haciendo más eficientes los procesos de búsqueda.
Ejemplo
Tenemos un problema con tres variables x, y, z, con los dominios {0, 1}, {2, 3} y
{1, 2} respectivamente. Hay dos restricciones en el problema: y < z, x =
y. Si asumimos que la búsqueda mediante backtracking trata de instanciar las
variables en el orden x, y, z, entonces probará todas las posibles 23 combinaciones
de valores para las variables antes de descubrir que no existe solución alguna.
Si miramos la restricción entre la variable y y la variable z podremos ver que no hay
ninguna combinación de valores para las dos variables que satisfagan la restricción.
Si el algoritmo pudiera identificar esta inconsistencia local antes, se evitaría un gran
esfuerzo de búsqueda.
TÉCNICAS HÍBRIDAS
Las técnicas inferenciales pueden incluirse en el propio proceso de búsqueda, dando
lugar a los algoritmos de búsqueda híbridos que analizamos en esta sección. La
complejidad exponencial para resolver un problema de satisfacción de restricciones
dado está principalmente relacionada con el tamaño de los dominios de sus
variables.
Algoritmos Look-Backward
Los algoritmos Look-Backward tratan de explotar la información del problema para
comportarse más eficientemente en las situaciones sin salida. Al igual que el
backtracking cronológico, los algoritmos Look- Backward llevan a cabo la
comprobación de la consistencia hacia atrás, es decir, entre la variable actualmente
instanciada y las pasadas ya instanciadas.
variantes de algoritmos Look-Backward.
• Backjumping (BJ) [Gaschnig, 1979] es un algoritmo parecido al backtracking
cronológico, excepto que se comporta de una manera más inteligente cuando
encuentra situaciones sin salida. En vez de retroceder a la variable anteriormente
instanciada, BJ salta a la variable x j más profunda, es decir más cerca de la
variable actual, que está en conflicto con la variable actual x i donde j < i.
Decimos que una variable instanciada
x j está en conflicto con una variable xi si la instanciación de x j evita
uno de los valores en xi , debido a la restricción entre x j y xi .
Cambiar la instanciación de x j puede hacer posible encontrar una
instanciación consistente de la variable actual.
ALGORITMOS DE BÚSQUEDA
BUSQUEDA CIEGA
Sólo utiliza información acerca de si un estado es o no objetivo para guiar su
proceso de búsqueda.
Expandir un nodo: obtener los posibles hijos de un nodo a partir de la aplicación
de los distintos operadores sobre él.
Nodo cerrado: Se han aplicado todos los posibles operadores sobre él,
obteniéndose todos sus posibles hijos.
TIPOS DE BÚSQUEDA CIEGA
Búsqueda en amplitud.
Búsqueda en profundidad.
Búsqueda en profundidad progresiva
BÚSQUEDA EN AMPLITUD:
Procedimientos de búsqueda nivel a nivel
Para cada uno de los nodos de un nivel se aplican todos los posibles operadores
No se expande ningún nodo de un nivel antes de haber expandido todos los del nivel
anterior
Se implementa con una estructura FIFO.
BÚSQUEDA EN PROFUNDIDAD:
La búsqueda se realiza por una sola rama del árbol hasta encontrar una solución o
hasta que se tome la decisión de terminar la búsqueda por esa dirección.
Terminar la búsqueda por una dirección se debe a no haber posibles operadores que
aplicar sobre el nodo hoja o por haber alcanzado un nivel de profundidad muy
grande.
Si esto ocurre se produce una vuelta atrás (backtracking) y se sigue por otra rama
hasta visitar todas las ramas del árbol si es necesario.
BÚSQUEDA BIDIRECCIONAL:
Se llevan a la vez dos búsquedas: una descendente desde el nodo inicial y otra
ascendente desde el nodo meta.
Al menos una de estas dos búsquedas debe ser en anchura para que el recorrido
ascendente y descendente pueda encontrarse en algún momento
La búsqueda es una de las técnicas más utilizadas para resolver los problemas de
pathfinding o planificación que se presentan en la inteligencia artificial. En
particular, la búsqueda es utilizada para resolver el problema de la navegación.
De los distintos tipos de algoritmos de búsqueda, los algoritmos de búsqueda
heurística completa se encuentran ampliamente difundidos. Sin dudas, el algoritmo
A* es el algoritmo de búsqueda heurística más popular. Búsqueda A* El algoritmo
de búsqueda A*(pronunciado “A asterisco” o “A estrella”) se clasifica dentro de los
algoritmos de búsqueda en grafos. Presentado por primera vez en 1968 por Peter E.
Hart, Nils J. Nilsson y Bertram Raphael, el algoritmo A* encuentra, siempre y
cuando se cumplan unas determinadas condiciones, el camino de menor coste entre
un nodo origen y uno objetivo. Búsqueda por el método algorítmico A* Él método
busca el camino en un grafo de un vértice inicial hasta un vértice final. Él es la
combinación de aproximaciones heurísticas como del algoritmo Best-first Search.
Su aplicación va desde aplicativos para encontrar rutas de
desplazamiento entre localidades la resolución de problemas, como la resolución de
uno quiebra-cabezas. Él es muy usado en juegos. Motivación y descripción.
El problema de algunos algoritmos de búsqueda en grafos informados, como puede
ser el algoritmo voraz, es que se guían en exclusiva por la función heurística, la cual
puede no indicar el camino de coste más bajo, o por el coste real de desplazarse de
un nodo a otro (como los algoritmos de escalada), pudiéndose dar el caso de que sea
necesario realizar un movimiento de coste mayor para alcanzar la solución. Es por
ello bastante intuitivo el hecho de que un buen algoritmo de búsqueda informada
debería tener en cuenta ambos factores, el valor heurístico de los nodos y el coste
real del recorrido.
Una forma de resolver el problema de la profundidad límite de la búsqueda en
profundidad podría ser considerar de forma iterativa sucesivos valores de este
parámetro, y para cada uno de ellos realizar una búsqueda completa.
Esta es la estrategia denominada búsqueda en profundidad iterativa. El principal
inconveniente de este tipo de búsqueda es que para cada uno de los valores de la
profundidad límite hay que visitar de nuevo todos los visitados en la iteración
anterior.
Sin embargo, en la práctica esto no supone un inconveniente muy grave ya que, el
número de nodos nuevos es en realidad mucho mayor que los visitados en las
iteraciones anteriores. Al igual que en la búsqueda en profundidad convencional, si
la profundidad máxima alcanzada es d, el espacio de memoria es proporcional a d, y
el tiempo de búsqueda es exponencial en d. El algoritmo 8.4 muestra una versión
del algoritmo de búsqueda en profundidad iterativa que se obtiene haciendo variar la
profundidad límite a partir de 1, aplicando el algoritmo convencional de búsqueda
en profundidad para cada uno de estos valores.
Un algoritmo de búsqueda es aquel que está diseñado para localizar un elemento con
ciertas propiedades dentro de una estructura de datos.
Las bases de datos en algunos casos representan una cierta complejida en la
prograación brindada, es por ello que la lógica con la que se ejecuta debe ser apropieda
y con elementos que se puedan proporcionar con facilidad, los algoritmos de búsqueda
proporcionan una herramienta importante al diseño de las bases de datos para que los
comandos que se proporcionen puedan localizar con facilidad los elementos que se
necesitan en el momento BUSQUEDA QUE EXISTEN.
BÚSQUEDA LINEAL (SECUENCIAL)
Consiste en recorrer y examinar cada uno de los elementos del array hasta encontrar el
o los elementos buscados, o hasta que se han mirado todos los elementos del array.
Este es el método de búsqueda más lento, pero si nuestra información se encuentra
completamente desordenada es el único que nos podrá ayudar a encontrar el dato que
buscamos. El siguiente algoritmo ilustra un esquema de implementación del algoritmo
de búsqueda secuencial:
for(i=j=0;i<N;i++)
if(array[i]==elemento)
{
solucion[j]=i;
j++;
Este algoritmo se puede optimizar cuando el array está ordenado, en cuyo caso la
condición de salida cambiaría a:
for(i=j=0;array[i]<=elemento;i++)
for(i=0;i<N;i++)
if(array[i]==elemento)
break;
En este último caso, cuando sólo interesa la primera posición, se puede utilizar un
centinela, esto es, dar a la posición siguiente al último elemento de array el valor del
elemento, para estar seguro de que se encuentra el elemento, y no tener que comprobar
a cada paso si seguimos buscando dentro de los límites del array:
array[N]=elemento; for(i=0;;i++)
if(array[i]==elemento)
break;
Si al acabar el bucle, i vale N esto indica que no se encontró el elemento. El número
medio de comparaciones que hay que hacer antes de encontrar el elemento buscado es
de (N+1)/2.
Si los elementos sobre los que se realiza la búsqueda están ordenados, entonces
podemos utilizar un algoritmo de búsqueda mucho más rápido que el secuencial, la
búsqueda binaria. El algoritmo consiste en reducir paulatinamente el ámbito de
búsqueda a la mitad de los elementos, basándose en comparar el elemento a buscar con
el elemento que se encuentra en la mitad del intervalo y en base a esta comparación:
Si el elemento buscado es menor que el elemento medio, entonces sabemos que el
elemento está en la mitad inferior de la tabla.
Si es mayor es porque el elemento está en la mitad superior.
Si es igual se finaliza con éxito la búsqueda ya que se ha encontrado el elemento.
Se puede aplicar tanto a datos en listas lineales (Vectores, Matrices, etc.) como en
árboles binarios de búsqueda. Los prerrequisitos principales para la búsqueda binaria
son:
La lista debe estar ordenada en un orden especifíco de acuerdo al valor de la llave.
Debe conocerse el número de registros.
La búsqueda binaria consiste en dividir el array por su elemento medio en dos
subarrays más pequeños, y comparar el elemento con el del centro. Si coinciden, la
búsqueda se termina. Si el elemento es menor, debe estar (si está) en el primer subarray,
y si es mayor está en el segundo. Por ejemplo, para buscar el elemento 3 en el array
{1,2,3,4,5,6,7,8,9} se realizarían los siguientes pasos:
Se toma el elemento central y se divide el array en dos:
{1,2,3,4}-5-{6,7,8,9}
Como el elemento buscado (3) es menor que el central (5), debe estar en el primer
subarray: {1,2,3,4}
Se vuelve a dividir el array en dos:
{1}-2-{3,4}
Como el elemento buscado es mayor que el central, debe estar en el segundo subarray:
{3,4}
Se vuelve a dividir en dos:
{}-3-{4}
Como el elemento buscado coincide con el central, lo hemos encontrado.
Si al final de la búsqueda todavía no lo hemos encontrado, y el subarray a dividir está
vacio {}, el elemento no se encuentra en el array. La implementación sería:
int desde,hasta,medio,elemento,posicion; // desde y hasta indican los límites del array
que se está mirando.
int array[N];
// Dar valor a elemento.
for(desde=0,hasta=N-1;desde<=hasta;)
{
if(desde==hasta) // si el array sólo tiene un elemento:
{
if(array[desde]==elemento) // si es la solución: posicion=desde; //
darle el valor.
else // si no es el valor:
posicion=-1; // no está en el array. break; //
Salir del bucle.
}
medio=(desde+hasta)/2; // Divide el array en dos. if(array[medio]==elemento) // Si
coincide con el central:
{
posicion=medio; // ese es la solución break; //
y sale del bucle.
}
else
if(array[medio]>elemento) // si es menor:
hasta=medio-1; // elige el array de la izquierda.
else // y si es mayor:
desde=medio+1; // elige el array de la derecha.
}
Idealmente, todas las claves deberían corresponder con direcciones diferentes, pero es
muy frecuente que dos o mas claves diferentes sean transformadas a la misma
dirección, cuando esto pasa, se dice que se presenta una Colisión. Es por eso que
también se debe implementar algún proceso de resolución de Colisiones, que se va a
encargar de tratar tales situaciones. Uno de los métodos de resolución de colisiones que
existen usa Listas enlazadas y se lo denomina “encadenamiento directo” o “Hashing
abierto” el cual es muy útil en situaciones dinámicas, donde el numero de elementos es
difícil de predecir por adelantado.
El Hashing es un buen ejemplo de balance entre tiempo y espacio. Si no hubiera
limitaciones de memoria, entonces podríamos hacer cualquier búsqueda en un solo
acceso simplemente utilizando la clave como una dirección de memoria. Este ideal no
puede ser llevado a cabo, porque la cantidad de memoria requerida es prohibitiva
cuando la cantidad de registros es considerable. De la misma manera, si no hubiese
limitación de tiempo, podríamos usar un menor espacio en memoria usando un método
secuencial. Hashing provee una manera de usar una razonable cantidad de memoria y
tiempo y lograr un balance entre los dos extremos mencionados. En particular, podemos
lograr el balance deseado simplemente ajustando el tamaño de la tabla, sin necesidad de
re-escribir código o cambiar algoritmos.
En líneas generales podemos decir, que es razonable esperar búsquedas (Search),
borrados (Delete) e inserciones (Insert) en tiempo constante , independientemente del
tamaño de la tabla. O sea que es ideal para aplicaciones que realicen mayoritariamente
este tipo de operaciones, por el
otro lado, Hashing no provee implementaciones eficientes para otras
operaciones como por ejemplo Ordenamiento (Sort) o Selección (Select).
REFERENCIAS
Palma Méndez, J. T., & Marín Morales, R. (2008). Inteligencia artificial: Métodos,
técnicas y aplicaciones.España: McGraw-Hill. Pag.392-412. Obtenido
dehttps://bibliotecavirtual.unad.edu.co:2538/lib/unadsp/reader.action?
docID=3194970&query=sistemas+basados+en+el+conocimiento
Palma Méndez, J. T., & Marín Morales, R. (2008). Inteligencia artificial: Métodos,
técnicas y aplicaciones.España: McGraw-Hill. Pag.309-347. Obtenido
dehttps://bibliotecavirtual.unad.edu.co:2538/lib/unadsp/reader.action?
docID=3194970&query=sistemas+basados+en+el+conocimiento
Palma Méndez, J. T., & Marín Morales, R. (2008). Inteligencia artificial: Métodos,
técnicas y aplicaciones.España: McGraw-Hill. Pag.209-249. Obtenido
dehttps://bibliotecavirtual.unad.edu.co:2538/lib/unadsp/reader.action?
docID=3194970&query=sistemas+basados+en+el+conocimiento
Palma Méndez, J. T., & Marín Morales, R. (2008). Inteligencia artificial: Métodos, técnicas
y aplicaciones. España: McGraw-Hill. Pag.309-347. Obtenido de
https://bibliotecavirtual.unad.edu.co:2538/lib/unadsp/reader.action?
docID=3194970&query=sistemas+basados+en+el+conocimiento
Palma Méndez, J. T., & Marín Morales, R. (2008). Inteligencia artificial:
Métodos, técnicas y aplicaciones. España: McGraw-Hill. Pag.209-249.
Obtenido de
https://bibliotecavirtual.unad.edu.co:2538/lib/unadsp/reader.action?
docID=3194970&query=sistemas+basados+en+el+conocimiento
Espacios de estados Magazine Theme for PivotX by Windmill Web
Work in 2009, released under the Simple Public License
http://www.cs.us.es/~fsancho/?e=33