jueves, 24 de enero de 2013

Tarea 1: Flujo de Información

Para esta entrada, se nos pidió simular como es el flujo de la información generando una cierta cantidad de palabras con longitud dada y su contenido son caracteres binarios aleatorios, una vez obtenido se crea otra palabra a partir de la primera dada y dependiendo de la probabilidad de ruido que se haya pedido en determinado carácter es obtendrá la nueva palabra y se crean otras dependiendo del número de iteraciones. Tener las dos palabras con el número de intentos nos servirá para comparar el totales de éxitos que se obtuvo al transmitir la palabra.

Para tener más datos congruentes y tener una buena simulación, hay que realizar la prueba con diferentes valores tanto la longitud de la palabra, la probabilidad de salir uno y cero, la frecuencia de ésta y las iteraciones de la nueva palabra.

Esto se puede lograr, ya sea haciendolo todo en python estableciendo los parámetros y metiéndolos en un archivo ó tener un bash aparte donde mandaremos llamar nuestro archivo en python y lo meteremos en varios bucles, para que nos de sus diferentes resultados y finalmente graficarlos.

Código:
Programa en python donde generamos la frecuencia de las palabras:
from random import random
from sys import argv
def generarPalabra(l_word, p_ones):
n_word = ''
for i in range(l_word):
n_word += '1' if(random() <= p_ones) else '0' #operador Ternario
return n_word
def transmitirPalabra(intentos, word, p_ones, p_zeros):
exitos = 0
for n in range(intentos):
n_word = ''
for letra in word:
if(letra == '0'):
n_word += '0' if(random() <= p_zeros) else '1' #operador Ternario
else:
n_word += '1' if(random() <= p_zeros) else '0' #operador Ternario
if(n_word == word): exitos += 1
return exitos
def main():
l_word = int(argv[1]) #len word
pc_ones = float(argv[2]) #prob de unos
p_ones = float(argv[3]) #p_ unos
p_zeros = float(argv[4]) #p_ceros
intentos = int(argv[5]) #intentos
corrida = argv[6]
palabra = generarPalabra(l_word, pc_ones)
exitos = transmitirPalabra(intentos, palabra, p_ones, p_zeros)
exitos = float(exitos * 0.1)
_intentos = float(intentos * 0.1)
print corrida,' ',l_word, ' ', p_ones,' ',p_zeros,' ',intentos,' ',float((exitos*1)/_intentos)
main()
view raw gistfile1.py hosted with ❤ by GitHub


Bash que llama nuestro programa en python para correrlo varias veces:
#!/bin/bash
dat=resultados.txt
if [ -e $dat ]; then
rm resultados.txt
fi
touch resultados
i=0
for len_word in 5 10 15 20; do
for prob_unos in 0.2 0.5 0.7 0.9; do
for p_unos in 0.2 0.5 0.7 0.9; do
for p_ceros in 0.2 0.5 0.7 0.9; do
touch as.txt
for intentos in 2 4 6 8; do
corrida=`python frecuenciaPalabras.py $len_word $prob_unos $p_unos $p_ceros $intentos $i`
echo $corrida >> resultados.txt
i=$(($i + 1))
done
done
done
done
done
gnuplot grafica.plot
view raw gistfile1.py hosted with ❤ by GitHub


Programa en gnuplot para graficar los resultados obtenidos
set term png
set output 'salidaGrafica.png'
set key outside Right
set xrange [0:400]
set yrange [0.1:0.9]
plot 'result.txt'
view raw gistfile1.txt hosted with ❤ by GitHub

Resultados:
Los resultados de como salió nuestra simulación podemos verlos en la siguiente imagen, donde x es el valor de las veces que se corrió el programa y y es la cantidad de éxitos que se obtuvieron.

Archivos generados:




Plot:



**Nota, la imagen en sí no es muy congruente, así que crearé otro plot donde se tome la probabilidad de unos, ceros y la frecuencia que se obtiene.

Referencia:
http://elisa.dyndns-web.com/~elisa/teaching/comp/info/channel.pdf

1 comentario:

  1. Pues, faltó calcular las desviaciones estándar de y la visualización deja algo por desear. Van 4 por el programa y 3 por el reporte.

    ResponderEliminar