jueves, 14 de febrero de 2013

Entrada # 1


Teoría de la Información y 
Métodos de Codificación


Para esta entrega se nos pidió realizar un programa para generar y transmitir palabras y mostrar de forma gráfica.

Explicación de lo realizado (Cabe resaltar que este proceso que se explicara a continuación se realizo varias veces).

Las palabras del generador y el transmisor consisten en listas de 0 y 1, para generar estas palabras utilizan ciertas variables.

Generador:
  • Porcentaje de Ceros que puede llevar
  • Tamaño de la palabra
Transmisor:
  • Frecuencia de Ceros
  • Frecuencia de Unos
  • El Generador
  • Tamaño de la palabra
Después estos son comparados si son iguales el éxito es 1 si no es 0.

Para ver una mejor explicación del Generador y el Transmisor muestro la siguiente imagen:



En esta imagen se muestra que cuando se corre el python le indicamos que las variables tendrán tamaño 5 el porcentaje de 0 para el Generador sera 0.3, La frecuencia de 0 y 1 para el transmisor sera 0.9 y el ultimo 8 indica la cantidad de veces que se hará este proceso.

En este mismo código se determino un porcentaje de éxito el cuál sera una comparación del generador y el transmisor, en la imagen el primer dato es el Generador y la otra es la del Transmisor el dato siguiente es 0 si son distintos y 1 si son iguales.

Después estos éxitos se suman y se saca un promedio que seria el porcentaje de éxito que se menciono anteriormente.

Este dato es tratado por AWK para obtener el promedio de este.

Y el resultado es guardado en un archivo el cuál sera gráficado con Gnuplot.


Código de la Ejecución:

Código de Bash

Este es el encargado de realizar todo el proceso; este primeramente revisa si los archivos que se utilizaran en el proceso si existen los borra, después crea el cuál utilizara gnuplot, el siguiente punto son los for aninados la cantidad de for es igual a la cantidad de variables que recibe Python.

En el transcurso de los for se obtiene el promedio de éxitos el cuál sera agregado al archivo Promedios.puddi que sera utilizado por el AWK para obtener el promedio de todos los promedios del archivo.

Ese dato obtenido en conjunto con los de los for's (A excepción del último) son enviados al archivo Canales.puddi el cuál sera graficado.
#!/bin/bash
#En este se corre el python muchas veces dependiendo una variable de repeticiones
#For anidado por cada variable del Python
echo "Comenzando Bash"
Archivo1=Promedios.puddi
if [ -e $Archivo1 ]; then #Compruebo la existencia del Archivo, si existe lo elimino
rm Promedios.puddi
fi #Fin del IF
Archivo2=Canales.puddi
if [ -e $Archivo2 ]; then #Si existe el Archivo lo borro
rm Canales.puddi
fi #Fin del IF
touch Canales.puddi #Creo el Archivo
for Tamano in 6 16 8 4 9 27; do
echo "Voy con Tamano: $Tamano"
for PorCeros in 0.5 0.4 0.6 0.1 0.9; do
for Frecue0 in 0.2 0.9 0.6 0.8 0.5; do
for Frecue1 in 0.2 0.4 0.5 0.6 0.7; do
touch Promedios.puddi #Creo el Archivo para cargarles los valores de exito del python
for RepePy in 8 14 10 16; do
Exitos=`python Tarea1.py $Tamano $PorCeros $Frecue0 $Frecue1 $RepePy` #Esta variable recibe la impresion de Exito de Python
echo $Exitos >> Promedios.puddi
done
Promedio=`awk -f Promedio.awk Promedios.puddi`
echo $Tamano $PorCeros $Frecue0 $Frecue1 $Promedio >> Canales.puddi
rm Promedios.puddi #Elimino el archivo para volverlo a crear para el proximo ciclo.
done
done
done
echo "" >> Canales.puddi
done
gnuplot Graficador.plot #Corro el Gnuplot
eog Imagen.png #Habro la imagen generada por Gnuplot
view raw Tarea1.sh hosted with ❤ by GitHub

Código de Python

Esté obtiene un ciclo en el cuál se realiza el siguiente proceso varias veces: nos da el Generador y la Transmisión; los compara si son iguales, la variable éxito es igual a uno si no cero.

Terminando todo el ciclo se saca el promedio de todos los éxitos del ciclo y este dato sera utilizado mas adelante.
from random import randint, random
import sys
def main():
tamano = int(sys.argv[1]) #Recibo el tamano de la frase
porcero = float(sys.argv[2]) #Recibo el porcentaje de 0
frecuencia0 = float(sys.argv[3])#Probabilidad de que 0 sea 0
frecuencia1 = float(sys.argv[4])#Probabilidad de que 1 sea 1
repeticion = int(sys.argv[5]) #Numero de repeticiones
contador = 0
for k in range(repeticion):
frase = generafrase(tamano, porcero)
resultado = transmision(frase, frecuencia0, frecuencia1)
if resultado == 1:
contador = contador + 1
exito = float(contador)/float(repeticion) #Porcentaje de Exito
print exito
def transmision(frase, frecue0, frecue1): #Determino la transmision
lista = list()
for i in frase:
X = random()
if i == 0:
if frecue0 > X:
lista.append(0)
else:
lista.append(1)
else:
if frecue1 > X:
lista.append(1)
else:
lista.append(0)
#Comparo el Generado con el Transmitido si son iguales El Exito es 1 si no es 0
if frase == lista:
return 1
else:
return 0
def generafrase(tamano, porcentaje0): #Generador de la Primera Frase
condicion0 = int(tamano * porcentaje0) #Cantidad de 0 que puede tener la frase
condicion1 = tamano - condicion0 #Cantidad de 1 que puede tener la frase
contaceros = 0
contaunos = 0
lista = list()
for i in range(tamano):
var = randint(0, 1)
if var == 0:
contaceros = contaceros + 1
if contaceros > condicion0:
lista.append(1)
else:
lista.append(0)
else:
contaunos = contaunos + 1
if contaunos > condicion1:
lista.append(0)
else:
lista.append(1)
return lista
main()
view raw Tarea1.py hosted with ❤ by GitHub

Código de AWK

Nos da el promedio de todos los elementos del Archivo Promedios.puddi
#! /bin/awk -f
BEGIN { #En este apartado se declaran las variables a utilizar
Contador = 0;
Sumatoria = 0;
}
{ #En este apartado va la ejecucion del programa
Sumatoria = Sumatoria + $1;
Contador = Contador + 1;
}
END { #Por ultimo realizo esto
Promedio = Sumatoria / Contador;
print Promedio;
}
view raw Promedio.awk hosted with ❤ by GitHub

Código de Gnuplot

Gráfica el archivo Canales.puddi
set term png
set view map
set pm3d map
set output 'Imagen.png'
set xlabel "Tamano de las Variables"
set ylabel "Frecuencia de Ceros"
set palette color positive
set key off
set size square
splot 'Canales.puddi' using ($1):($3):($5*100.0) #Grafico el Tamano de la frase, la frecuencia de ceros para el transmisor y el porcentaje de exitos multiplicado por 100 para que se vea mas visible
view raw Graficador.plot hosted with ❤ by GitHub

Imágenes de la ejecución


Probando con otros tipos de tamaño:



A continuación la liga al repositorio donde se encuentra el código: Liga

1 comentario:

  1. En el código faltó lo de desviación estándar; 4 pts.
    El reporte se pudiera haber mejorado de estructura y análisis, pero van 4 pts.

    ResponderEliminar