viernes, 20 de abril de 2012

[MSDS] Sistemas Caóticos: Geografía Fractal

Un Sistema Caótico es un tipo de Sistema Dinámico . Los Sistemas Dinámicos son sistemas cuyo estado evoluciona con el tiempo.

El comportamiento en dicho estado se puede caracterizar determinando los límites del sistema, los elementos y sus relaciones; de esta forma se puede elaborar modelos que buscan representar la estructura del mismo sistema. Constan de ciertas condiciones iniciales las cuales fijan los estados subsecuentes del sistema.

Asi pues, un Sistema Dinamico se considera caotico cuando es muy sensible 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.

Sistemas Dinámicos y Teoría del Caos es la rama de las Matemáticas que trata acerca del comportamiento cualitativo a largo plazo de un sistema dinámico. No se trata de encontrar soluciones exactas a las ecuaciones que definen dicho sistema dinámico (lo cual suele ser imposible), sino más bien el poder contestar preguntas como "¿A largo plazo, se estabilizará el sistema? ¿Y si lo hace, cuáles serán los estados posibles?" o "¿Variará el estado a largo plazo del sistema, si cambian las condiciones iniciales?"

Una de las mayores características de un sistema inestable es que tiene una gran dependencia de las condiciones iniciales. Esto sucede aunque estos sistemas son en rigor determinísticos, es decir; su comportamiento puede ser completamente determinado conociendo sus 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.

Geografía Fractal


Cuando observamos algún paisaje nunca nos detenemos a pensar en éste llego a tener tal forma. A grandes razgos, nos ponemos a pensar siempre en las fuerzas moldeadoras del planeta tales como el agua y aire (erosion), erupciones volcánicas, movimientos tectónicos, etcetera. Sin embargo, esas curvas graciosas que cubren nuestro planeta son el resultado de un equilibrio de una gran cantidad de variables.

Los relieves que rodean el planeta parecen no tener relación para muchos, sin embargo, cuando nos vamos alejando de la superficie podemos comenzar a notar cierto patron en dichos relieves, los cuales finalmente terminan teniendo un tamaño de kilometros, una forma bien definida y que parece tener cierto orden.

Canales de drenaje pluvial en una cordillera

Y dichas formas caprichosas son el resultado de la gran cantidad de energía que esta debajo de nosotros y que permanece en equilibrio, la cual se manifiesta mediante los terremotos. Las placas se tensan unas a otras, cuando la tensión en cierto momento alcanza un punto critico, esta es liberada, alterando a su vez el paisaje que la rodea y moldeándolo. Ejemplo son las montañas, islas y cordilleras. Podemos ver en las siguientes imágenes como, a pesar de tener formas irregulares a simple vista, en escalas mayores los relieves tienden a conservar un orden Fractal, el cual es mas obvio en las costas marítimas.



Un fractal es un objeto semigeométrico cuya estructura básica, fragmentada o irregular, se repite a diferentes escalas.

Asi por ejemplo: en un mapa mundial podemos ver islas de diferentes tamaños. Su distribución se rige por leyes potenciales rigen si tamaño y forma, por lo que nos encontramos de nuevo ante estructuras fractales. Mientras la distribución de los continentes e islas de gran tamaño son pocas, es muy alta la cantidad de islas y archipielagos.

Modelado de Relieves


El modelado computacional de relieves es un tema tanto sencillo, en su forma mas básica, la propiedad mas importante que necesita ser modelada es la elevación.

La forma más simple es generar una gradiente de grises aleatoriamente distribuida o de colores que después puede ser traducida cono un mapa de relieve o elevaciones para finalmente modelarse en 3D.

El método más utilizado es el llamado Perlin Noise. Este método genera una gradiente de ruido en grises la cual puede utilizarse para crear nubes, fuego o relieves.

Cuando se usa para crear relieves, las partes blancas son relieves altos, las partes negras son relieves bajos o por debajo del nivel del mar


Con este método primeramente se establece un estado inicial, que generalmente es un cuadrado cuyas esquinas tienen asignados valores aleatorios de elevación. Después el cuadrado comienza a subdividirse en cuatro, y a cada nuevo cuadrado se le han de calcular sus nuevas alturas siguiendo un patrón, por ejemplo:


Las elevaciones iniciales son valores generados al azar, los valores intermedios son calculados iterativamente y su computo depende total mente de las condiciones inciales.

Ejemplo del proceso (Wikipedia | Fractal Landscape)


Uno de los problemas del método consiste en que utilizaba solo cuadrados, lo que en la generación de graficas por computadora no es muy atractivo actualmente. El método se complemento con un paso intermedio que agrega en lugar de cuadrados, rombos o diamantes también. A este método se le llamo Diamond-square algorithm.
El beneficio que se obtiene es la generación de gradientes un poco mas naturales, pero no discontinuas, que proporcionan relieves mas realisticos.

Gradiente generada con Diamond Square Algorithm

Si vemos los gradientes asi como asi, se nos hacen aburridos, poco atractivos... lo bueno viene cuando son interpretados por un programa tal como Octave o Matlab, el resultado es algo como esto:


Este tipo de diseño de terrenos es llamado Fractal Landscape, su objetivo es la generación de paisajes naturales mediante fractales. Aunque los paisajes fractales parezcan naturales a primera vista, la exposición repetida puede defraudar a quienes esperen ver el efecto de la erosión en las montañas. La crítica principal es que los procesos fractales simples no reproducen (y quizás no puedan hacerlo) las funciones geológicas y climáticas reales.

Con algo de texturizado y sombreado nos queda un paisaje geográfico bastante real.


Generando Paisajes Fractales


Tuve poco tiempo, base mi código en un tutorial sobre este tema.
Recibe 2 parámetros, la cantidad de iteraciones y el segundo es el nivel de "evolución del terreno".

Básicamente el código lo que hace es crear una matriz de 2x2, y que solo tiene ceros, es decir, comenzamos con una zona flat (un cuadrado de cero altura en todos sus lados).

Después vamos a utilizar la función interp2 que lo que hace es agregarme los subelementos a la matriz, es decir, de 2x2 ahora hace una matriz 3x3, en la siguiente iteración me genera una matriz 5x5 y así sucesivamente según el numero de iteraciones. Entre mayor sea el número de iteraciones, mayor sera el detalle del paisaje, pero tardara mas en diseñarlo y plotearlo.

Despues marcamos solo los subelementos internos, es decir, una vez creado el cuadrado principal, lo subdividimos y descartamos los nodos viejos y solo seleccionamos los nuevos para trabajar con ellos.


Después calculamos un valor random, que sera la nueva altura que le sumaremos o restaremos a los nodos marcados, este se multiplica por el factor de cambio del terreno, valores pequeños ofrecen poco cambio, pero, debido a la dinámica del código esto no se cumple necesariamente.

Por último, dividimos el factor de cambio entre 2 para disminuir en cada iteración el factor de cambio y hacer todo un poco mas natural.

Código
Para la demostración, correré el código a 6 iteraciones (las cuales son suficientes) y una razón de cambio pequeña, de 0.1


Primera Iteración


Segunda Iteración


Tercera Iteración


Cuarta Iteración


Quinta Iteración


Sexta Iteración


Podemos ver como se genero un terreno fractal a partir de una zona completamente flat. Por medio de estos algoritmos podemos producir ambientes naturales bastante realistas y en poco tiempo. En mi caso no pude, creo que el poder de calculo de mi computadora se quedo corto, entonces, con mas de 8 iteraciones se congelaba Octave y había que matar el proceso.
Y este es el mapa de Perlin Noise utilizando Diamond-Square


Podemos también definir el nivel del mar del terreno, por ejemplo, con esta instrucción le digo que todo valor menor a cero lo iguale a cero, para que cero sea mi limite inferior y por consiguiente, mi nivel del mar:
octave> w = m;
octave> w(w < -0.01) = -0.01;
Después de correr el código otra vez y poner las líneas anteriores, este es el resultado (podemos ver la zona plana):


Bueno, quedo hasta aquí en el tema de geografía fractal, espero les sea de interés y utilidad.

Referencias

lunes, 2 de abril de 2012

[MSDS] Tarea 3 Pruebas estadísticas para los números pseudoaleatorios

El objetivo de esta tarea es determinar si los generadores de números pseudoaleatorios incluidos en las librerias de los diferentes lenguajes de programación se apegan a alguna distribución y si los mismos presentan las características deseables de los números pseudoaleatorios.

Herramientas

  • Lenguaje de Programación: Python
  • Libreria generadora de números pseudoaleatorios: random.normalvariate(0,1) (Normal Estándar)
  • Distribución a evaluar: Normal
  • Libreria de Pruebas Estadisticas: Scipy
  • Graficador: GNUPlot

1. ¿Los números generados de acoplan a la distribución indicada?


Para realizar esta prueba primero realice un código en Python que, con la ayuda de la libreria random, nos permite generar números pseudoaleatorios.
En mi caso voy a generar números pseudoaleatorios que se acoplen a la distribución normal utilizando la función random.randomvariate(0,1), como vemos, los parámetros serán 0 y 1, esto es, significancia = 0 y una desviación = 1, para seguir una normal estándar.
Por default se generan 10000 números, ya que hay que tener una muestra bastante grande; pero es posible enviar la cantidad como parámetro también.
Además se implementa una prueba de Anderson (scipy.stats.anderson), al generar los números, éstos se van almacenando en una lista, la lista se envía a la prueba Anderson para que los valores sean evaluados y se deteminará si la muestra proviene de una distribución específica (en éste caso, la distribución normal).

Código Python


Una vez que corremos el código, se generará un archivo llamado data.dat, éste contiene los números generados, lo que haré después es graficarlos. Pensé en hacer un código que implementara canastas, sin embargo, decidí dejar el trabajo a GNUPlot, con el siguiente código se generaran canastas de 0.1 unidades de ancho, leeremos el archivo data.dat e iremos creando un histograma de frecuencias.
Adicional a eso, implemente en el archivo de GNUPlot la función de densidad de probabilidad de la distribución normal para ver el acople de la distribución de los números generados y la forma original de la distribución normal. La formula es la siguiente:


Código GNUPlot


Gráfica


Fueron generados 1 000 000 de números, se acomodaron por canastas y formaron un histograma, si lo comparamos con la gráfica normal estandar (en rojo, con líneas) podemos ver que se acoplan casi perfectamente, tentativamente podemos deducir que efectivamente los números generados por random.randomvariate() si se acoplan a la distribución normal.

Prueba Anderson


Los resultados de la prueba Anderson para la muestra de 1 000 000 fueron:


Las hipótesis relacionadas no fueron rechazadas para todos los niveles de significancia, entonces podemos terminar de deducir que los números si se acoplan a la distribución normal.

2. ¿Los números generados presentan características deseables de "números aleatorios"?


Para las pruebas de aleatoriedad decidi basarme en la pagina random.org y leer un poco sobre los test, entonces me puse implementar 2 de ellos:

1. Frecuency Monobit

El propósito de esta prueba es calcular la proporción de ceros y unos en una muestra dada de números pseudoaleatorios.
Se espera que la proporción sea aproximadamente el mismo, es decir, que la proporción de unos dea 1/2 y la proporción de ceros también.

2. Frecuency Block

El enfoque de la prueba es calcular la proporción de unos en una muestra dada e números aleatorios, pero esta ves, la secuencia es dividida en bloques más pequeños y del mismo tamaño.
El propósito de este ensayo es determinar si la frecuencia de unos en un bloque de M-bits es de aproximadamente M / 2, como sería espera que en el supuesto de aleatoriedad.

Código


Ésta es la implementación de las pruebas, para hacerlo un poco más equilibrado, decidí comparar 2 muestras diferentes de 10000 números pseudoaleatorios cada una. La primera es generada con random.normalvariate() redondeando algunos valores y aplicando algunas condiciones para obtener valores binarios 0 y 1. La segunda es generada con random.randint() poniendo como limites 0 y 1 obviamente.
Después ambas listas se envían a evaluar, primero por Frecuency Monobit y después por Frecuency Block:


Los resultados de las pruebas para ambas listas fueron:



Podemos ver como para la lista generada por random.normalvariate() la proporción es 1, podemos deducir que la probabilidad entre ceros y unos es idéntica, por lo que se trata de una librería que cumple con los estándares para la generación de números aleatorios. No sorprende que haya pasado ambas pruebas.
No podemos decir lo mismo de la librería random.randint() cuya proporción es bastante baja comparada con la anterior. Podemos ver que cumple con los estándares de la prueba monobit, pero la prueba de bloques fue un fracaso total, entonces es 50% menos confiable que la random.normalvariate() además del umbral que las separa a las dos por la prueba monobit.

Referencias

jueves, 29 de marzo de 2012

[MSDS] Mapa de Logística. Puntos Extra

Código




GNUPLOT




Comando


python logisticMap.py 0.000039 100 1000 100000
gnuplot logisticMap.plot
convert -flatten data.eps data.png

Resultado Pagina Web





Resultado Código





Referencias


jueves, 23 de febrero de 2012

[MSDS] Procesos Estocásticos Discretos y Contínuos

"La distribución de probabilidad de una variable aleatoria es una función que asigna a cada suceso definido sobre la variable aleatoria la probabilidad de que dicho suceso ocurra.
La distribución de probabilidad está definida sobre el conjunto de todos los sucesos, cada uno de los sucesos es el rango de valores de la variable aleatoria.
Cuando la variable aleatoria toma valores en el conjunto de los números reales, la distribución de probabilidad está completamente especificada por la función de distribución, cuyo valor en cada real x es la probabilidad de que la variable aleatoria sea menor o igual que x."



Distribución Discreta

Las distribuciones discretas son aquellas en las que la variable aleatoria puede pude tomar un número determinado de valores, por ejemplo:

  • Si se lanza una moneda al aire puede salir cara o cruz
  • Si se tira un dado puede salir un número de 1 al 6
  • En una ruleta el número puede tomar un valor del 1 al 32
Para mi tarea elegí la distribución discreta binomial.

Distribución Discreta Binomial


Grafica de la Distribucion Discreta Binomial (fuente: Wikipedia.org)

Las distribución binomial parte de la distribución de Bernouilli.

La distribución de Bernouilli se aplica cuando se realiza una sola vez un experimento que tiene únicamente dos posibles resultados (éxito o fracaso), por lo que la variable sólo puede tomar dos valores: el 1 y el 0

La distribución binomial se aplica cuando se realizan un número"n" de veces el experimento de Bernouilli, siendo cada ensayo independiente del anterior. La variable puede tomar valores entre:

  • 0: si todos los experimentos han sido fracaso
  • n: si todos los experimentos han sido éxitos
Por ejemplo: se tira una moneda 10 veces: ¿cuantas caras salen?.

Si no ha salido ninguna la variable toma el valor 0; si han salido dos caras la variable toma el valor 2; si todas han sido cara la variable toma el valor 10

Partiendo de esta definición, tome el siguiente problema de distribución binomial, tratare de explicar un poco si comportamiento binomial y posteriormente lo relacionaremos con una distribución de probabilidad continua.

Planteamiento

"Tenemos un examen que consta de 20 preguntas, cada pregunta puede ser verdadera o falsa. ¿La probabilidad de obtener 13 preguntas acertadas?"

Comportamiento

En este caso, la respuesta es binaria, entonces podemos deducir que:
  • La probabilidad de éxito es 0.5
  • La probabilidad de fracaso es 0.5
Ahora, la distribución binomial recibe 2 parámetros, B(n,p)
  • n: que es el número de veces que se repite el experimento.
  • p: que es la probabilidad de que el experimento sea exitoso, en este caso, que la respuesta sea acertada
La variable aleatoria x en este caso puede valer x = 0, 1, 2, ..., 20 dependiendo de cuantas preguntas sean acertadas (éxitos); la probabilidad de éxito se calcula con la siguiente formula:


donde:


Ahora, analicemos el comportamiento del problema con el siguiente programita, escrito reutilizando algunos módulos de la clase anterior, recibe el numero de repeticiones "n" y la probabilidad "p" y lo único que hace es aumentar el valor de x desde 0 hasta n (en este caso, 20), con estos valores podremos realizar una pequeña gráfica, utilizo la función bincoeff de Octave para obtener la mayor precisión, el código es el que sigue:

Se ejecuta entrando a Octave y llamando al script, escribiendo el nombre de la funcion y pasando los parametros correspondientes a nuestro problema planteado: binomial(20, 0.5) La salida generada consiste en 2 columnas donde la segunda corresponde a la probabilidad de obtener el numero de respuestas acertadas, dado por la primera columna, la salida es la siguiente:

Y la gráfica es la siguiente, generada con la herramienta GNUplot:


El resultado a nuestro problema es una probabilidad de 0.073929 (7.3929%) de obtener 13 aciertos de 20 preguntas de verdadero y falso.

Distribución Continua

Las distribuciones continuas son aquellas que presentan un número infinito de posibles soluciones, por ejemplo:
  • El peso medio de los alumnos de una clase puede tomar infinitos valores dentro de cierto intervalo (42,37 kg, 42,3764 kg, 42, 36541kg, etc)
  • La esperanza media de vida de una población (72,5 años, 7,513 años, 72, 50, 63 años)

Analizando la gráfica de la distribución discreta binomial de mi problema, pude relacionar que comportamiento de la misma con la distribución continua normal.

Distribución Continua Normal


Grafica de la Distribucion Continua Normal (fuente: Wikipedia.org)


Es el modelo de distribución más utilizado en la práctica, ya que multitud de fenómenos se comportan según una distribución normal.

Esta distribución de caracteriza porque los valores se distribuyen formando una campana de Gauss, en torno a un valor central que coincide con el valor medio de la distribución.


No quiere decir que mi problema sea continuo, sin embargo, estuve leyendo ciertas investigaciones acerca de la relación existente entre ambas distribuciones y es posible obtener una distribución binomial mediante una aproximación.

El método de aproximación a una distribución binomial por medio de la normal es muy común, vamos a analizar el comportamiento de mi problema mediante una distribución normal. Para ello ya no podemos plantear nuestro problema de la misma forma que en la binomial, ahora el planteamiento seria:

"Tenemos un examen que consta de 20 preguntas, cada pregunta puede ser verdadera o falsa. ¿La probabilidad de obtener por lo menos 13 preguntas acertadas?"

El primer paso es calcular los valores media y desviación estándar correspondientes a la distribucion normal. Para ello se utiliza el teorema de De Moivre, donde:


Entonces calculamos (recordemos que n = 20, p = 0.5, q = 0.5):
Media = np = (20)(0.5) = 10

Desviación Estándar = sqrt(npq) = sqrt[(20)(0.5)(0.5)] = sqrt(5) = 2.236068

Teniendo estos datos, es posible aproximarnos al resultado mediante la siguiente formula:


Donde x sigue valiendo 13 (13 aciertos en 20 preguntas). Entonces calculamos:
Z = [(13 - 10)/2.236068] = (3/2.23608) = 1.34
El valor de 1.34 no es en realidad el valor de la probabilidad, sino el limite central de la distribución normal. Si comparamos este valor de límite central con las tablas de distribución normal vemos que la probabilidad es de 0.91014 (91.014%) de obtener por lo menos 13 preguntas acertadas. Utilizando la funcion normcdf de Octave:



Hay que recordar que nos da un valor de 0.91014 (91.014%) porque nos esta dando la probabilidad de obtener POR LO MENOS 13, es decir, se suman las probabilidades de obtener desde 1 pregunta hasta 13.
Si sumamos los valores de la table que obtuvimos con la binomial el resultado sera 0.94234 que comparado con el 0.91014 lo cual es una buena aproximacion.

Entonces, ahora es posible generar la gráfica de la distribución normal y ver como es su aproximación a la distribución binomial, para ello modifique el programa que calcula la binomial para que calcule la también la normal y realice un proceso de "tipificación" que es lo que nos proverá los valores aproximados a la binomial, esto es, restar a 1 la probabilidad obtenida por la tabla de la distribución normal de acuerdo al limite central obtenido por cada experimento. El código del calculo y ploteo quedaron como sigue:


la parte importante del código es donde se comienza a convertir la gráfica, si vemos son 3 estados principales los cuales producen las siguientes gráficas, los estados los obtenemos comentando y descomentando las lineas (pero nunca debemos tener 2 o mas lineas descomentadas):

Estado 1. Que es la binomial en rojo sin ningún ajuste contra la normal estándar en verde.



Estado 2. Donde ajustamos el desplazamiento causado por la binomial cuando 'n' crece.



Estado 3. Donde convertimos la gráfica binomial basada en la altura de los puntos, a una distribución normal basada en el área debajo de la Campana de.



Asi es como aproxime mi problema binomial y a una normal. :)

Referencias

miércoles, 1 de febrero de 2012

[MSDS] Sistemas deterministas: Lineas de Producción

Primero empezare por definir algunos conceptos:

¿Qué es un Sistema?



"Un sistema es un conjunto de partes o elementos organizadas y relacionadas que interactúan entre sí para lograr un objetivo. Los sistemas reciben (entrada) datos, energía o materia del ambiente y proveen (salida) información, energía o materia. 

Un grupo de elementos no constituye un sistema si no hay una relación e interacción, que de la idea de un "todo" con un propósito."

Determinismo


"Sostiene que todo acontecimiento físico, incluyendo el pensamiento y acciones humanas, están causalmente determinados por la irrompible cadena causa-consecuencia."

Entonces, un Sistema Determinista es un sistema en el cual el azar no está involucrado en los futuros estados del sistema. Dadas ciertas variables de entrada y condiciones de funcionamiento, es sencillo saber cómo el sistema ha de comportarse con el paso del tiempo, entonces se puede predecir sin ningún riesgo de error el estado siguiente del sistema.

Con esta definición, decidí explicar porqué una linea de producción es un ejemplo de sistema determinista. Lo elegí porqque es un sistema (por definicion de sistema) y es determinista debido a que tiene un conjunto de estados preestablecidos para conseguir un fin común.

Lineas de Produccion


Una línea de producción es un conjunto armonizado de subsistemas, mayormente mecanicos, neumáticos, hidráulicos y electrónicos. Todos estos con una finalidad en común: transformar o integrar materia prima en otros productos.

Se puede utilizar una linea de produccion en muchisismo campos de manufactura, las entradas pueden ser: polimeros, telas, metales, maderas, minerales, incluso la energia utilizada en los procesos.

Mientras que las salidas tambien son de variados tipos: automoviles, refrescos, jabones, alimentos enlatados, en fin.

Debido al gran consumismo de la sociedad actual, fue necesario intensificar el uso de las lineas de produccion, ya que las necesidades actuales exigen la existencia permante de ciertos productos con caracteristicas semejantes y de gran calidad.

Henry Ford, fundador de la compañía Ford Motor Company, es considerado el padre de las lineas de produccion modernas al instalar el primer sistema de produccion en masa en su fabrica de automoviles.

Ventajas de una linea de produccion
  • Reduce el tiempo de producción.
  • Regula la carga de trabajo dividiendo el mismo en estaciónes.
  • Es más fácil detectar errores en la producción.
  • Aumenta la productividad.
  • Reduce costos y aumenta la calidad.
  • Reduce inventarios (materiales comprados, obra en proceso, productos terminados).
  • Se puede aplicar a cualquier tipo de empresa que reciba o despache mercancías.

Invito a que vean este video extra donde se explica cómo se fabrican botellas de vidrio, es un ejemplo de linea de produccion.


¿Porqué una Línea de Producción es un sistema determinista?


Considero que es determinista porque involucra variables de entrada como lo expliqué anteriormente y requiere de ciertas condiciones para funcionar. Cada una de las estaciones se puede decir que son los estados de la linea de produccion.
  • Preparacion: Se carga la materia prima y esta se prepara para el siguiente paso. Aqui se puede, por ejemplo, derretir un metal o un polimero, o se puede cargar en algun medio de almacenamiento temporal para su uso posterior.
  • Procesos de moldeado: Este es un paso que se repite en muchas lineas de produccion, al moldear la materia prima, extruirla, aplastarla, etcetera.
  • Ensamblaje: A veces este proceso es paralelizable, es decir, una vez que un material se ha moldeado, posiblemente es mas factible tambien ensamblar pequenas cosas a la vez, y despues juntarlas en un todo.
  • Pruebas: Todas las empresas realizan pruebas de seguridad y calidad para verificar que su producto cumpla con las especificaciones del mercado, se prueba un lote en cieros momentos del dia y por lo general se descarta todo el lote si un solo producto del mismo salio mal.
  • Almacenamiento: Algunos productos son almacenados, ya que a veces se requiere que el mismo sea transportado a otras ciudades a determinados horarios, mientras ese moomento llega, habran de esperar un momento en alguna bodega.
  • Distribucion: El producto se entrega a diferentes cadenas comerciales para que pueda ser adquirido por el usuario final.
  • Uso y reciclado: Se aprovecha el producto, eso le da valor agregado dependiendo de la satisfaccion del cliente, cuando el producto ya no es funcional o es obsoleto, es desechado. Posteriormente se verifica si alguna parte es reciclable y esta se convierte de nuevo en la entrada al sistema.
Además podemos extender lo anterior a los estados establecidos a la maquinaria y robots, los cuales estan preparados para seguir un proceso para el cual fueron programados. De hecho esta fue la razon por la cual el recurso humano fue remplazado por robots, porque rinden mejor y, dadas una serie de instrucciones, son capaces de realizar la misma tarea con gran exactitud y de manera consecutiva.

Pseudocodigo


Algo de estilo con Python:

Espero les haya agradado mi explicacion, sin mas por el momento, quedo en ustedes.

De antemano gracias.

Referencias

viernes, 6 de mayo de 2011

Demostración Final

Taller de Programación Orientada a Objetos

Demostracion Final.



VIDEO DEMOSTRACION:

Interfaces Gráficas

Programación Orientada a Objetos - Semana 13 - Reporte 12


Interfaces Gráficas en JAVA



Las GUI (Graphic User Interface) o Interfaz Gráfica de Usuario es una forma de hacer los dispositivos más accesibles a los usuarios en general.
Las interfaces gráficas son en realidad un componente o programa que corre en segundo plano en el sistema donde se ha implementado, su función es transformar cada una de las instrucciones, métodos, acciones o comandos en componentes visuales (haciendo uso de imagenes, pequeños iconos, efectos y demás).
Todo esto convierte un entorno de línea de comandos en un entorno visual más atractivo e intuitivo al usuario lo que es una invitación a utilizar nuestro sistema o aplicación

La necesidad de las interfaces gráficas surge como una consecuencia de la falta de conocimientos por parte de los usuarios sobre el manejo y uso de las CLI (Interfaces de Línea de Comandos) había la necesidad de masificar los sistemas, pero aprender cientos de instrucciones, sintaxis, parámetros y demás no era una buena solución.



Las Interfaces gráficas automatizan gran parte de este trabajo, ya que no es necesario aprender toda una instrucción textual, solo es necesario aprender la funcionalidad de un botón para lograr los resultados deseados.

Los sistemas operativos implementan diferentes gestores GUI o entornos de escritorio, solo por mencionar algunos:

  • Windows XP: LUNA
  • Windows Vista/Seven: AERO
  • MAC OS: AQUA
  • Linux: GNOME, UNITY, KCD

Java ofrece una serie de librerias que facilitan en gran medida la implementación interfaces gráficas.


java.awt(Abstract Windowing Toolkit)


Es el paquete original de herramientas GUI de Java. Las principales ventajas AWT son que viene incluída en todos los paquetes de tecnología Java, incluyendo implementaciones de Java en navegadores de Internet y es muy estable.

AWT es un conjunto de herramientas muy simples con pocos componentes GUI, administradores de diseño, y eventos.
Esto se debe a Sun Microsystems decidió utilizar un mínimo común denominador (LCD) para el enfoque de AWT.
Como resultado de ello, y por desgracia, algunos de los componentes de uso común, tales como tablas, árboles, barras de progreso, y otros, no son compatibles. Para las aplicaciones que necesitan más tipos de componentes, es necesario crearlas desde cero. Esta es una gran carga.

AWT ofrece tres tipos de componentes principales:


a) Básicos: Componentes básicos en cualquier GUI.

  • Button
  • CheckBox
  • Container
  • Panel
  • Window
  • Frame
  • Label
  • List
  • TextComponent
  • MenuComponent


b) Layouts: Sirven para acomodar los componentes de la GUI.

  • FlowLayout
  • GridLayout
  • BorderLayout
  • CardLayout
  • GridBagLayout


c) Eventos: Otorgan funcionalidades a cada uno de los componentes de la GUI.

  • KeyEvent
  • ActionEvent
  • MouseEvent
  • TextEvent



javax.swing


El paquete Swing es parte de la JFC (Java Foundation Classes) en la plataforma Java. La JFC provee facilidades para ayudar a la gente a construir GUIs.

Las componentes Swing se identifican porque pertenecen al paquete javax.swing.

Swing existe desde la JDK 1.1 (como un agregado). Antes de la existencia de Swing, las interfaces gráficas con el usuario se realizaban a través de AWT (Abstract Window Toolkit), de quien Swing hereda todo el manejo de eventos. Usualmente, para toda componente AWT existe una componente Swing que la reemplaza, por ejemplo, la clase Button de AWT es reemplazada por la clase JButton de Swing (el nombre de todas las componentes Swing comienza con "J").

Las componentes de Swing utilizan la infraestructura de AWT, incluyendo el modelo de eventos AWT, el cual rige cómo una componente reacciona a eventos tales como, eventos de teclado, mouse, etc... Es por esto, que la mayoría de los programas Swing necesitan importar dos paquetes AWT: java.awt.* y java.awt.event.*.

Ojo: Como regla, los programas no deben usar componenetes pesados de AWT junto a componentes Swing, ya que los componentes de AWT son siempre pintados sobre los de Swing. (Por componentes pesadas de AWT se entiende Menu, ScrollPane y todas las componentes que heredan de las clases Canvas y Panel de AWT)

Swing abarca componentes como botones, tablas, marcos, paneles, ventanas, etc...





APLICACIÓN AL PROYECTO


Es clave en mi proyecto desarrollar una interfaz gráfica amigable para el usuario. Mi intención es desarrollar algo parecido a la factura en físico, con un orden parecido.

En general, la ventana siempre estará compuesta por 2 paneles. El panel de barra de menú y el panel del área de trabajo




El panel de menú tendrá diferentes opciones las cuales se activaran dependiendo del área de trabajo. Para ello implementaré un JMenuBar. Si alguien por ahí sabe como implementarlo pues no dude en comentar.

El área de trabajo sera dinámica, ya que es la que cambiará con cada opción que se elija. Para ello se deberán utilizar de manera creativa los Layouts disponibles en java.awt.
Algunos paneles que me serán útiles son GridLayout, BorderLayout, FlowLayout y el dios GridBagLayout :).
Otros componentes necesarios para mi proyecto serán los básicos: JLabel, JButton, JTextField, JTextArea; asi como implementar de forma correcta el JTable


SALUDOS!! :)

REFERENCIAS