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:
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.
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
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.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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 |
Código de Python
Terminando todo el ciclo se saca el promedio de todos los éxitos del ciclo y este dato sera utilizado mas adelante.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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() |
Código de AWK
Nos da el promedio de todos los elementos del Archivo Promedios.puddi
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#! /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; | |
} |
Código de Gnuplot
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 |
Imágenes de la ejecución
Probando con otros tipos de tamaño:
En el código faltó lo de desviación estándar; 4 pts.
ResponderEliminarEl reporte se pudiera haber mejorado de estructura y análisis, pero van 4 pts.