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.

martes, 4 de septiembre de 2012

Proyecto 1 - Semáforo


Introducción

Se ha finalizado nuestro proyecto del cruce con semáforos. La idea es que si hay muchos coches en cierta fila o carril, se le de prioridad a ese carril para que pueda ser el tráfico un poco más fluído. Este sistema es completamente adaptativo.


 Desarrollo




Primero se tenía pensado un cruce de 4 carriles, pero se decidió cambiar el diseño a este otro, en el cual se pueden hacer 6 movimientos distintos en cuanto a los coches, el de los peatones no se toma en cuenta. Son 6 semáforos para coches, los cuales tienen 2 funciones; dar vuelta y seguir derecho. Como se mencionó, el semáforo de los peatones en sí no realiza interferencia alguna con los demás, pero sí le aporta un poco de realismo al programa.



Se hicieron los diagramas correspondientes para poder analizar qué opciones se tenían para realizar el programa y cómo se iba a realizar. A final de cuentas, se pudo desarrollar un sistema en el cual no hubiera ningún conflicto de choques o errores en el programa.

A continuación se muestra un video del programa en ejecución.





Una parte importante del código es donde se adapta el sistema a los coches, ya que es lo que interesa en esta clase. Una pequeña porción del código es la siguiente:




Para poder ver el código completo del programa, el link es el siguiente:



Conclusiones


Como conclusión se tiene que en la vida diaria, se necesitan más sistemas adaptativos. Actualmente hay muchos vehículos en circulación, y lamentablemente el sistema de tránsito de México es muy deficiente, por lo cual no está optimizado. Los sistemas adaptativos son de gran importancia para la vida moderna, ya que se trata de que las computadoras, en este caso, hagan las cosas por sí solas sin tener que hacerlo manualmente. En este caso se trabajó con un cruce y semáforos, pero es aplicable a muchos casos de la vida diaria.