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:
This file contains 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 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() |
Bash que llama nuestro programa en python para correrlo varias veces:
This file contains 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 | |
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 |
Programa en gnuplot para graficar los resultados obtenidos
This file contains 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 output 'salidaGrafica.png' | |
set key outside Right | |
set xrange [0:400] | |
set yrange [0.1:0.9] | |
plot 'result.txt' |
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
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