Está en la página 1de 9

TECNOLOGICO NACIONAL DE MEXICO

INSTITUTO TECNOLÓGICO DE ACAPULCO

INTELIGENCIA ARTIFICIAL 1

INGENIERIA EN SISTEMAS COMPUTACIONALES

UNIDAD 3
TAREA: 3.7 ESPACIOS DE ESTADOS DETERMINÍSTICOS Y ESPACIOS DE
ESTADOS NO DETERMINÍSTICOS.
3.8 BUSQUEDA SISTEMATICA
3.8.1 BÚSQUEDA DE METAS A PROFUNDIDAD

3.8.2 BÚSQUEDA DE METAS EN ANCHURA

PROFESOR: ING. JUAN CARLOS RAMIREZ TERESA

NOMBRE DEL ALUMNO: GALLEGOS GANDARILLA JOSE CARLOS

ACAPULCO, GUERRERO. ENERO - AGOSTO / 2020

FECHA 23 DE ABRIL 2020


INTRODUCCION
Unidad tres nos habla de temas muy importantes acerca de las reglas y búsqueda
en el área de la computación donde el primer tema que se hablara es sobre los
espacios de estados determinísticos y espacios de estados no determinísticos
donde cada uno cumple con una función en específico para los sistemas expertos
y sistemas de lógica difusa ya que cada uno de estos estados abarcan una gran
área de información, el siguiente tema que te investigo es la búsqueda sistemática
donde se presenta más en el área de los sistemas computaciones más que nada
en algoritmos tanto como de anchura y de profundidad donde cada uno de estas
diferentes tipos de búsqueda desempeñan una función en la realización de
algoritmos , grafos y pseudocodigos ,donde cada uno de estos tipos de búsqueda
se lleva cierto complejidad de tiempo y complejidad de espacio como se puede
reflejar en los almacenamiento de disco duro de las computadoras .
3.7 ESPACIOS DE ESTADOS DETERMINÍSTICOS Y ESPACIOS DE ESTADOS
NO DETERMINÍSTICOS.
¿Qué son los espacios de estado? La búsqueda de espacios de estados se le
considera un proceso, en el cual se consideran sucesivos estados de una
instancia, con la meta de encontrar el estado final con respectivas características
de este. Los problemas se modelan como un espacio de estado, que no es más
que un conjunto de estados que contienen problemas, este conjunto de estados
forma un grafo donde dos estados están conectados si hay una operación que se
pueda llevar a cabo para transformar el primer estado en el segundo. La búsqueda
en el espacio de estado difiere de los métodos de búsqueda tradicionales porque
el espacio de estado está implícito: el Grafo del espacio de estados típico es
mucho más grande para generarlo y guardarlo en memoria. En su lugar los nodos
son generados en el momento de su ejecución y estos son descartados después.
-. Espacios de Estado Determinístico
El espacio de estados determinísticos contiene un único estado inicial y seguir la
secuencia de estados para la solución. Los espacios de estados determinísticos
son usados por los sistemas expertos. Se puede describir a su vez, que un
sistema es determinístico si, para un estado dado, al menos aplica una regla a él y
de solo una manera.
Una gran característica del espacio de estados determinísticos, es que son usados
por los sistemas expertos. El espacio de estados llamados determinísticos siempre
tiene un único estado inicial y sigue una secuencia de estados trascendente para
la solución. Los espacios de estados determinísticos son usados por los sistemas
expertos. Se puede describir que un sistema es determinístico si, para un estado
dado, al menos aplica una regla a él y de solo una única manera.

-. Espacios de Estado No Determinístico:


El no determinístico contiene un amplio número de estados iniciales y sigue la
secuencia de estados perteneciente al estado inicial del espacio. Son usados por
sistemas de lógica difusa. El espacio de estados llamado no determinístico
contiene más de un estado inicial y sigue la secuencia de estados perteneciente al
estado inicial del espacio. Son usados por sistemas de lógica difusa. En otras
palabras, si más de una regla aplica a cualquier estado particular del sistema, o si
una regla aplica a un estado particular del sistema en más de una manera,
entonces el sistema es no determinístico. En otras palabras, si más de una regla
aplica a cualquier estado particular del sistema, o si una regla aplica a un estado
particular del sistema en más de una manera, entonces el sistema es no
determinístico. Una de las características de este es que son usados por sistemas
de lógica difusa, esté presente en problemas más grandes para el agente.
3.8 BUSQUEDA SISTEMATICA
Los problemas de búsquedas, que generalmente encontramos en Ciencias
Computacionales, son de un estado determinístico. Por ejemplo, en los algoritmos
de búsqueda de anchura y de búsqueda de profundidad, uno sabe la secuencia de
los nodos visitados en un árbol.
Sin embargo, los problemas de búsqueda, los cuales siempre tendremos que
tratar en Inteligencia artificial, son no determinísticos y el orden de elementos
visitados en el espacio de búsqueda depende completamente en el conjunto de
datos.

3.8.1 BÚSQUEDA DE METAS A PROFUNDIDAD

Una Búsqueda en profundidad es un algoritmo que permite recorrer todos los


nodos de un grafo o árbol (teoría de grafos) de manera ordenada, pero no
uniforme. Su funcionamiento consiste en ir expandiendo todos y cada uno de los
nodos que va localizando, de forma recurrente, en un camino concreto. Cuando ya
no quedan más nodos que visitar en dicho camino, regresa (Backtracking), de
modo que repite el mismo proceso con cada uno de los hermanos del nodo ya
procesado. El algoritmo de más utilizado es el de búsqueda de metas por
profundidad. Es llamado así porque sigue cada camino hasta su mayor
profundidad antes de moverse al siguiente camino.

Asumiendo que iniciamos desde el lado izquierdo y trabajamos hacia la derecha,


la búsqueda de metas por profundidad involucra trabajar todos los caminos debajo
del camino de árbol más a la izquierda hasta que un nodo hoja es alcanzado. Si
esta es una meta de estado, la búsqueda es completada y reportada como
exitosa.
Si el nodo hoja no representa la meta de estado, la búsqueda se dirige atrás y
arriba al siguiente nodo más alto que tiene un camino no explorado.
La búsqueda de profundidad es un ejemplo de la búsqueda de fuerza bruta, o la
búsqueda exhaustiva. La búsqueda de profundidad es usada por computadoras a
menudo para los problemas de búsqueda como ubicar archivos en un disco.
Complejidad de espacio
Se requiere mayor cantidad de memoria en la búsqueda de profundidad, cuando
alcanzamos la mayor profundidad a la primera vez.
Complejidad de tiempo 
Si encontramos la meta en la posición más a la izquierda de profundidad (D),
entonces el número de nodos examinados es (d+1). De otra forma, si encontramos
la meta en el extremo derecho a una profundidad (D), entonces el número de
nodos examinados incluyen todos los nodos en el árbol.
Ejemplo:
Pseudocodigo algoritmo búsqueda en profundidad

funcion buscar_en_hijos(Nodo:n)
variable encontrado=boolean

inicio
    si solucion(n->hijo)
    retornar n->hijo
    
    sino
    n1=n->hijo
    encontrado=falso    
        mientras no (encontrado)
        n1=n1->hermano
        sisolucion(n1)
        retornar n1   
        sino
            n1=null
            romper ciclo
    
            buscar_en_hijos(n->hijo)
            n2->n->hijo
                mientras(n2->hermano!=null)
                n2=n2->hermano
                buscar_en_hijos(n2)
  fin si
    fin mientras
fin función

Muchos algoritmos de grafos necesitan visitar de un modo sistemático todos los


vértices de un grafo. En la búsqueda en profundidad se avanza de vértice en
vértice, marcando cada vértice visitado. La búsqueda siempre avanza hacia un
vértice no marcado, internándose “profundamente” en el grafo sin repetir ningún
vértice. Cuando se alcanza un vértice cuyos vecinos han sido marcados, se
retrocede al anterior vértice visitado y se avanza desde éste. Si dado un grafo
simple G, escogemos un vértice v para iniciar la exploración del grafo utilizando la
búsqueda en profundidad, el árbol que se construye es un árbol generador de la
componente conexa del grafo que contiene a v.
Sea G(V, E) un grafo conexo y v un vértice de V. El algoritmo de búsqueda en
profundidad puede detallarse así:
1.- Se comienza en un vértice v (vértice activo) y se toma como la raíz del árbol
generador T que se construirá. Se marca el vértice v.
2.- Se elige un vértice u, no marcado, entre los vecinos del vértice activo. Si no
existe tal vértice, ir a 4.
3.- Se añade la arista (v, u) al árbol T. Se marca el vértice u y se toma como
activo. Ir al paso 2.
4.- Si se han alcanzado todos los vértices de G el algoritmo termina. En caso
contrario, se toma el vértice padre del vértice activo como nuevo vértice activo y se
vuelve al paso 2.
La complejidad de este algoritmo es O(max{n, m}).
Aplicar el algoritmo de búsqueda en profundidad al siguiente grafo

La búsqueda en profundidad se puede implementar de forma recursiva. Debido al


paso 4 del algoritmo descrito arriba, donde se regresa al padre del vértice activo,
la búsqueda en profundidad es un algoritmo de retroceso o “backtracking”. Este
tipo de algoritmo es de particular importancia en varios problemas de decisión,
donde lo que se requiere es encontrar una solución o probar que no existe
ninguna solución, por ejemplo, en el problema de la satisfacibilidad.
Sean X={x1, x2,…, xn} un conjunto de variables booleanas y C={C1,...,Cm} el
conjunto de cláusulas que forma la fórmula cnf S. El siguiente algoritmo de
retroceso se puede utilizar para establecer si la fórmula S es satisfacible o no
3.8.2 BÚSQUEDA DE METAS EN ANCHURA
En Ciencias de la Computación, Búsqueda en anchura (en inglés BFS - Breadth
First Search) es un algoritmo de búsqueda no informada utilizado para recorrer o
buscar elementos en un grafo (usado frecuentemente sobre árboles).
Intuitivamente, se comienza en la raíz (eligiendo algún nodo como elemento raíz
en el caso de un grafo) y se exploran todos los vecinos de este nodo. A
continuación para cada uno de los vecinos se exploran sus respectivos vecinos
adyacentes, y así hasta que se recorra todo el árbol.
Formalmente, BFS es un algoritmo de búsqueda sin información, que expande y
examina todos los nodos de un árbol sistemáticamente para buscar una solución.
El algoritmo no usa ninguna estrategia heurística.
Una alternativa para la búsqueda de profundidad es la búsqueda de metas de
anchura (amplitud). Como su nombre indica, este enfoque supone atravesar un
árbol por anchura más que por profundidad. El algoritmo de anchura empieza
examinando todos los nodos de un nivel (a veces llamado hebra uno) abajo del
nodo raíz.
Si una meta de estado es alcanzada aquí, el éxito es reportado. De otra forma, la
búsqueda continúa ampliando caminos de todos los nodos del nivel en curso, para
posteriormente bajar al próximo nivel. De este modo, la búsqueda continúa
revisando nodos en un nivel especial, e informará sobre el éxito cuando un nodo
meta es encontrado, y reportar una falla si todos los nodos han sido revisados y
ningún nodo meta ha sido encontrado.
En anchura es un algoritmo para recorrer o buscar elementos de un grafo(usado
frecuentemente en arboles). Se comienza por la raíz y se explora todos los hijos
de este nodo. A continuación se explora cada uno de los hijos de los hermanos
y así sucesivamente hasta encontrar la solución.

La búsqueda en anchura supone que el recorrido se haga por niveles. Para


entender más fácilmente de que se trata, hemos indicado en la siguiente imágen
un grafo ejemplo en donde cada color representa un nivel, tomando como raíz o
nodo inicial el que tiene el número 1. El recorrido se hará en orden numérico de
forma consecutiva hasta llegar al nodo número 7.
La estrategia que usaremos para garantizar este recorrido es utilizar una cola que
nos permita almacenar temporalmente todos los nodos de un nivel, para ser
procesados antes de pasar al siguiente nivel hasta que la cola esté vacía.
queue<State> q;
q.push(State(raiz));
mark[raiz] = true;

Inmediatamente después de declarar nuestra estructura de cola, agregamos el


nodo raíz para poder iniciar el proceso de búsqueda. Esto se hace porque
necesitamos tener al menos un elemento en nuestra cola, dado que la condición
de salida es que la cola esté vacía. Luego marcamos el nodo raíz como visitado.

while(!q.empty())
{
    State st = q.front();
    q.pop();
    if (st.node == nodo){
        printf("'%d'n",nodo);
        return;
    }else printf("%d ",st.node);

    int T = (int)graph.G[st.node].size();
    for(int i = 0; i < T; ++i)
    {
        if (!mark[graph.G[st.node][i].node])
        {
            mark[graph.G[st.node][i].node] = true;
            q.push(State(graph.G[st.node][i].node));
        }
    }
}

Cada vez que visitamos un nodo, lo desencolamos e imprimimos por pantalla el


valor del nodo para ir indicando el recorrido. Luego agregamos a la cola todos los
nodos del siguiente nivel y los marcamos como visitados antes de comenzar el
ciclo de nuevo, en el que procesaremos estos nuevos nodos que hemos agregado
a la cola.
Si encontramos el elemento buscado, la función BFS retornará al “main” e
imprimirá entre comillas simples el valor del elemento buscado.

Podríamos hacer otro tipo de mensaje para indicar que el elemento ha sido
encontrado, calcular el número de nodos que fueron visitados o incluso generar un
mensaje especial en el caso de que el elemento no haya sido encontrado. Por el
momento la función ha quedado lo más sencilla posible para enfocarnos
únicamente en cómo hacer el recorrido.

También podría gustarte