Вы находитесь на странице: 1из 25

Centro de Enseanza Tcnica Industrial.

Inteligencia Artificial

INTELIGENICA ARTIFICIAL

CURSO DE TEORIA DE CONJUNTOS Y TEORIA DE GRAFOS

AUTOR: M.C. Pedro Arturo Cornejo Torres

Pedro Arturo Cornejo Torres

Centro de Enseanza Tcnica Industrial.

Inteligencia Artificial

Unidad 1. Fundamentos de Teora de Conjuntos.


1.1 Teora de conjuntos.
Por qu es necesario conocer la teora de conjuntos? Una razn muy importante del estudio de la teora de conjuntos, lo es el hecho de establecer un lenguaje comn y formal que nos permita intercambiar conceptos sobre los conjuntos. Es necesario este lenguaje?, la respuesta es si. El uso de un lenguaje formal permite trasmitir, documentar y divulgar conocimiento libre de malas interpretaciones y ambigedades. La teora de conjuntos, nos propone el conocimiento necesario para tratar con objetos y conjuntos de manera formal. Tambin nos ofrece un lenguaje formal expresar conjuntos y como operar con ellos y sus elementos. En inteligencia artificial, los algoritmos son fciles de describir en el lenguaje de conjuntos, independizando los conceptos de la plataforma en particular que se utilice, como lo es un lenguaje de programacin.

Conjuntos y subconjuntos.
Tenemos cierta nocin intuitiva en el sentido de que un conjunto debe ser una coleccin bien definida de objetos. Estos objetos se llaman elementos y se dice que son miembros del conjunto. El adjetivo bien definido implica que para cualquier elemento que consideremos, podemos determinar si est en el conjunto observado. En consecuencia, evitaremos trabajar con conjuntos que dependan de las opiniones, como el conjunto de los mejores lanzadores de las ligas mayores de bisbol en la dcada de 1980.

Notacin de los conjuntos.


Utilizaremos las letras maysculas, A, B, C para representar los conjuntos y letras minsculas para representar los elementos. Para un conjunto A, escribiremos x A si x es elemento de A; y y A indicando que y no es elemento de A. Ejemplo 1: Un conjunto puede designarse enumerando sus elementos dentro de llaves {}. Por ejemplo si A es el conjunto formado por los primeros cinco nmeros enteros positivos, escribiremos A={1 , 2 ,3 ,4 , 5}. Utilizando la definicin del conjunto A. Podemos decir que se cumple de verdad lo siguiente: 2 A y 6 A. Otra notacin comn para el conjunto A es A={ x | x es un entero y 1 x 5}, en este caso la lnea vertical | que aparece dentro de las llaves se lee como tal que. Los smbolos {x | } se leen como el conjunto de todos los x tales que . Las

Pedro Arturo Cornejo Torres

Centro de Enseanza Tcnica Industrial.

Inteligencia Artificial

propiedades que van despus de | nos ayudan a determinar los elementos del conjuntos descrito. Hay que tener cuidado con las propiedades que se establezcan para el conjunto. La notacin {x | 1 x 5} no es una descripcin adecuada del conjunto A, a menos que hayamos acordado previamente que los elementos considerados son enteros. Recuerde que existen diferentes conjuntos de nmeros como los reales y los complejos. Ejemplo 2: Si U = {1, 2, 3, } es el conjunto de los enteros positivos, sean a) A = {2 ,4 ,6 ,8 ,10, } = {x U | x es par} b) B= {5, 10, 15, 20, 25, 30, 35, 40} = {x U | x=5k, 1 k 3} Para el caso del inciso a) tenemos el conjunto infinito en su forma enumerada, y luego en su forma definida. En este caso el conjunto de los nmeros pares es un conjunto bastante grande como para enumerar cada uno de estos nmeros. La forma definida nos permite de forma compacta e igual de precisa referirnos a los nmeros pares. En el caso del inciso b) tenermos de igualmanera al inciso anterior, un conjunto enumerado de ocho elementos, y luego tenemos el conjunto definido. En este caso, el objeto x queda restringido por ser necesario que pertenezca al conjunto de los nmeros enteros positivos y por quedar en trminos de un monomio 5k. En este caso el dominio de k es de 1 hasta incluir 3. Entre el uno y el tres, como no definimos el conjunto de k, pueden exisitir un conjunto infinito de valores. No importa, en este caso, ya que x debe ser un entero positivo. Ahora bien, ya existe un fundamento suficiente para comenzar nuestro estudio sobre los conjuntos. En las siguientes tareas y proyectos analizaremos otros tipos bien conocidos de conjuntos de objetos, como el conjunto de los nmeros reales, el conjunto de los nmeros naturales, etc. Tambin estudiaremos las propiedades y las operaciones de los conjuntos. Nota: Los conjuntos que hasta ahora hemos estudiado utilizan objetos que son nmeros. Pero en realidad, estos objetos pueden ser cadenas, colores, frutas, tablas de bases de datos, registros, nodos, aristas, etc. En fin, una gran diversidad de tipos de objetos con los que podemos tratar con la teora de conjuntos. Otro punto ms a favor de esta teora, que motiva su estudio. REFERENCIAS: Para mayor informacin sobre este tema, puede consultar cualquier libro de matemticas discretas, por lo general, en estos ttulos se discute este tema en las primeras secciones. En la Wiki: http://es.wikipedia.org/wiki/Teor%C3%ADa_de_conjuntos

Pedro Arturo Cornejo Torres

Centro de Enseanza Tcnica Industrial.

Inteligencia Artificial

Cardinal o tamao de un conjunto.


El cardinal es un operador que calcula el total de elementos sobre cualquier conjunto. Para el caso de los conjuntos finitos, este valor pertenece al conjunto de los enteros positivos, cuando se trata de un conjunto infinito, simplemente se especifica que su tamao es . El operador cardinal sobre un conjunto se escribe mediante dos barras horizontales |A| que encierran al smbolo del conjunto. Ejemplo 3 Sea A={1, 2, 3, 4 } un conjunto infinito. En este caso |A| = . Sea B={1, 2, 16, 32} un conjunto finito. En este caso |B| = 4.

Conjunto Universal.
Decimos que estamos especificando un Universo o Universo de Discurso, que por lo general se denota con U, para definir a donde pertenecen todos los elementos de los dems conjuntos que utilizaremos. Es decir, el universo o universo de discurso es quien contiene a todos elementos.

Subconjunto.
Si C y D son conjuntos del universo U, decimos que C es un subconjunto de D y escribimos C D, si cada elemento de C es un elemento de D. Si adems, D contiene un elemento que no esta en C, entonces C es un subconjunto propio de D y se denota como C D. Definicin formal de subconjunto: Observe que para cualesquiera conjuntos C y D del universo U, si C D, entonces x[x C x D], y si C D entonces x[x C x D]. Aqu el cuantificador universal sobre x, x indica que debemos considerar cada elemento x del universo dado U. Ms detalles acerca los operadores lgicos involucrados se discutirn en el repaso de lgica. Veremos que la lgica y los conjuntos estn fuertemente relacionados entre si. Ejemplo 4. Para el universo U = {1, 2, 3, 4, 5} consideremos el conjunto A={1, 2}. Si B={x | x2 U}, entonces los miembros de B son 1, 2. En este caso, A y B contienen los mismos elementos (y ninguno ms), lo cual nos lleva a pensar que los conjuntos A y B son iguales. Sin embargo, tambin es cierto que A B y B A. Esto nos conduce al concepto de igualdad de conjuntos.

Pedro Arturo Cornejo Torres

Centro de Enseanza Tcnica Industrial.

Inteligencia Artificial

Igualdad de conjuntos
Para un universo dado U, los conjuntos C y D (tomados del universo U) son iguales, y esto se escribe C = D, cuando C D y D C. A partir de las ideas de igualdad entre conjuntos, vemos que el orden o la repeticin no son significativos para un conjunto en general. As, tenemos, por ejemplo {1, 2, 3} = {3, 2, 1} = {2, 2, 1, 3} = {1, 2, 1, 3, 1}. Ejemplo 5 Sea U = {1, 2, 3, 4, 5, 6, x, y, {1, 2}, {1 ,2 ,3}, {1, 2, 3, 4}} (donde x y y son letras minsculas del alfabeto y no representan nada ms, al igual que, 3, 5, o {1,2}). Entonces | U | = 11. a) Si A = {1, 2, 3, 4}, entonces |A| = 4 y tenemos que lo siguiente es verdadero 1) A U 2) A U 3) A U 4) {A} U 5) {A} U 6) {A} U b) Ahora sea B = {5, 6, x, y, A} = {5, 6, x, y, {1, 2, 3, 4}} entonces |B|=5, no 8 y tenemos que lo siguiente tambin es verdadero: 1) A B pero, 4) A B 2) A B 3) A B

5) No es cierto que A B y 6) tampoco lo es A B.

Referencias: Matemticas Discreta y Combinatoria - Una introduccin con aplicaciones. Ralph P. Grimaldi. Ed. Pearson- Prentice Hall . Capitulo 3. Pginas Prxima tarea. Estn al pendiente.

Pedro Arturo Cornejo Torres

Centro de Enseanza Tcnica Industrial.

Inteligencia Artificial

El conjunto vaco
El conjunto vaco o nulo, es el nico conjunto que no contiene elementos. Se denota como o {}. Observemos que | | = 0, pero {0} . As mismo, {}, ya que {} es el conjunto con un elemento, a saber, el conjunto vaco.

Notacin de algunos conjuntos comunes de nmeros


Existen algunos conjuntos de nmeros que sern necesarios a travs de este curso de inteligencia artificial. En consecuencia, cerraremos esta seccin asignndoles los siguientes nombres. a) Z = El conjunto de los enteros = {0, 1, -1, 2, -2, 3, -3, } b) N = El conjunto de los nmeros naturales = {1, 2 , 3, 4, 5, 6, 7,} c) N0 = El conjunto de los nmeros naturales incluido el cero = N {0} d) Q = El conjunto de los nmeros racionales ={a/b | a, b Z, b 0} e) R = El conjunto de los nmeros reales. f) C = El conjunto de los nmeros complejos = {x + yi | x,y R, i2 = -1}

Intervalo abierto, cerrado y semiabierto


Para los nmeros reales a,b con a < b, [a,b] = { x R | a x b }, es un intervalo cerrado (a,b) = { x R | a < x < b }, es un intervalo abierto [a,b) = { x R | a x < b }, es un intervalo semiabierto por la derecha (a,b] = { x R | a < x b }, es un intervalo semiabierto por la izquierda Nota: Como puede observarse, la notacin de conjuntos reduce muchsimas explicaciones acerca de los conjuntos referidos.

Tarea
Los siguientes problemas fueron extraidos del libro de Grimaldi, captulo 3. Resuelva los siguientes problemas. ACLARACION: Por favor, analice la pregunta, NO TODAS SON PREGUNTAS DE OPCIN MULTIPLE. 1.- Cules de los siguientes conjuntos son iguales? a) {1, 2, 3} b) {3 ,2 ,1 , 3} c) {3, 2, 1, 3}

d) {1, 2, 2, 3}

2.- Sea A={1, {1}, 2}. Cules de las siguientes proposiciones son verdaderas?

Pedro Arturo Cornejo Torres

Centro de Enseanza Tcnica Industrial. a) 1 A f) {2} A

Inteligencia Artificial

b) {1} A c) {1} A d) {{1}} A e) {2} A g) {{2}} A h) {{2}} A

3.- Para A= {1, 2, {2}}, Cules de las siguientes proposiciones del ejercicio 2 son verdaderas? 4.- Determine todos los elementos de cada uno de los siguientes conjuntos. a) {1+ (-1)n | n N} b) {n + (1/n) | n {1, 2, 3, 5, 7}} c) { n3 + n2 | n {0, 1, 2, 3, 4}} d) {1/(n2+n) | n es un entero positivo impar y n 11} 5.- Cules de los siguientes conjuntos son no vacos? a) {x | x N, 2x+7=3} b) {x | x Q, x2+4=6} c) {x | x Z, 3x+5=9} d) {x | x C, x2+3x+3} Nota: utilice las definiciones de conjuntos numricos vistos en este documento.

Pedro Arturo Cornejo Torres

Centro de Enseanza Tcnica Industrial.

Inteligencia Artificial

Relaciones y Funciones.
En esta seccin extenderemos la teora de conjuntos que se estudi en la seccin anterior para incluir los conceptos de relacin y funcin. Antes de comenzar con la definicin de funcin, es necesario introducir algunos conceptos previos, entre estos, el importante producto cartesiano. Los productos cartesianos nos permitirn construir una asociacin entre dos objetos.

Producto cartesiano
Para los conjuntos A, B U, el producto cartesiano de A y B se denota con A B y es igual a {(a, b) | a A, b B}. Decimos que los elementos de A B son pares ordenados. Para (a, b), (c, d) A tenemos que (a, b) = (c, d) si y slo si a=c y b=d. Ejemplo 6 Sean U = {1, 2, 3, , 7}, A ={2, 3, 4}, B={4, 5}. Entonces a) A B = { (2, 4), (2, 5), (3, 4), (3, 5), (4 ,4), (4,5) } b) B A = { (4, 2), (5, 2), (4, 3), (5, 3), (4, 4), (5, 4) } c) B2= B B = {(4,4), (4, 5), (5, 4), (5,5)} d) B3= B B B = { (a, b, c) | a, b, c B}

Pedro Arturo Cornejo Torres

Centro de Enseanza Tcnica Industrial.

Inteligencia Artificial

Funcin
Para los conjuntos no vacos A y B, una funcin o aplicacin, f de A en B, se denota con f:A B, es una relacin de A en B en la que cada elemento de A aparece exactamente una vez en como la primera componente de un par ordenado en la relacin. Con frecuencia escribimos f(a) = b cuando (a, b) es un par ordenado en la funcin f. Si (a, b) f, entonces b se conoce como la imagen de a mediante f, mientras que a es una preimagen de b. Adems, la definicin sugiere que f es un mtodo para asociar a cada a A una nica b B; denotamos este proceso como f(a) = b b = f(a). Ejercicios de tarea: Utilizando alguna plataforma de programacin, implemntese un programa que calcule las siguientes operaciones entre conjuntos. Sea A={-10, -1, 0, 1, 2, 3, 4, 5, 6, 15, 18, 21, 32} y B={-10,-2, -1, 0, 1, 2, 4, 5, 6, 7, 12, 31, 32} dos conjuntos finitos de nmeros. Calcular mediante computador las siguientes operaciones sobre los conjuntos A y B: a) Union b) Interseccin c) Diferencia d) Diferencia Simtrica y e) Producto Cartesiano. Fecha de revisin y slo revisin de trabajos terminados: Martes 7 de octubre de 2008.

Pedro Arturo Cornejo Torres

Centro de Enseanza Tcnica Industrial.

Inteligencia Artificial

Introduccin a la teora de grafos.


En este apartado estudiaremos algunas definiciones preeliminares muy importantes para tratar con las estructuras de grafos. Los conceptos referentes a los grafos resultan ser muy intuitivos y fciles de comprender. A partir de los conceptos de la teora de conjuntos que ya ha aprendido, la formalizacin de esos conceptos resultar sencilla. Un grafo, presentado de manera intuitiva, es un dibujo que permite expresar la relacin entre los elementos de un conjunto dado. Ejemplos particulares de estos grafos son, los rboles genealgicos, rboles jerrquicos, mapas de alguna cuidad, un diagrama de flujo, un diagrama de bases de datos relacional, el esquemtico de un circuito, etc. Es por esos tipos de aplicaciones que resulta importante contar con las herrmientas cognitivas necesarias sobre los grafos para resolver problemas de manera eficaz y eficiente si es posible. De la introduccin dada en el prrafo anterior, Usted se habr dado cuenta que para conformar un grafo son necesarios dos conceptos: Un conjunto de objetos y una relacin. El conjunto define que objetos de algn universo U participan en el grafo, mientras que una relacin R establece las condiciones necesarias sobre las cuales los objetos se asocian.

Relaciones
En secciones anteriores, estudiamos el concepto bsico de funcin, en donde a cada elemento del dominio (preimagen) le corresponde uno y slo un elemento del codominio (imagen). Las relaciones son menos estrictas que las funciones, permitiendo que para algn elemento del dominio, este se encuentre relacionado con varios elementos del codominio. Bajo esta situacin, las funciones resultan ser un caso particular de relaciones, es decir, las funciones son tambin relaciones. El recproco todas las relaciones son funciones es invlido. En la teora de grafos utilizaremos relaciones binarias, es decir, asociaciones entre pares de objetos de dos conjuntos (posiblemente entre elementos de uno mismo). Una relacin binaria R, en los conjuntos A y B es un subconjunto del producto cartesiano entre A y B. R A B. Ejemplo 7 Sean U = {1, 2, 3, , 7}, A ={2, 3, 4}, B={4, 5} (Del ejemplo 6). Entonces 1. R1 = { (2, 4), (2, 5), (3, 5), (4 ,4)} A B 2. R2 = { (4, 4), (5, 4) } B A 3. R3 = {(4,4), (5,5)} B B Ahora que entendemos que son las relaciones binarias, podemos formalmente definir un grafo.

10

Pedro Arturo Cornejo Torres

Centro de Enseanza Tcnica Industrial.

Inteligencia Artificial

Grafo
Un grafo es un par G=(V, E) de conjuntos que satisfacen E V V, en donde los elementos del conjunto V son nodos o vrtices (o puntos o crculos) y E es el conjunto de aristas (o lneas). Ejemplo 8

Este grafo corresponde a los conjuntos siguientes: V={1, 2, 3, 4, 5, 6} E={(1, 2), (2, 1), (1, 5), (5, 1),(2, 3), (3, 2), (2, 5), (5, 2), (3, 4), (4, 3), (4, 5), (5, 4), (4, 6), (6, 4)} Este grafo, es un grafo no dirigido, obsrvese los pares que definen en la relacin E. Recuerde la definicin de par ordenado y con ello se confirma, por ejemplo que (1, 2) (2, 1).

Implementacin de grafos en C++ (Sugerencias)


Haciendo uso de STL, sobrecarga de operadores y clases, es posible construir software listo para procesar estructuras de grafos como la que se estudi en la seccin anterior. Resulta importante tener claro cmo los grafos pueden implementarse para resolver los futuros problemas que estudiaremos en este curso. A continuacin se presenta el conjunto de clases para el soporte de programacin de Grafos en C++.

11

Pedro Arturo Cornejo Torres

Centro de Enseanza Tcnica Industrial.

Inteligencia Artificial

Comenzaremos definiendo el conjunto ms bsico de un grafo: el vrtice. Para ello definiremos la siguiente clase C++. Estudiemos los comentarios para conocer entender el comportamiento de sta clase de objetos. Vertex.h
#ifndef _C_VERTEX #define _C_VERTEX class CVertex { friend class CGraphManager; private: // ID del vrtice: Un Nmero Entero (Read Only) (32 bits) int m_nID; public: //Agregar aqu ms datos segn la aplicacin

//Fin Agregar protected: //Constructor del vrtice CVertex(int nID); //Destructor virtual ~CVertex(void); public: /* Mtodos */ //Leer la llave del vrtice int Key(); public: //Agregar aqu ms mtodos segn la aplicacin //Fin Agregar }; #endif

Vertex.cpp
#include "StdAfx.h" #include "Vertex.h" CVertex::CVertex(int nID) { //Este constructor es invocado solamente por CGraphManager m_nID=nID; //Agregar aqu ms inicializaciones simples } CVertex::~CVertex(void) { //Este destructor es invocado solamente por CGraphManager //Agregar aqu ms cdigo de limpieza } int CVertex::Key() { return m_nID; }

12

Pedro Arturo Cornejo Torres

Centro de Enseanza Tcnica Industrial.

Inteligencia Artificial

Como puede observarse, es conveniente hacer uso de llaves (keys) para referirnos eficientemente a un vrtice. Por lo general, los vrtices son portadores de informacin muy importantes para ciertos algoritmos que acceden a esa informacin. La tcnica de llaves nos permite manejar de manera nica a los vrtices, facilitando muchas de las operaciones entre conjuntos. Las aristas no son la excepcin, tambin utilizaremos la tcnica de llaves para referirnos de manera nica a determinada arista en el grafo. Para el caso de los vrtices resulta conveniente utilizar su identificador como llave, pero para el caso de las aristas, realizaremos un tratamiento especial. Las aristas pueden modelarse como un par ordenado de identificadores de vrtices. Ahora bien, cada identificador de vrtice est conformado por un nmero de 32 bits. Aprovechando las capacidades de las computadoras modernas, combinaremos ambos identificadores de vrtice (v1.Key() y v2.Key()) en un solo identificador de 64 bits. La mezcla conforma otro nmero nico que implica la relacin entre dos vrtices. Haciendo uso de compiladores modernos, esto no es un problema. Actualmente los compiladores cuentan con tipos nativos de 64, 128 y 256 bits. Para combinar estos valores, una arista es la combinacin entre una estructura de par ordenado y un nmero de 64 bits. En C y C++ este tipo de organizaciones de memoria son posibles y de manera eficiente, por lo que el trabajo de combinar resulta instantneo acceder al identificador de la arista o a cualquiera de los dos identificadores de vrtices que conforman la arista. Vamos la siguiente clase C++ y analicemos los comentarios. Edge.h
#ifndef _C_EDGE #define _C_EDGE class CEdge { friend class CGraphManager; private: //Unin para compartir la memoria entre el par ordenado y la llave de la arista union { //Par ordenado para VxV (m_nIDFirst,m_nIDSecond) struct { //Primer vrtice (Read only) (32 bits) int m_nIDFirst; //Segundo vrtice (Read only) (32 bits) int m_nIDSecond; }; long long m_llID; //Llave de la arista (Read only) (64 bits) }; //(Tamao total 64 bits) public: //Leer Llave del primer vrtice int First(); //Leer Llave del segundo vrtice int Second();

13

Pedro Arturo Cornejo Torres

Centro de Enseanza Tcnica Industrial.


//Leer Llave de la arista long long Key(); protected: //Constructor CEdge(int nIDFirst,int nIDSecond); //Destructor ~CEdge(void); }; #endif

Inteligencia Artificial

Edge.cpp
#include "StdAfx.h" #include "Edge.h" CEdge::CEdge(int nIDFirst,int nIDSecond) { //Este constructor es invocado solamente por CGraphManager m_nIDFirst=nIDFirst; m_nIDSecond=nIDSecond; //Agregar aqu ms inicializaciones simples } CEdge::~CEdge(void) { //Este destructor es invocado solamente por CGraphManager //Agregar aqu ms cdigo de limpieza } int CEdge::First() { return m_nIDFirst; } int CEdge::Second() { return m_nIDSecond; } long long CEdge::Key() { return m_llID; }

Se estar preguntando, Por qu los identificadores de vrtice, el par ordenado de la arista y su correspondiente identificador son privados?. Tenemos varias razones para sugerir esto. 1) 2) 3) 4) Evitar modificaciones de cualquier tipo a la arista. Un cambio no contrlado implica corromper el significado del grafo. Poder utilizar la arista en varios grafos sin el riesgo de daar el significado de esos grafos al modificar dicha arista. Una arista se inicializa sus relaciones slo una vez y se utiliza as segn se necesite. Promueve el desarrollo de algoritmos robustos, confiables y eficientes.

14

Pedro Arturo Cornejo Torres

Centro de Enseanza Tcnica Industrial.

Inteligencia Artificial

Tambin se estar preguntando: Por qu utilizar constructores protegidos? Bueno, tambin existen muy buenas razones que promueven extensibilidad y reutilizacin, pero sin descuidar la seguridad, confiabilidad y eficiencia. Tanto aristas como vrtices, deben ser creados y ser correctamente inicializados por una entidad administradora. 2) La creacin y destruccin de objetos slo es posible a partir de un solo objeto de la clase CGraphManager. Ahora, cada grafo por definicin es una asociacin de par ordenado de dos conjuntos. El conjunto de vrtices y el conjunto de aristas. Vase la siguiente definicin de la clase CGraph. Graph.h
#ifndef _C_GRAPH #define _C_GRAPH #include <set> using namespace std; class CGraph { friend class CGraphManager; private: //Identificador del grafo int m_nIDGraph; //Puntero al Administrador de Grafos CGraphManager* m_pGraphManager; public: //Conjunto de vrtices set<int> m_V; //Relacin E que es subconjunto de VxV set<long long> m_E; //Llave del grafo int Key(); //Obtiene una referencia al GraphManager CGraphManager& GetGraphManager(); protected: CGraph(int nIDGraph,CGraphManager* pGraphManager); virtual ~CGraph(void); }; #endif

1)

Graph.cpp
#include "StdAfx.h" #include "Graph.h" #include "GraphManager.h" CGraph::CGraph(int nIDGraph,CGraphManager* pGraphManager) { m_nIDGraph=nIDGraph; m_pGraphManager=pGraphManager; } CGraph::~CGraph(void)

15

Pedro Arturo Cornejo Torres

Centro de Enseanza Tcnica Industrial.


{ } int CGraph::Key() { return m_nIDGraph; } CGraphManager& CGraph::GetGraphManager() { return *m_pGraphManager; }

Inteligencia Artificial

Por ltimo presentamos la clase CGraphManager, que se encarga de la importante tarea de la administracin de recursos de memoria y ciclo de vida de los objetos. Esta clase tiene como objetivo de encargarse de la creacin de este Vrtices, Aristas y Grafos. CGraphManager es una implementacin del patrn de diseo Builder, Factory, Container. Factory, porque crea objetos y asigna sus recursos de memoria, Builder, porque nos ofrece las estrategias para crear objetos con un estado vlido y, Container, porque agrupa a estos objetos. Esto con el objetivo de realizar una administracin de datos que puede ser comn entre varios grafos. Evitndose as la duplicacin de la informacin y compartiendo datos entre grafos. Resulta muy importante mencionarle la existencia de los patrones de diseo, por lo que anexo el siguiente fragmento Wiki que resume qu y para qu son los patrones de diseo: http://es.wikipedia.org/wiki/Patr%C3%B3n_de_dise%C3%B1o Los patrones de diseo (design patterns) son la base para la bsqueda de soluciones a problemas comunes en el desarrollo de software y otros mbitos referentes al diseo de interaccin o interfaces. Un patrn de diseo es una solucin a un problema de diseo. Para que una solucin sea considerada un patrn debe poseer ciertas caractersticas. Una de ellas es que debe haber comprobado su efectividad resolviendo problemas similares en ocasiones anteriores. Otra es que debe ser reusable, lo que significa que es aplicable a diferentes problemas de diseo en distintas circunstancias. Objetivos de los patrones de diseo pretenden: Proporcionar catlogos de elementos reusables en el diseo de sistemas software. Evitar la reiteracin en la bsqueda de soluciones a problemas ya conocidos y solucionados anteriormente. Formalizar un vocabulario comn entre diseadores. Estandarizar el modo en que se realiza el diseo. Facilitar el aprendizaje de las nuevas generaciones de diseadores condensando conocimiento ya existente.

16

Pedro Arturo Cornejo Torres

Centro de Enseanza Tcnica Industrial.

Inteligencia Artificial

Asimismo, no pretenden: Imponer ciertas alternativas de diseo frente a otras. Eliminar la creatividad inherente al proceso de diseo. No es obligatorio utilizar los patrones siempre, solo en el caso de tener el mismo problema o similar que soluciona el patrn, siempre teniendo en cuenta que en un caso particular puede no ser aplicable. Abusar o forzar el uso de los patrones puede ser un error. Ahora estudiemos la implementacin de la clase CGraphManager. GraphManager.h
ifndef __C_GRAPH_MANAGER #define __C_GRAPH_MANAGER #include <map> #include <set> using namespace std;

//Smbolos externos class CVertex; class CEdge; class CGraph; class CGraphManager { private: //Mapa de Llave a Vrtice map<int,CVertex*> m_mapVertex; //Mapa de Llave a Arista map<long long,CEdge*> m_mapEdge; //Conjunto de Grafos map<int,CGraph*> m_mapGraph; public:

//Crear un vrtice, si existe, retorna el existente CVertex& CreateVertex(int nID); //Crear una arista, si existe, retorna la existente CEdge& CreateEdge(int nIDFirst,int nIDSecond); //Crear un grafo, si existe, retorna el existente CGraph& CreateGraph(int nIDGraph); //Destruir un grafo void DestroyGraph(int nIDGraph); //Limpiar todo void Clean(); public: CGraphManager(void); virtual ~CGraphManager(void); }; #endif

GraphManager.cpp

17

Pedro Arturo Cornejo Torres

Centro de Enseanza Tcnica Industrial.


#include "StdAfx.h" #include "GraphManager.h" #include "Vertex.h" #include "Edge.h" #include "Graph.h" CGraphManager::CGraphManager(void) { } CGraphManager::~CGraphManager(void) { Clean(); }

Inteligencia Artificial

void CGraphManager::Clean() { for(map<int,CGraph*>::iterator it=m_mapGraph.begin(); it!=m_mapGraph.end();it++) { delete it->second; } m_mapGraph.clear(); for(map<long long,CEdge*>::iterator it=m_mapEdge.begin(); it!=m_mapEdge.end();it++) { delete it->second; } m_mapEdge.clear(); for(map<int,CVertex*>::iterator it=m_mapVertex.begin(); it!=m_mapVertex.end();it++) { delete it->second; } m_mapVertex.clear(); } CVertex& CGraphManager::CreateVertex(int nID) { map<int,CVertex*>::iterator it; it=m_mapVertex.find(nID); if(it==m_mapVertex.end()) //El vrtice no existe, crear uno nuevo { CVertex* pNewVertex=new CVertex(nID); return *(m_mapVertex.insert(make_pair(nID,pNewVertex)).first->second); } return *(it->second); } CEdge& CGraphManager::CreateEdge(int nIDFirst, int nIDSecond) { map<long long,CEdge*>::iterator it; union //64 bit helper { //Par ordenado para VxV (m_nIDFirst,m_nIDSecond) struct {

18

Pedro Arturo Cornejo Torres

Centro de Enseanza Tcnica Industrial.


//Primer vrtice (32 bits) int m_nIDFirst; //Segundo vrtice (32 bits) int m_nIDSecond;

Inteligencia Artificial

}; long long m_llID; //Llave de la arista (64 bits) }; //Conformar la clave de 64 bits m_nIDFirst=nIDFirst; m_nIDSecond=m_nIDSecond; //Buscar la arista it=m_mapEdge.find(m_llID); if(it==m_mapEdge.end()) //La arista no existe, crear una nueva { CEdge* pNewEdge=new CEdge(nIDFirst,nIDSecond); return *(m_mapEdge.insert(make_pair(m_llID,pNewEdge)).first->second); } return *(it->second); } CGraph& CGraphManager::CreateGraph(int nIDGraph) { map<int,CGraph*>::iterator it; it=m_mapGraph.find(nIDGraph); if(it==m_mapGraph.end()) //El grafo no existe, crear uno nuevo { CGraph* pNewGraph=new CGraph(nIDGraph,this); return *(m_mapGraph.insert(make_pair(nIDGraph,pNewGraph)).first->second); } return *(it->second); } void CGraphManager::DestroyGraph(int nIDGraph) { map<int,CGraph*>::iterator it; it=m_mapGraph.find(nIDGraph); if(it!=m_mapGraph.end()) //El grafo existe, eliminarlo { delete it->second; m_mapGraph.erase(it); } }

La implementacin de todo el marco de trabajo de grafos est disponible para su descarga desde el repositorio de documentos de ste curso. En esa solucin de Visual Studio 2008, encontrar un programa principal que le servir de ejemplo de uso.

Grado o valencia de un vrtice


Dado un grafo G(V, E), el grado o valencia d(v) de un vrtice v V es el nmero de aristas que inciden sobre ese vrtice. Se dice que una arista incide en un vrtice si para una arista e E se da que v e. Es decir, una arista incide en un vrtice si tiene como elemento a ese vrtice. Formalmente la valencia de un vrtice se define como: 19 Pedro Arturo Cornejo Torres

Centro de Enseanza Tcnica Industrial. d(v):=|{(a,b) E | a = v b = v, v V}|

Inteligencia Artificial

Nota: | | significa cardinalidad, el tamao de un conjunto, como ya se estudi. Ejemplo 9: Sea G(V, E) el siguiente grafo no dirijido:

En este caso d(2) = 2, d(4) = 1, d(5) = 3, d(6) = 0 Cuando se tienen grafos dirigidos: El grado de entrada d+(v) para v V, se define como: d+(v):=|{(a, b) E | a = v, v V}| y el grado de salida d-(v) para v V, se define como: d-(v):=|{(a, b) E | b = v, v V}| Ejemplo 10: Sea G(V,E) el siguiente grafo dirigido o digrafo. 4 2 1 3 5 Los conjuntos de ste digrafo son: V= {1, 2, 3, 4 ,5, 6, 7} E = {(1, 2), (1, 4), (1, 7), (2, 3), (3, 1), (4, 6), (5, 1), (6, 1), (7, 5)} En este caso d+(1) = 3, d+(2) = 1, d+(7) = 1 d-(4) = 1, d-(5) = 1, d-(3) = 1 20 Pedro Arturo Cornejo Torres 6

Centro de Enseanza Tcnica Industrial.

Inteligencia Artificial

Adyacencia de vrtice
Sea G(V, E) un grafo. Se dice que dos vrtices v,w V son adyacentes si existe una arista (a, b) E que las relacione. La adyacencia Adj(v) E de un vrtice v V, es el conjunto de las aristas {(a, b) E | a = v b = v, v V}. En esta definicin es semejante a la definicin de grado o valencia, sin embargo, ahora no interesa el nmero de aristas, sino cules aristas. De manera semejante, en caso de utilizar dgrafos, resultan interesantes las siguientes definiciones: Adyacencia de Entrada. Adj+(v) := {(a, b) E | a = v, v V} Adyacencia de Salida. Adj-(v) := {{(a, b) E | b = v, v V} Resulta claro que a partir estas definiciones: Adj(v) = Adj+(v) Adj-(v) y d(v) = d+(v) + d-(v)

Tarea: Implemente en alguna plataforma de programacin los grafos que se definen en los ejemplos 9 y 10 y resulvanse los siguientes problemas mediante computador: Para cada vrtice en el grafo del ejemplo 9 (grafo no dirigido) a) Los conjuntos de adyacencia por vrtice. b) Las valencias. Para cada vrtice en el grafo del ejemplo 10 (dgrafo) a) Los conjuntos de adyacencia de entrada. b) Los conjuntos de adyacencia de salida. c) Los conjuntos de adyacencia. d) Las valencias de salida e) Las valencias de entrada f) Las valencias. Revisin de trabajos terminados, prximo martes 21 de octubre de 2008. Si tiene dudas, envelas al foro de dudas del curso en lnea.

21

Pedro Arturo Cornejo Torres

Centro de Enseanza Tcnica Industrial.

Inteligencia Artificial

Unidad 2 Introduccin a la Inteligencia Artificial


Bsquedas Ciegas.
Bsqueda en Profundidad
La Bsqueda en profundidad (en ingls DFS o Depth First Search) es un algoritmo que permite recorrer todos los vrtices de un grafo o rbol de manera ordenada, pero no uniforme. Su funcionamiento consiste en ir expandiendo todos y cada uno de los vrtices que va localizando, de forma recurrente, en un camino concreto. Cuando ya no quedan ms vrtices que visitar en dicho camino, regresa (Backtracking), de modo que repite el mismo proceso con cada uno de los hermanos del vrtice que ya ha procesado. La expansin es el conjunto de vrtices que se obtienen del conjunto de adyacencia de salida. Es decir, la relacin de adyacencia de salida de un vrtice v, expande a v. En este caso formalmente para un grafo G(V, E), la expansin se define como: expansion(v):={ b V | (a, b) Adj-(v) } Con el objetivo de poder conocer las trayectorias backtraking generadas por la bsqueda, es necesario definir la siguiente propiedad del vrtice. parent(v):= Es un vrtice w V, tal que w es padre de v. Al ser propiedad de los vrtices, debe agregarse una nueva variable miembro a la clase CVertex para indicar la llave del vrtice que es padre de ste vrtice. Tambin, es recomendable agregar dos mtodos de acceso a la propiedad, en este caso, los mtodos GetParent, SetParent. GetParent lee la variable miembro para leer la llave del vrtice padre y SetParent para establecer el nuevo padre. Para el control de visitas a los nodos, ser necesario, tambin agregar una nueva variable miembro de tipo booleano que indique si el nodo ha sido o no visitado por el algoritmo de bsqueda. visit(v) := Es verdadero si el nodo ha sido visitado, falso en caso de no haber sido visitado. Del mismo modo en que la propiedad parent, deber agregar esa bandera como parte de la clase CVertex, luego crear los mtodos de acceso a dicha bandera: SetVisit y GetVisit. Otros nombres ms claros para estos mtodos pudieran ser: SetVisited y AlreadyVisited respectivamente. Con las definiciones anteriores, es posible establecer el siguiente mtodo de bsqueda en profundidad:

22

Pedro Arturo Cornejo Torres

Centro de Enseanza Tcnica Industrial.

Inteligencia Artificial

Algoritmo DFS: Sea G(V,E) un grafo cualquiera. Sean source,dest V dos vrtices de origen y meta respectivamente, y para todo vrtice v V, visit(v):=false inicialmente, entonces la bsqueda en profundidad se define como: DeepFirstSearch(G, source, dest) Boolean for each v expansion(source) do if not visit(v) then visit(v) := true; //Marcar el vrtice como visitado. parent(v):= source; //Marcar el padre del vrtice para backtraking. if v is equal to dest then return true; // v es alcanzable desde source, solucin base. endif if DeepFirstSearch(G, v, dest) then //Recurrencia DFS return true; //Se ha encontrado solucin de source a dest endif endif endfor return false; //No se ha encontrado solucin Una vez que se tiene una respuesta afirmativa del algoritmo, la trayectoria se puede iterar al invertir el backtraking que comienza en dest y termina en source. Esto se puede hacer de manera recurrente haciendo uso de la propiedad parent. La impresin de la trayectoria queda de tarea para el lector. Caractersticas del algoritmo. Es completo ya que el algoritmo tiene la habilidad de encontrar una solucin si es que existe y si no existe una solucin, ste indica que no esposible encontrar una solucin. No es ptimo, ya que el algoritmo eventualmente no encuentra la solucin optima.

Sin embargo, es claro que el algoritmo es muy fcil de implementar y su consumo de memoria es reducido.

Bsqueda en Amplitud
La bsqueda en amplitud (en ingls Breadth First Search o BFS) para recorrer o buscar elementos en un grafo. Formalmente el algoritmo BFS de bsqueda sin informacin o ciega, el cual, explora los nodos sistemticamente y de forma exaustiva como en DFS.

Utilizando las propiedades de los vrtices que definimos para la bsqueda en profundidad, es posible formalizar el algoritmo BFS. Adems, definiremos una estructura de datos cola o queue para almacenar los vrtices que an no se les ha expandido.

23

Pedro Arturo Cornejo Torres

Centro de Enseanza Tcnica Industrial.

Inteligencia Artificial

Algoritmo BFS: Sea G(V, E) un grafo cualquiera y source, dest V dos vrtices origen y destino respectivamente, para todo vrtice v V, visit(v):=false inicialmente y sea Q V una cola vaca, entonces la bsqueda en amplitud se define como: BreadthFirstSearch(G, source, dest) Boolean Q.Push(source); //Encolar a source visit(source):=true; //Marcar como visitado a source while Q do v:=Q.Pull(); //Extraer de la cola a v for each w expansion(v) do if not visit(w) then visit(w):=true; //Marcar como visitado parent(w):=v; //Establecer ancestro Q.Push(w) if w is equal to dest then return true; //Solucin se ha encontrado endif endif endfor endwhile return false; //No se ha encontrado solucin y todo el grafo ha sido analizado. Nota: Los mtodos push y pull a los cuales se hace referencia en el algoritmo anterior, corresponden a la semntica de operacin de una cola. Estos nombres tambin se utilizan indistintamente en caso de pilas. Para evitar ambigedades se acostumbra definir previamente el tipo de contenedor a utilizar. Caractersticas del algoritmo: Es completo, porque el algoritmo es capaz de encontrar la solucin si es que sta exista y reporta la imposibilidad de encontrarla en caso de no existir solucin. Es ptima, ya que siempre encuentra la trayectoria ms corta entre todas las soluciones posibles. Este algoritmo tambin es sencillo de implementar ya que a diferencia de DSF, BFS requiere de una cola para analizar el grafo.

EXAMEN PRCTICO DEL SEGUNDO PARCIAL Implemente en alguna plataforma de programacin, los algoritmos de bsquedas ciegas que ya han sido descritos y prubelos en el siguiente grafo no dirigido primero y luego con el segundo grafo. Cuando los algoritmos reporten la existencia de la solucin, imprima la secuencia de vrtices que comienza en el origen hasta terminar en el destino.

24

Pedro Arturo Cornejo Torres

Centro de Enseanza Tcnica Industrial.

Inteligencia Artificial

Este examen es para entregarse el prximo martes 4 de noviembre de 2008.

25

Pedro Arturo Cornejo Torres

Вам также может понравиться