miércoles, 30 de septiembre de 2015

Programacion

Gestion de regiones

Autor : René Curín
Competencia : Gestion del conocimiento
Asignatura: Programacion II
Palabras claves: Python, Excel

Descripción de la actividad
Crear un programa que sea capaz de procesar un archivo excel que contiene datos sobre personas damnificadas por algun suceso extremo como son lo terremotos, tsunami, tornados, diluvios, destruccion del sistema solar, contraccion del universo o cualquier otro evento natural que cause graves daños, desde el cual se deben extraer los archivos para poder separarlos por regiones y ciudades.


Enunciado de la actividad:
 La fuerza de la naturaleza ha producido a lo largo de la historia del hombre múltiples situaciones catastróficas, causando cuantiosos daños socio-económicos. En el último tiempo, se han registrado continuamente movimientos telúricos, con intensidades de hasta 8 grados Richter de manera casi semanal, aunque por suerte no han sido de gran duración o se podrían dar situaciones lamentables, como la ocurrida el pasado 1 de Abril, cuando un fuerte movimiento telúrico 8.3 Richter produjo fuertes daños en las provincias de la región de Tarapacá. Debido al fuerte sismo, muchas personas perdieron sus viviendas y vivieron (e incluso viven) en albergues provisionales . Se estima que existían sobre 300 mil damnificados en toda la región, esparcidos de acuerdo a la densidad poblacional de cada una de sus provincias.
 
 Tomando en cuenta esta situación como base, pensaremos que para una situación como esta, se podría elaborar una canasta básica de sobrevivencia, la cual contemplaría los siguientes alimentos: agua (litros), azúcar (kilos), arroz(kilos), té (bolsitas), pan (kilos) y paquetes de pasta. 
 Consideraremos dentro de la situación, un reporte de necesidades de cada damnificado entregado por las autoridades pertinentes en su momento (necesidades.csv), en el cual se considera la siguiente información: nombre;provincia;agua,azúcar,arroz,té,pan,pasta.
Debido a la distancia respecto de las otras regiones del país, se entiende que el alimento debería ser distribuido en cada provincia por medio de camiones y que a pesar de los esfuerzos que puedan realizar las autoridades competentes, no es posible entregar a toda la ciudadanía todo lo necesario a la vez, por tanto, los alimentos son entregados parcialmente de acuerdo al arribo de los camiones a cada zona afectada

Objetivos principales
- Aprender extraer informacion de un archivo excel
- Aprender a procesar la informacion y catalogarla
- Diseñar un programa que sea utilizable para diversos casos

Desarrollo de la actividad:
     Estrategia de Trabajo: Comenzamos por analizar los datos que se van a extraer y en la forma que se van a almacenar dentro del programa, luego diseñamos la forma en que separaremos los diferentes datos para luego poder utilzarlos.

    Modelo de Solución: iniziamos leyendo el archivo y extrayendo los diferentes campos en arreglos, lo primero que extrajimos fueron las ciudades, para poder separar los demas datos, luego las personas segun su ciudad, y finalmente los recursos destinados para cada persona, despues esto nos genero varios areglos, los cuales utilizamos para generar graficos y poder asignarle una equvalencia de recursos a las personas que mas necesitaban, y lo que sobraba se lo dejabamos a las personas con mas recursos, generabamos un archivo por cada ciudad que contenia cada persona respecto a su ciudad y el total de personas, ademas de sus necesidades, y luego generamos un grafico de torta para ver que tantas personas damnificadas hubieron por ciudad. 

Codigo Fuente 
 
# -*- encoding: utf-8 -*-
import os
import numpy as np
from pylab import*
import matplotlib.pyplot as plt

def obtener_provincias(x):
    archi = open(str(x),"r")
    prov = []
    cont = 0
    for k in archi:
        k = k.split(";")
        for i in range(len(prov)):
            if k[1] == prov[i]:
                cont = 1
        if cont == 0:
            prov.append(k[1])
        cont = 0
    archi.close()
    return prov

def ordenar(a):
    nombres = []
    for k in a:
        k = k.split(";")
        nom = k[0]
        nom = nom.split(" ")
        nombre = str(nom[2])+" "+str(nom[3])+" "+str(nom[0])+" "+str(nom[1])
        nombres.append(nombre)
    nombres = sorted(nombres)
    final = []
    for k in nombres:
        k = k.split(" ")
        nombre = str(k[2])+" "+str(k[3])+" "+str(k[0])+" "+str(k[1])
        final.append(nombre)
    return final

def crear(x):
    if (os.path.exists(x) == False):
        os.mkdir(x)

def sub_carpetas(x, provincias):
    crear(x)
    for C in provincias:
        crear(x + "/"+ str(C))

def graf_torta(valores,etiquetas,direccion):
    aficion = valores
    etiquetas = etiquetas
    ax = axes([0, 0, 0.8, 1])
    plt.pie(aficion, labels = etiquetas)
    legend()
    ylabel("Numero Personas")
    xlabel("Provincias")
    grid(True)
    plt.savefig(direccion)
    show()

def graf_bar(valores,etiquetas,direccion):
    name =etiquetas
    values=valores
    pos = arange(len(name)) + .5
    plt.bar(pos, values, align='center', color='#b8ff5c')
    xticks(pos,name,rotation=30,size="small")
    plt.savefig(direccion)
    show()

def productos(alimentos):
    agua = []
    pan = []
    azucar=0
    total = 0
    for f in range(len(alimentos)):
        x = alimentos[f]
        total += x[0]+x[1]+x[2]+x[3]+x[4]+x[5]
        agua.append(x[0])
        pan.append(x[4])
        azucar+=int(x[1])
    return agua,pan,azucar,total

def graficos(direccion,personas,provincias,agua,pan):
    crear(direccion)  #"Tarapaca/Reportes/Graficos"
    graf_torta(personas,provincias,str(direccion)+"/damnificados.png")
    graf_torta(agua,provincias,str(direccion)+"/consumo_agua.png")
    graf_bar(pan,provincias,str(direccion)+"/consumo_pan.png")

def repor_requerimiento(direccion,provincias,personas,alimentos):
    crear(direccion)
    requisitos = open(str(direccion)+"/Requerimientos.csv", "a")
    for i in range(len(provincias)):
        requisitos.write(str(provincias[i]) + ";" + str(personas[i]) + ";")
        for n in range(6):
            requisitos.write(str(alimentos[i][n]) + ",")
        requisitos.write(";\n")
    requisitos.close()

def repor_azucar(direc,azucar,doc):
    archi = open(doc,"r")
    text = open(str(direc) + "/provincia_azucar.csv","a")
    disponible = (azucar / 100) * 20
    for i in archi:
        i = i.split(";")
        ali = i[2].split(",")
        line = str(i[0])+";"+str(ali[1])
        if disponible >=0:
            if int(ali[1]) == 3:
                num = int(ali[1]) - 3
                disponible = disponible - 3
                line = str(i[0])+";"+str(num)
        text.write(line+"\n")
        line = ""
    archi.close()

def repor_beneficiados(direc,doc,total,afectado):
    archi = open(doc,"r")
    text = open(str(direc) + "/beneficiados.csv","a")
    disponible = (total / 100) * 70
    for i in archi:
        i = i.split(";")
        ali = i[2].split(",")
        if i[1] == afectado.upper():
            text.write(str(i[0])+";"+i[1]+";"+str(ali[0])+","+str(ali[1])+","+str(ali[2])+","+str(ali[3])+","+str(ali[4])+","+str(ali[5]))
            while int(ali[0]) > 0 or int(ali[1]) > 0 or int(ali[2]) > 0 or int(ali[3]) > 0 or int(ali[4]) > 0 or int(ali[5]) > 0 and disponible > 0:
                for k in range(6):
                    if disponible > 6:
                        if int(ali[k]) != 0:
                                ali[k] = int(ali[k]) - 1
                                disponible -= 1
                    else:
                        break
            #text.write(str(i[0])+";"+i[1]+";"+str(ali[0])+","+str(ali[1])+","+str(ali[2])+","+str(ali[3])+","+str(ali[4])+","+str(ali[5])+"\n")
    archi.close()
    archi = open(doc,"r")
    true = True
    for i in archi:
        i = i.split(";")
        ali = i[2].split(",")
        cont = 2
        if i[1] != afectado.upper() and true == True:
            if int(ali[0]) >= cont and int(ali[1]) >= cont and int(ali[2]) >= cont and int(ali[3]) >= cont and int(ali[4]) >= cont and int(ali[5]) >= cont:
                text.write(str(i[0])+";"+i[1]+";"+str(ali[0])+","+str(ali[1])+","+str(ali[2])+","+str(ali[3])+","+str(ali[4])+","+str(ali[5]))
                while int(ali[0]) > 0 or int(ali[1]) > 0 or int(ali[2]) > 0 or int(ali[3]) > 0 or int(ali[4]) > 0 or int(ali[5]) > 0:
                    if disponible > 6:
                        for k in range(6):
                            if int(ali[k]) != 0:
                                ali[k] = int(ali[k]) - 1
                                disponible -= 1
                    else:
                        true = False
        if i[1] != afectado.upper():
            text1 = open(str(direc) + "/espera_provincia.csv","a")
            text1.write(str(i[0]) +";"+str(i[1])+";"+str(i[2]))
            text1.close()

def terremoto(documento):
    provincias = obtener_provincias(documento)    # Variable para almacenar las provincias
    personas = [0] * len(provincias)    # Variable para almacenar la cantidad de personas
    alimentos = [[0,0,0,0,0,0],[0,0,0,0,0,0],[0,0,0,0,0,0],[0,0,0,0,0,0],[0,0,0,0,0,0],[0,0,0,0,0,0],[0,0,0,0,0,0]]    # variable para almacenar la cantidad de alimentos
    archi = open(documento, "r")
    sub_carpetas("Tarapaca", provincias)    # Se crean las subcaprteas
    for linea in archi:
        linea = linea.split(";")    # Separo la cadena por ; y su resultado seria ['Nombre','provincia','1,5,9,78,45,7']
        prod = linea[2].split(",")    # La pocision 2 de linea son los alimentos y los separo por una coma
        for i in range(len(provincias)):
            if provincias[i] == linea[1]:    # si provicnias(Mayusculas es igual a provincias de la pocicion 1
                personas[i] += 1     # Sumo 1 a la cantidad de personas segun provincia
                text = open("Tarapaca/" + str(provincias[i])+ "/" +str(provincias[i]) + ".csv", "a")
                text.write(str(linea[0]) + ";\n")
                text.close()
                for ali in range(6):
                    alimentos[i][ali] += int(prod[ali])
    archi.close()

    agua,pan,azucar,total = productos(alimentos)   #Obtengo los alimentos
    repor_requerimiento("Tarapaca/Reportes",provincias,personas,alimentos)
    repor_azucar("Tarapaca/Reportes",azucar,documento)
    repor_beneficiados("Tarapaca/Reportes",documento,total,"Iquique")
    graficos("Tarapaca/Reportes/Graficos",personas,provincias,agua,pan)    # Se generan los graficos

#--------Main---------
terremoto("necesidades.csv")
 
 Imagen de dmostracion: 
 
 
 Descargas:
 
Archivo Excel -> https://mega.co.nz/#!mZ82jDwK!AnXPLSl4DnJIqyY_os3L0iM-4aOXNjZsFhvZTdiY8X8 
Codigo -> https://mega.co.nz/#!yN0nnDZa!1Uanrwzpam16mxaLQuORh0_sJWXlPRA4rzBl1K2d23c
 
 

Integracion de Sistemas


Simulacion en 3D


Autor : René Curín
Competencia : Creatividad e innovación
Asignatura: Programacion para la integracion de sistemas
Palabras claves: Python, VisualPython, Codigo.


Descripción de la actividad
 Crear una interfaz en donde se muevan robots de forma aleatoria por un mapa. Estos robots peuden moverse encualquier angulo de 360°, con 3 velocidades diferentes, ademas cada robots debe contar con un nivel de bateria que se ira descargando a medida que se mueva, y cuando alcanze un tope minimo de bateria este debe volver a la base.


Enunciado de la actividad:
 Programe una interfaz donde se mueven los robos de manera aleatoria por el  mapa.  Los robot comienzan moviéndose en cualquier ángulo (0°-359°) con tres velocidades distintas (1,2,3). Cuando los robots chocan con los bordes del mapa deben rebotar teniendo en cuenta su ángulo de impacto. Cada robot dispone de una Batería, la cual se descarga 0.1% toda vez que el robot se mueve. Los robot inician sus movimientos con la Bateria al 100% de carga. Cuando la carga es igual o menor al 5%, el robot debe retornar a su Base para cargar sus baterías. Luego el proceso se repite.


Objetivos principales
- Aprender a utilizar librerias de manejos de objetos 3D
- Crear una interfaz distinguible
. Crear una forma de movimiento para cada robot

Herramientas utilizadas:
- Python 2.7
- Libreria Visual Python (Vpython).

Desarrollo de la actividad:
     Estrategia de Trabajo:
                    La estrategia de trabajo empleado comenzo por analizar como debia ser la interfaz del programa para que se movieran los robots, luego buscamos la forma de poder mover los robots dentro del mapa sin que estos se salgan de su borde, creamos la manera de generar una bateria que se descargara con los movimientos y por ultimo comenzamos a programar todo lo que teniamos analizado

    Modelo de Solución:
                   La solucion del problema comenzo por analizar todas las posibles situaciones, luego programar nuestra interfaz, seguido, dibujamos e insertamos los robots en nuestra interfaz, para los robots creamos una clase que contendria tanto los movimientos, como los limites que debe alcanzar el robot para devolverse y los niveles de bateria disminuyeran.
Codigo Fuente
from visual import *
import math

scene.width = 800
scene.height = 600
f = frame(pos=vector(0,0,0))
base = box(frame = f,pos = vector(0,0,0),    size = (30, 0.5, 40),  material=materials.wood)
orilla_1 =  box(frame = f,pos = vector(15,0.4,0),    size = (0.5, 1.5, 40),  material=materials.wood)
orilla_2 =  box(frame = f,pos = vector(-15,0.4,0),    size = (0.5, 1.5, 40),  material=materials.wood)
orilla_3 = box(frame = f,pos = vector(0,0.4,20),    size = (30.5, 1.5, 0.5),  material=materials.wood)
orilla_4 = box(frame = f,pos = vector(0,0.4,-20),    size = (30.5, 1.5, 0.5),  material=materials.wood)

base_p1 = box(frame = f,pos = vector(12,0.3,17),    size = (3, 0.1, 3),  material=materials.rough)
base_p2 = box(frame = f,pos = vector(-12,0.3,-17),    size = (3, 0.1, 3),  material=materials.rough)
base_p3 = box(frame = f,pos = vector(-12,0.3,17),    size = (3, 0.1, 3),  material=materials.rough)
base_p4 = box(frame = f,pos = vector(12,0.3,-17),    size = (3, 0.1, 3),  material=materials.rough)

p1 = cylinder(pos = vector(12, 0,-17), axis = (0, 1, 0), radius = (0.8), color = color.red)
p2 = cylinder(pos = vector(-12, 0,-17), axis = (0, 1, 0), radius = (0.8), color = color.blue)
p3 = cylinder(pos = vector(12, 0,17), axis = (0, 1, 0), radius = (0.8), color = color.yellow)
p4 = cylinder(pos = vector(-12, 0,17), axis = (0, 1, 0), radius = (0.8), color = color.green)


class robot():
    def __init__(self,robot, base):
        self.robot = robot
        self.base = base
        self.angulo = random.randint(0,359)
        self.x = math.sin(self.angulo)
        self.z = math.cos(self.angulo)
        self.velocidad = random.randint(1, 4)
        self.por_x = 1
        self.por_z = 1
        self.bateria = 10


    def mov(self):
        if self.bateria > 5:
            self.robot.x += (self.x * self.velocidad) * self.por_x
            self.robot.z += (self.z * self.velocidad) * self.por_z
            if self.robot.x > 15
and self.por_x == 1:                   #>15 1 -1
                self.por_x = -1
            elif self.robot.x > 15 and self.por_x == -1:                  #> 15 -1 1
                self.por_x = 1
           
if self.robot.x < -15 and self.por_x == 1:                  #<-15 1 -1
                self.por_x = -1
           
elif self.robot.x < -15 and self.por_x == -1:                 #<-15 -1 1
                self.por_x = 1
           
if self.robot.z > 20 and self.por_z == -1:
                self.por_z = 1
           
elif self.robot.z > 20 and self.por_z == 1:
                self.por_z = -1
           
if self.robot.z < -20 and self.por_z == 1:
                self.por_z = -1
           
elif self.robot.z < -20 and self.por_z == -1:
                self.por_z = 1
            self.bateria -= 0.1
            #print self.bateria
        else:
            self.llegar_base()

    def llegar_base(self):
        if self.base.x != self.robot.x:
            if self.robot.x < self.base.x:
                self.robot.x += 1
            else:
                self.robot.x -= 1

        if self.base.z != self.robot.z:
            if self.robot.z < self.base.z:
                self.robot.z += 1
            else:
                self.robot.z -= 1
        #print self.robot.x, self.robot.z

        if int(self.base.x) == int(self.robot.x):
            self.robot.x = self.base.x
        if int(self.base.z) == int(self.robot.z):
            self.robot.z = self.base.z

        if int(self.robot.x) == int(self.base.x) and int(self.robot.z) == int(self.base.z):
            self.load_batery()

    def load_batery(self):
        ba = 0
        for i in range(10000):
            if i % 100 == 0:
                ba += 1
            #print i
        self.bateria = ba


cont = 0

r1 = robot(p1, base_p1)
r2 = robot(p2, base_p2)
r3 = robot(p3, base_p3)
r4 = robot(p4, base_p4)
while 1:
    rate(100)
    r1.mov()
    r2.mov()
    r3.mov()
    r4.mov()
Imagen de dmostracion:

 
 De que me sirvió esta actividad:
La actividad sirvio como un puente para lo que es la creacion y modelado de objetos 3D asi como tambien programarlos y darles movimientos creados por uno mismo, ademas de la utilizacion de factores como las matematicas ya que para poder calcular los grados de movimiento y el angulo de rebote con los border tuve que utilzar algunas ecuaciones matematicas para poder resolver el problema sin mayoeres complicaciones.