Duda Algoritmo genético.(O cómo convertir de real a binario)

Bueno, estoy implementando un algoritmo genético para aprendizaje de pesos en una red neuronal, y no tengo ni idea de como codificar un peso (numero real) a binario.

La verdad es que este tipo de cosas de conversiones y tal lo tengo bastante olvidado, y, aunque he encontrado cosas, no se adaptan del todo a lo que necesito...

La duda:

Imaginemos que lo que quiero pasar a binario va a estar entre -5.0 y 5.0... y me gustaría poder convertir los números tomando al menos 6 decimales. 0.123456 ... ¿Cuál es la mejor forma de convertir un número real de 6 decimales a binario? Cuantos menos bits necesite, mejor.

La verdad que ando pegado con eso, el resto del algoritmo creo que ya lo tengo planteado.

Para el que le interese, el objetivo es al final hacer una comparación entre aprendizaje por retropropagación y algoritmo genético.


Saludos y gracias!
Define 'convertir a binario' (piensa que el ordenador YA lo tiene en binario)
Supongo que el genotipo sera un array de bool y querrá pasar el número. En cuanto a la forma, dependiendo del problema, has pensado en multiplicar el número en base 10 por 10^(numero de decimales) y luego pasar sólo la parte entera a base 2?
has de explicar en que sistema quieres pasarlo, por ejemplo puedes pasarlo a coma fija o coma flotante. Ademas cuantos nits quieres usar (16, 32, 64), y no todos los numeros reales son representables, ten en cuenta que con 64 bits la cantidad de numeros distintos es limitada, por ejemplo con 16 bits y coma flotante tendrias un numero tal que:

SEEEEEEMMMMMMMMM donde:
S es el signo (1 negativo 0 positivo)
E el es elxponente (2^(M-31))
M es la mantisa

luego si quieres hacer del 5.0 al -5.0 yo creo que utilizaria SEEEMMMMMMMMMMMM, de este modo no se si llega a 6 decimales pero el valor maximo que puede alcanzar es un poco mas grande de 5.0 y menor de -5.0
Ferdy escribió:Define 'convertir a binario' (piensa que el ordenador YA lo tiene en binario)



Evidentemente me refiero a la representación binaria de dicho número real.

Supongo que con coma fija ahorraré bits en la representación... pero ya he dicho que me acuerdo de poco.

De todas maneras gracias por las respuestas... me habeis dado 1 par de ideas que probaré despues.

Saludos!
Evidentemente me refiero a la representación binaria de dicho número real.


Evidentemente esa representación ya la tienes.... Lee IEE754

- ferdy
Ferdy escribió:
Evidentemente me refiero a la representación binaria de dicho número real.


Evidentemente esa representación ya la tienes.... Lee IEE754

- ferdy



Gracias! necesitaba al menos una explicación de cómo se realiza la representación, y no sabía cómo ni donde buscarlo.

No se si C tendrá alguna función que te devuelva directamente el binario... pero en lisp no la hay.

Saludos y gracias!
elenur está baneado por "clon de usuario baneado"
4eVaH escribió:
Ferdy escribió:
Evidentemente me refiero a la representación binaria de dicho número real.


Evidentemente esa representación ya la tienes.... Lee IEE754

- ferdy



Gracias! necesitaba al menos una explicación de cómo se realiza la representación, y no sabía cómo ni donde buscarlo.

No se si C tendrá alguna función que te devuelva directamente el binario... pero en lisp no la hay.

Saludos y gracias!


¿Devolver el binario?

En binario están todos los números, también los de coma flotante.

¿?
Como ya te hemos dicho varias veces, el número YA ESTÁ REPRESENTADO EN BINARIO. La pregunta es '¿qué quieres hacer con él?'

- ferdy
Ferdy escribió:Como ya te hemos dicho varias veces, el número YA ESTÁ REPRESENTADO EN BINARIO. La pregunta es '¿qué quieres hacer con él?'

- ferdy


Pues ese número en binario será la codificación del genotipo, y sobre lo que se aplicarán las operaciones básicas de algoritmos genéticos de cruce y mutación... aunque me acabo de dar cuenta de que quizá puedo aplicar estas dos operaciones sobre el real directamente....

El cruce intercambiando pesos entre cromosomas y la mutación sumando una pequeña cantidad (aleatoria entre un rango pequeño tambien) y haciendo esta cantidad mas pequeña conforme avanza el algoritmo.

PD: Agradezco vuestra ayuda... quizá no me explico bien, claro que sé que el número en el ordenador está en binario, pero vaya, si vosotros teneis tan claro como decirle a lisp, toma este numero que te lo doy con representación real, escoge aleatoriamente un bit, y permutalo con una probabilidad x.... si me lo decis directamente me ayudais tambien mucho, eh? :P Saludos y gracias.
No tengo mucha idea de programación de algoritmos genéticos, pero si que los he usado en Matlab usando el toolbox Genetic Algorithm Optimization Toolbox. En este toolbox aplican las operaciones básicas de mutación y cruce directamente sobre números reales, así que puedes intentar echar un vistazo a como lo hacen.

Espero que te sea de ayuda
En C si quieres activar el bit 'bit' del real 'f' haces:

float f = 0.1;
char *c = (char *)&f;
unsigned bit = 4;
*c |= 0x1 << bit;


(O algo así vaya, no me he puesto a probarlo)

Igual hay que retomar esas clases de estructura de computadores y representación de la información :)

- ferdy
Ferdy escribió:
Igual hay que retomar esas clases de estructura de computadores y representación de la información :)

- ferdy


Si, o eso o ponerme como loco a buscar los apuntes de 1º.... es algo que tuve que hacer desde el principio, archivar los apuntes de un curso para otro. Ahora tengo una montaña de papeles impresionante.

Gracias por todo, ya le mandé un e-mail al que me va a corregir para preguntarle si había problema en hacer las operaciones de cruce y mutación como dije antes, y me dijo que perfecto.

Saludos!
12 respuestas