martes, 27 de noviembre de 2012

Proyecto Final

A continuación ponemos la presentación que utilizamos en clase:




Después de esto, el video de la página funcionando:




Por último, un enlace para bajar el código completo:

http://www.mediafire.com/?kawn5s6nh3ykl1v

viernes, 23 de noviembre de 2012

Extras



Estos son los links de las publicaciones extras realizadas en el blog con el fin de ser tomadas en cuenta para la calificación final de la clase de Sistemas Adaptativos.

Agentes Inteligentes
http://sistemas-adaptativos-fime.blogspot.mx/2012/11/agentes-inteligentes.html

Caos
http://sistemas-adaptativos-fime.blogspot.mx/2012/11/caos.html

Lógica difusa y sistemas expertos
http://sistemas-adaptativos-fime.blogspot.mx/2012/11/logica-difusa.html

Redes neuronales artificiales
http://sistemas-adaptativos-fime.blogspot.mx/2012/11/redes-neuronales-artificiales.html

Agentes Inteligentes


Caos



Teoría del caos es la denominación popular de la rama de las matemáticas, la física y otras ciencias que trata ciertos tipos de sistemas dinámicos muy sensibles a las variaciones en las condiciones iniciales. Pequeñas variaciones en dichas condiciones iniciales pueden implicar grandes diferencias en el comportamiento futuro; complicando la predicción a largo plazo. Esto sucede aunque estos sistemas son en rigor determinísticos, es decir; su comportamiento puede ser completamente determinado conociendo sus condiciones iniciales.

Clasificación


Los sistemas dinámicos se pueden clasificar básicamente en:
  • Estables
  • Inestables
  • Caóticos

Un sistema estable tiende a lo largo del tiempo a un punto, u órbita, según su dimensión (atractor o sumidero). Un sistema inestable se escapa de los atractores. Y un sistema caótico manifiesta los dos comportamientos. Por un lado, existe un atractor por el que el sistema se ve atraído, pero a la vez, hay "fuerzas" que lo alejan de éste. De esa manera, el sistema permanece confinado en una zona de su espacio de estados, pero sin tender a un atractor fijo.

Una de las mayores características de un sistema inestable es que tiene una gran dependencia de las condiciones iniciales. De un sistema del que se conocen sus ecuaciones características, y con unas condiciones iniciales fijas, se puede conocer exactamente su evolución en el tiempo. Pero en el caso de los sistemas caóticos, una mínima diferencia en esas condiciones hace que el sistema evolucione de manera totalmente distinta. Ejemplos de tales sistemas incluyen el Sistema Solar, las placas tectónicas, los fluidos en régimen turbulento y los crecimientos de población.



Aplicaciones


La Teoría del Caos y la matemática caótica resultaron ser una herramienta con aplicaciones a muchos campos de la ciencia y la tecnología. Gracias a estas aplicaciones el nombre se torna paradójico, dado que muchas de las prácticas que se realizan con la matemática caótica tienen resultados concretos porque los sistemas que se estudian están basados estrictamente con leyes deterministas aplicadas a sistemas dinámicos.
En Internet se desarrolla este concepto en Teoría del Caos, el tercer paradigma, de cómo la estadística inferencial trabaja con modelos aleatorios para crear series caóticas predictoras para el estudio de eventos presumiblemente caóticos en las Ciencias Sociales. Por esta razón la Teoría del Caos ya no es en sí una teoría: tiene postulados, fórmulas y parámetros recientemente establecidos con aplicaciones, por ejemplo, en las áreas de la meteorología o la física cuántica, y actualmente hay varios ejemplos de aplicación en la arquitectura a través de los fractales, por ejemplo el Jardín Botánico de Barcelona de Carlos Ferrater.


A continuación mostramos un video sobre este tema con una explicación más dinámica y sencilla.





Lógica Difusa

A continuación mostramos un video con una excelente explicación acerca de la lógica difusa y, como extra, sistemas expertos.



Redes Neuronales Artificiales





Las redes de neuronas artificiales (denominadas habitualmente como RNA o en inglés como: "ANN" ) son un paradigma de aprendizaje y procesamiento automático inspirado en la forma en que funciona el sistema nervioso de los animales. Se trata de un sistema de interconexión de neuronas en una red que colabora para producir un estímulo de salida. En inteligencia artificial es frecuente referirse a ellas como redes de neuronas o redes neuronales.


Propiedades


Una red neuronal se compone de unidades llamadas neuronas. Cada neurona recibe una serie de entradas a través de interconexiones y emite una salida. Esta salida viene dada por tres funciones:

1. Una función de propagación (también conocida como función de excitación), que por lo general consiste en el sumatorio de cada entrada multiplicada por el peso de su interconexión (valor neto). Si el peso es positivo, la conexión se denomina excitatoria; si es negativo, se denomina inhibitoria.

2. Una función de activación, que modifica a la anterior. Puede no existir, siendo en este caso la salida la misma función de propagación.

3. Una función de transferencia, que se aplica al valor devuelto por la función de activación. Se utiliza para acotar la salida de la neurona y generalmente viene dada por la interpretación que queramos darle a dichas salidas. Algunas de las más utilizadas son la función sigmoidea (para obtener valores en el intervalo [0,1]) y la tangente hiperbólica (para obtener valores en el intervalo [-1,1]).




Ventajas



Las redes neuronales artificiales (RNA) tienen muchas ventajas debido a que están basadas en la estructura del sistema nervioso, principalmente el cerebro.

·         Aprendizaje: Las RNA tienen la habilidad de aprender mediante una etapa que se llama etapa de aprendizaje. Esta consiste en proporcionar a la RNA datos como entrada a su vez que se le indica cuál es la salida (respuesta) esperada.

·         Auto organización: Una RNA crea su propia representación de la información en su interior, descargando al usuario de esto.

·         Tolerancia a fallos: Debido a que una RNA almacena la información de forma redundante, ésta puede seguir respondiendo de manera aceptable aun si se daña parcialmente.

·         Flexibilidad: Una RNA puede manejar cambios no importantes en la información de entrada, como señales con ruido u otros cambios en la entrada (por ejemplo si la información de entrada es la imagen de un objeto, la respuesta correspondiente no sufre cambios si la imagen cambia un poco su brillo o el objeto cambia ligeramente).

·         Tiempo real: La estructura de una RNA es paralela, por lo cual si esto es implementado con computadoras o en dispositivos electrónicos especiales, se pueden obtener respuestas en tiempo real.



Aprendizaje


Una segunda clasificación que se suele hacer es en función del tipo de aprendizaje de que es capaz (si necesita o no un conjunto de entrenamiento supervisado). Para cada tipo de aprendizaje encontramos varios modelos propuestos por diferentes autores:

·         Aprendizaje supervisado: necesitan un conjunto de datos de entrada previamente clasificado o cuya respuesta objetivo se conoce. Ejemplos de este tipo de redes son: el perceptrón simple, la red Adaline, el perceptrón multicapa, red backpropagation, y la memoria asociativa bidireccional.

·         Aprendizaje no supervisado o autoorganizado: no necesitan de tal conjunto previo. Ejemplos de este tipo de redes son: las memorias asociativas, las redes de Hopfield, la máquina de Boltzmann y la máquina de Cauchy, las redes de aprendizaje competitivo, las redes de Kohonen o mapas autoorganizados y las redes de resonancia adaptativa (ART).

·         Redes híbridas: son un enfoque mixto en el que se utiliza una función de mejora para facilitar la convergencia. Un ejemplo de este último tipo son las redes de base radial.

·         Aprendizaje reforzado: se sitúa a medio camino entre el supervisado y el autoorganizado.




Aplicaciones


Las características de las RNA las hacen bastante apropiadas para aplicaciones en las que no se dispone a priori de un modelo identificable que pueda ser programado, pero se dispone de un conjunto básico de ejemplos de entrada (previamente clasificados o no). Asimismo, son altamente robustas tanto al ruido como a la disfunción de elementos concretos y son fácilmente paralelizables.

Esto incluye problemas de clasificación y reconocimiento de patrones de voz, imágenes, señales, etc. Asimismo se han utilizado para encontrar patrones de fraude económico, hacer predicciones en el mercado financiero, hacer predicciones de tiempo atmosférico, etc.

También se pueden utilizar cuando no existen modelos matemáticos precisos o algoritmos con complejidad razonable, por ejemplo la red de Kohonen ha sido aplicada con un éxito más que razonable al clásico problema del viajante (un problema para el que no se conoce solución algorítmica de complejidad polinómica).

Otro tipo especial de redes neuronales artificiales se ha aplicado en conjunción con los algoritmos genéticos (AG) para crear controladores para robots. La disciplina que trata la evolución de redes neuronales mediante algoritmos genéticos se denomina Robótica Evolutiva. En este tipo de aplicación el genoma del AG lo constituyen los parámetros de la red (topología, algoritmo de aprendizaje, funciones de activación, etc.) y la adecuación de la red viene dada por la adecuación del comportamiento exhibido por el robot controlado (normalmente una simulación de dicho comportamiento).



jueves, 8 de noviembre de 2012

Reporte 4 - Investigación

JADE



Es una plataforma software para el desarrollo de agentes, implementada en Java. JADE crea múltiples contenedores para los agentes, cada uno de los cuales puede ejecutarse en uno o en varios sistemas. Un conjunto de contenedores constituye una plataforma.
Cada plataforma debe tener un contenedor principal que tiene dos agentes especiales denominados AMS y DF.

El AMS (Agent Management System) controla la plataforma. Es el único que puede crear y destruir a otros agentes, destruir contenedores y parar la plataforma. El DF (Directory Facilitator) proporciona un directorio que anuncia qué agentes hay disponibles en la plataforma.

Un agente JADE cumple las siguientes características:
  • Tiene un nombre único en el entorno de ejecución.
  • Se implementa como un único hilo de ejecución (single-threaded).
  • Tiene un metodo de inicio (setup) y otro de fin (takeDown).
  • El método protegido setup() sirve para inicializar el agente incluyendo instrucciones que especificarán la ontología a utilizar y los comportamientos asociados al agente. Se invoca al comenzar la ejecución del agente.
  • El método protegido takeDown() sirve para liberar recursos antes de la eliminación del agente. Este método es invocado cuando se realiza una llamada al método doDelete(), que es el que realmente da por finalizada la ejecución del agente.
  • Ambos métodos deben ser sobreescritos.


SPADE



SPADE es una plataforma libre de sistemas multi-agente desarrollada en Python y basada en la tecnología de mensajería instantánea XMPP. Algunas de las características más notables de la plataforma SPADE son: soporte de organizaciones virtuales, notificación de presencia, compatible con FIPA e independencia del lenguaje y la plataforma.

SPADE es una plataforma de sistemas multi-agente desarrollada en 2005 en la Universidad Politécnica de Valencia. La plataforma nació como una prueba de concepto para probar la tecnología de la mensajería instantánea como protocolo de transporte para los agentes inteligentes. Desde ese momento el proyecto ha seguido creciendo y añadiendo nuevas características aprovechando la flexibilidad del protocolo de mensajería instantánea basado en XML y la cantidad de extensiones desarrolladas para el mismo que son aprovechables dentro del marco de los sistemas multi-agente. La plataforma SPADE está basada en un conjunto de estándares, siendo los más destacables FIPA y XMPP/Jabber.

Las principales características de la plataforma SPADE son:

  •  Soporte del estándar FIPA mediante el protocolo de mensajería instantánea XMPP (Agentes AMS y DF incluídos)
  • Notificación de presencia entre agentes.
  • Organizaciones Virtuales basadas en el protocolo de multi-conferencia MUC.
  • Comunicación P2P entre agentes.
  • Invocación remota de servicios entre agentes usando el estándar XML-RPC.
  • Procesadores de lenguajes de contenido en SL0 y RDF.
  • Modelo de agente BDI basado en Conocimiento, Deseos e Intenciones.
  • Modelo de comportamientos: Cíclicos, Periódicos, Timeout, una ejecución, máquina de estados finita y basado en eventos.
  • Soporte de comunicación con otras plataformas mediante diversos protocolos de transporte: JADE (via HTTP o XMPP) y SIMBA.
  • Publicación y subscripción de eventos mediante el estándar PubSub.
  • Interfaz gráfica basada en web.




MADKit



MADKit es una plataforma multiagente para desarrollar y ejecutar aplicaciones basadas en un paradigma orientado a la organización. Estos paradigmas multiagente utilizan agentes, grupos y roles como los puntos bases para construir aplicaciones complejas. MADKit no fuerza ninguna consideración acerca de la estructura interna de los agentes, de esta manera permite a los desarrolladores implementar libremente sus propias arquitecturas de agentes.

MADKit es también una plataforma distribuida que permite el desarrollo de eficientes aplicaciones distribuidas. Para los programadores, todas las consideraciones acerca de componentes  distribuidos básicos tales como “sockets” y “ports”, son totalmente transparentes. Una aplicación desarrollada en una manera multiagente puede ser ejecutada de una manera distribuida sin cambiar ninguna línea de código. Los mecanismos de distribución de MADKit no utilizan las técnicas bastante lentas de RMI o CORBA de acceso remoto, de esta manera permite un modo eficiente de comunicación.

MADKit está construido alrededor del concepto de micro-kernel y agentificación de servicios.
El kernel de MADKit es más bien pequeño, pero los agentes ofrecen los servicios importantes que se pueden necesitar para las aplicaciones. Distribución y pasaje remoto de mensajes, monitoreo y observación de agentes, edición, etcétera, son todas realizadas por agentes. MadKit provee un conjunto de “contenedores”, esto es entornos de ejecución para correr aplicaciones, con el objetivo de que MadKit trabaje en diferentes situaciones: como un entorno de desarrollo, pero también como una herramienta embebida para aplicaciones.



ROBOCUP



RoboCup es un proyecto internacional fundado en 1997 para promover, a través de ompetencias integradas por robots autónomos, la investigación y educación sobre inteligencia artificial.

La iniciativa está dividida en cuatro grandes competencias. Cada una de ellas tiene varias ligas internas dependiendo de la modalidad.

RoboCupSoccer

Es una competencia de fútbol con robots autónomos.
El objetivo oficial del proyecto es conseguir para mediados del siglo XXI un equipo capaz de vencer al ganador de la Copa Mundial de la FIFA siguiendo sus propias reglas.

RoboCupRescue

Se trata de poner a prueba a los robots para tareas de búsqueda y salvamento de víctimas en terreno desfavorable. Los robots pueden ser tanto autónomos como guíados por control remoto.

RoboCupJunior

Intenta acercar las metas y objetivos de Robocup a estudiantes de educación primaria y secundaria.

RoboCup@Home

Competencia añadida en la edición del 2006 celebrada en Bremen (Alemania) que se centra en la aplicación de robots autónomos en la vida diaria y en las relaciones hombre-robot derivadas.

domingo, 4 de noviembre de 2012

Reporte 1: Programa del ventilador



En este reporte simulamos un ventilador por medio de un programa escrito en lenguaje C. El código es el siguiente:



http://pastebin.com/FF3az7pV


En el código lo que hicimos fue que nos brindara opciones para poder cambiar el modo de función, la temperatura, condiciones de ahorro de energía y que sólo funcionara como ventilador. El código en sí es muy sencillo, funciona con casos que son las opciones que se brinda, sin embargo es efectivo. A continuación veremos un video del programa en ejecución.




jueves, 1 de noviembre de 2012

Práctica 3: Reconocimiento de ojos

Introducción


En esta entrada vamos a presentar el proyecto 3 del laboratorio de Sistemas Adaptativos, el cual consiste en un programa escrito en lenguaje C que detecta los ojos de las personas en una cámara web.

Objetivo

El objetivo de esta práctica es conocer un poco más sobre el funcionamiento de sistemas inteligentes para reconocer patrones.


Justificación


En esta práctica 3 decidimos hacer un programa de reconocimiento facial, que detecte específicamente los ojos de los usuarios. Anteriormente habíamos pensado hacer un programa que fuera una calculadora que reconociera los caracteres dibujados en la pantalla y realizara las operaciones correspondientes. Lo pensamos mucho, pero tuvimos una serie de inconvenientes, por lo cual decidimos cambiar de proyecto. Uno de ellos fue que al momento de hacer las multiplicaciones o las sumas, se tenía que "despegar" el cursor de la pantalla. Es decir, había que hacer dos clics para poder formar la cruz o la X. Por lo tanto no funcionaba y lo podía tomar como una división o número, o simplemente ignorarlo. Por lo tanto no iba a quedar como debía ser. 




Desarrollo





Se utilizó la librería OpenCV, la cual es para reconocimiento de patrones. Sin esta librería no hubiésemos podido realizar la práctica, o al menos no así de sencillo. El lenguaje seleccionado en este caso fue Python. El código utiliza gran parte de estas librerías. Decidimos centrarnos en los ojos ya que casi todos se centran en el rostro completo; nosotros quisimos hacer algo un poco diferente.

Primero en nuestro código asignamos ciertas variables, como por ejemplo dónde está el archivo XML que contiene el "entrenamiento" para poder detectar la vista. Después cargamos el reconocimiento y comenzamos a hacer una serie de especificaciones para que se pueda reconocer mejor la imagen. También asignamos cómo se definen los ojos, qué forma queremos que los enmarque y qué color, en nuestro caso el rojo. Al final mencionamos que al presionar la tecla "q" se salga del programa. Básicamente esto es lo que hicimos, dejamos el código y después un video.



http://pastebin.com/cPiJYHes


http://youtu.be/ULsCxVVc7n0

Resultado y conclusiones

Como resultado obtenemos un programa que efectivamente detecta la mirada, pero como podemos apreciar en el video, todavía falta mejorarlo un poco, ya que en ocasiones no reconoce bien. A este programa probablemente se le pueda dar más funcionalidad, pero eso requerirá un poco más de análisis.

lunes, 29 de octubre de 2012

Proyecto: Entrega 3

Resumen del proyecto

 



El proyecto que estamos desarrollando es un sistema de una tienda en línea, en la cual la parte adaptativa será ofrecerle al cliente determinados productos según el registro de productos que haya visitado y/o comprado anteriormente. Esto es para poder ofrecerle lo que necesita desde el momento en el que ingresa a nuestra página. Para mejores resultados y mayor comodidad del usuario, se va a poder crear una cuenta, en la cual se van a registrar las compras del usuario. El proyecto se ha mantenido como lo teníamos planeado anteriormente, no han habido cambios relevantes.

 

Avance con respecto a la planeación




¿Qué se ha hecho?

Hasta el momento hemos avanzado mucho en cuestiones de código. Cabe destacar que no todo en el código es adaptativo. Hemos estado trabajando en la forma en la cual se van a mostrar los artículos, qué sería lo más cómodo para el usuario y de qué forma pudiesemos hacer la interfaz más agradable para el usuario. También consideramos a las personas que pudiesen tener alguna dificultad visual, ya que la interfaz debe ser igual de efectiva para todo el público.



¿Qué falta?

Estamos consientes de que no tenemos toda la codificación completa, pero creemos tener la mayor parte de ella. Nos centramos más en la codificación que en la interfaz, por lo tanto es en lo que más necesitamos trabajar. Todavía no tenemos bien implementada la parte adaptativa, pero seguimos trabajando en eso. No hemos hecho pruebas, ya que esperamos a que esté todo terminado para poderlas realizar. Seguimos el consejo de dejar la parte de la recuperación de contraseña para después, y tratamos de enfocarnos en la parte adaptativa.


¿Qué problemas se han presentado y cómo los has resuelto / piensas resolverlos?

La falta de experiencia es un problema que nos ha estado siguiendo desde el principio del proyecto, ya que no habíamos trabajado con este tipo de lenguaje ni en esta forma. Poco a poco nos hemos ido acostumbrando y podemos lidiar con este inconveniente. Otro problema es que no siempre estamos todos disponibles para trabajar en equipo, ya que por cuestiones laborales, escolares o personales en ocasiones nos resulta imposible podernos juntar para trabajar. Esto lo hemos estado solucionando trabajando sólo los que estamos en ese momento, y hasta ahora nos ha funcionado.


Lista actualizada de recursos y herramientas




La lista de herramientas prácticamente se mantiene igual. Utilizaremos HTML, XHTML, CSS, MySQL y NetBeans.

En cuanto a herramientas que nos ayudan a continuar con el proyecto, podemos referenciar cursos en internet, ya que son muy útiles y en eso nos hemos estado basando para seguir con el proyecto.


Primera versión del sistema

 

A continuación mostraremos ciertas porciones del código con sus debidos comentarios de partes importantes en nuestro programa.





Ahora vamos a mostrar un video explicativo del código. Este video está alojado en Youtube.


jueves, 18 de octubre de 2012

Avance practica 3: Reconocimiento de patrones


Introducción




El tema correspondiente a la unidad 3 es el de Sistemas Inteligentes, los cuales son programas de computación que reciben información de su entorno. Pueden actuar y tienen una memoria para archivar el resultado de sus acciones. Su objetivo es ir inspeccionando su memoria para aprender de su experiencia mejorando el rendimiento y eficiencia. En esta práctica se desea emplear una técnica de reconocimiento de patrones.

Objetivo



Para esta Unidad de Aprendizaje se planea crear un sistema que sea capaz de reconocer valores y operadores numéricos escritos por el usuario en un panel gráfico para después efectuar la operación especificada.

Justificación



Creemos que el reconocimiento de patrones a través de redes neuronales es muy interesante, una prueba de ello es que en la actualidad existen diversas aplicaciones que implementan esto. Algunos ejemplos son las aplicaciones lectoras de códigos QR y también las aplicaciones que escanean fotos o imágenes en busca de información (Google gloogles), es por eso que deseamos incursionar en esta área.

viernes, 21 de septiembre de 2012

Práctica 2 - Algoritmos Genéticos


Introducción


Los algoritmos genéticos son llamados así porque se inspiran en la evolución biológica y su base genético-molecular. Estos algoritmos hacen evolucionar una población de individuos sometiéndola a acciones aleatorias semejantes a las que actúan en la evolución biológica, así como también a una selección de acuerdo con algún criterio, en función del cual se decide cuáles son los individuos más adaptados, que sobreviven, y cuáles los menos aptos, que son descartados. 



Nuestro programa lo que busca es encontrar la forma en la cual podamos invertir nuestro dinero para comprar determinados objetos, después venderlos y así incrementar nuestro capital.

Objetivo y Justificación


Decidimos realizar este programa ya que notamos que la mayoría de nuestros compañeros iban a desarrollar el programa de autómatas celulares. Queríamos realizar algo diferente. El objetivo principal es aprender, ya que cada proyecto tiene un grado de dificultad diferente, y en este caso, el tiempo no estuvo a nuestro favor.

Al realizar este programa tuvimos ciertos problemas. El más importante fue el de manejar diferentes tipos de datos, llámese strings, chars, ints, etcétera. Se tuvo que tener mucha precaución con la conversión de cada uno de estos tipos.


Desarrollo


Lo que se hizo fue tratar de dividir el programa en varios modulos de acuerdo a su función, primero se generaron aleatoriamente los datos de costo y venta de cada articulo así como el capital inicial. Despues se genero la interfaz y luego se implemento el algoritmo genetico, el cual se analizará en esta sección. Por último, se usó un librería para crear el histograma.


Lo anterior muestra los pasos usados en la clase que se encarga de implementar el algoritmo genético.
- Primero se calculan las ganancias de cada objeto
- Despues se creá una poblacion inicial aleatoria de combinaciones de objetos

Luego el programa entra en un ciclo para repetir los siguientes pasos y crear varias generaciones de individuos, buscando siempre una solución óptima para nuestro problema. Estos pasos son:

- Evaluar a cada uno de los individuos de la poblacion para saber si es rentable esa combinación de objetos
- Crear un arreglo, el cual representará a una ruleta que contendrá a los individuos mas aptos de la población actual y nos servirá a la hora de elegir a los mejores para cruzarlos
- Eligir 2 individuos y los cruza (combina) para tratar de generar una mejor combinación de objetos
- Cambiar algunos genes en el individuo (mutar)
- Muestra la nueva generacion de individuos


Otras partes importantes de la clase:

Método para la evaluación de los individuos 



Método para la cruza de los individuos



Para ver el código completo, visitar el siguiente enlace:


http://pastebin.com/8XLFhVuD


Entrando un poco más en el código, utilizamos 6 clases, las cuales se describen brevemente a continuación.

Datos. Contiene los datos con los que vamos a trabajar, los cuales se comparten entre las diferentes clases.

GenerarDatos. Clase cuya única función es generar datos aleatorios a los precios de compra y venta de cada artículo, así como el capital inicial.

Mochila. En esta clase se implementa el algoritmo genético para la resolución del problema.

Ventana. Esta es la parte gráfica de la aplicación, la interfaz.

Graficos. Esta clase crea un histograma con los datos de las generaciones que se fueron creando durante la ejecución del programa.

Main. Clase principal.



Simulación


Aquí una muestra de nuestro programa en ejecución en tiempo real.


 

Conclusiones



El uso de los algoritmos genéticos es ideal cuando se requiere encontrar un valor máximo o un valor mínimo en donde se tiene un mundo de soluciones muy grande. Consiste en un método iterativo donde la intención es ir encontrando, en cada iteración, soluciones mas óptimas que las que encontramos en iteraciones anteriores. Este método no garantiza encontrar la solución mas óptima, pero si puede encontrar una solución muy cercana a esta.

Se podría mejorar implementando una función que revise las aptitudes de los mejores individuos de las ultimas generaciones para conocer si se ha encontrado un progreso en la búsqueda de una respuesta óptima en las ultimas generaciones, ya que asi conoceremos cuando parar o terminar nuestro programa.




Biblioteca usada para crear la gráfica: 
http://www.jfree.org/index.html

jueves, 20 de septiembre de 2012

Proyecto - Entrega 2


Resumen del proyecto


El proyecto que estamos desarrollando es el de una tienda en línea, en la cual el comprador puede crear una cuenta, con un nombre de usuario y contraseña, para poder realizar las compras, además de tener más control sobre la cuenta. Con esto el usuario puede guardar sus datos personales, así como personalizar su cuenta. 

Otra cosa que se puede hacer, es guardar la información de la tarjeta de crédito con la cual se realizan las compras, de tal forma que el cliente no tenga que estar ingresando los dígitos de la tarjeta en cada compra.

La parte adaptativa del proyecto viene cuando, en base a lo que el usuario haya comprado anteriormente o los productos que haya visitado, se le hacen sugerencias sobre qué comprar. Incluso se guardan las últimas compras realizadas, para si el usuario es un comprador recurrente, pueda seleccionar rápidamente el artículo que desea, sin necesidad de estar navegando por el catálogo de productos.

Sobre el catálogo de productos, estará dividido en determinadas categorías, para que sea de fácil identificación.


Cambios


Uno de los cambios más importantes es qué tipo de tienda será la que vamos a manejar. Inicialmente teniamos planeado que iba a ser una tienda en línea en la cual se vendieran tortillas y derivados del maíz, pero platicamos acerca del tema y es algo que tiene poca variedad, además de que comúnmente no se compran esos productos por internet. Nuestra tienda todavía no tiene logotipo ni nombre, es algo en lo que estamos trabajando todavía.

Otro cambio fue el que, anteriormente, nuestro proyecto no tenía bien definida la parte adaptativa. Lo que hicimos fue agregarle la parte donde se recuerdan las preferencias del usuario y se le dan sugerencias.

Además de esto, cambiamos un poco los roles (los cuales se definirán más adelante), ya que no estábamos tan seguros de qué parte iba a hacer cada integrante.


Avance con respecto a la planeación



El avance que llevamos hasta este momento pudiera parecer poco, pero la verdad es que ninguno de los integrantes habíamos trabajado con algo similar

Lo que hemos hecho hasta el momento es avanzar un poco en el código, lo cual implica aprender más acerca de un código que no conocíamos o casi no manejamos. Definimos roles, llegando a la conclusión de que todos vamos a hacer una parte de cada proceso; es decir, todos los integrantes vamos a participar en todo el proceso, por más pequeña que sea la aportación, para así, además de ser de apoyo, podamos aprender de todo.

Hicimos diagramas y bocetos para darnos una idea de cómo quedaría la página terminada. La razón por la cual están hechos en papel, es porque así podemos modificar la idea inicial rápidamente y en cualquier lugar, sin necesidad de una computadora.

Empezamos a platicar un poco acerca de cómo se llamará la tienda, qué productos incluirá y, otra cosa importante, cómo será el logotipo que estaremos manejando. Consideramos que el logotipo es una de las partes más importantes para reconocer a una empresa, así que cada quien muestra su prototipo para el logotipo. Al final vamos a decidir cuál nos parece el mejor de todos y lo vamos a optimizar.




Lo que nos falta por hacer es, como mencionábamos anteriormente, definir el logotipo y nombre de la tienda, además de detalles mínimos de la misma. Nos falta código, mucho código, el cual tenemos planeado teclear en las próximas semanas, para que pronto podamos tener algo funcional. La interfaz tampoco está definida al 100%, pero consideramos que esto es algo que podemos modificar fácilmente al final. Lo más importante para nosotros es el código "back-end", ya que es el en que nos falta práctica y conocimiento. Básicamente es eso lo que nos falta, sin embargo, nos vamos a llevar un tiempo considerable en la parte del código.





Hemos tenido problemas. Varios problemas. Como ya mencionamos, la falta de conocimiento es el problema más fuerte que tenemos. No es tan fácil manejar un lenguaje que nunca habíamos manejado.

También tuvimos problemas de organización. No nos poníamos de acuerdo en qué hora íbamos a estar trabajando, qué iba a hacer cada quien, ni siquiera en qué proyecto íbamos a realizar. También con los integrantes, ya que algunos no estábamos disponibles por cuestiones laborales, pero es algo en lo que todavía estamos trabajando.

Como dicen, "cada cabeza es un mundo", y eso en ocasiones puede resultar un inconveniente. Cada quien piensa de manera distinta, cada quien tiene diferentes ideas, y lo que en nuestro caso se complicó un poco fue en unirlas todas y que funcionaran bien. Todos teníamos una idea diferente de cómo iba a funcionar este proyecto, de los roles, etcétera, pero a final de cuentas tuvimos que adaptarnos unos a otros para la creación del proyecto. Trabajo en equipo.



Lista actualizada de recursos y herramientas



HTML es prácticamente necesario para poder hacer este proyecto, ya que va a ser una página en línea. Este lenguaje es de los más sencillos.


XHTML también va a ser utilizado en este proyecto.



Para el estilo de las páginas, vamos a utilizar CSS.


Para las bases de datos y SQL, vamos a utilizar MySQL por su practicidad.




Por último, para poder codificar, utilizaremos NetBeans, ya que también es muy fácil de usar.

Hemos considerado utilizar PrimeFaces, pero aún no hemos decidido este punto. Hemos adquirido conocimientos en todas las herramientas que utilizaremos. Pueden no ser de gran magnitud, pero sabemos más de lo que sabíamos antes, y eso es bueno. Algunos de nosotros ya hemos manejado ciertas herramientas, así que sólo nos tenemos que familiarizar con las demás que no hemos manejado todavía.

En Internet hay muchísima información sobre estos lenguajes, pero a destacar podemos nombrar las siguientes páginas:

  1. http://www.programacionweb.net/cursos/curso.php?num=3 - Curso de CSS
  2. http://www.aulaclic.es/html/index.htm - Curso HTML Básico
  3. http://www.librosweb.es/xhtml/ - Curso XHTML
  4. http://deletesql.com/viewforum.php?f=5&sid=0d146728e5d56f52ab29a29b72c59c5a - Curso SQL
Estos son cursos muy buenos que hay en la red. No sólo hemos utilizado esas páginas, pero listarlas todas sería un poco complicado.

Bosquejo de solución


Los módulos más importantes en nuesto sistema serían:

  1. Creación de usuarios. Es la parte donde el comprador va a poder crear su cuenta.
  2. Recuperación de contraseñas. Esto es muy común de utilizar, ya que el usuario tiende a olvidar las contraseñas de sus cuentas.
  3. Publicación de artículos. Esa parte se podría decir que es back-end, ya que el usuario no se da cuenta de cómo se realiza.
  4. Recomendaciones. Esta es la parte adaptativa donde, dependiendo de qué es lo que haya buscado el usuario, es lo que se le va a recomendar que compre.
Hay muchas partes importantes en el sistema, pero cabe mencionar esas, ya que probablemente tengamos un poco de dificultad en ellas por la falta de experiencia.

Algo que podríamos tomar como diagrama, es uno de los prototipos que hemos creado, donde se muestra la página principal, en la cual el usuario todavía no ha iniciado sesión. Se detalla cada parte de la interfaz.


 


Tenemos también el diagrama de Caso-Uso, en donde se definen los roles de los participantes en la página.



Todo esto es parte de todos los avances que tenemos actualmente en el proyecto. Seguimos aprendiendo y avanzando día a día.