1) Al menos una variable donde guardar cosas (aquí guardaremos lo que aprendamos)
2) Un método de evaluación que te diga que tan mal/bien le fue a tu programa (lo que en la jerga de las matemáticas se le conoce como una función objetivo o una fitness function)
3) Una estrategia para que nuestro programa intente diferentes soluciones.
Y con solo esas 3 cositas ya la armamos, aquí un ejemplo sencillo.
Nuestro problema consiste en tener un programa que llene los envases de coca con coca-cola.
Nuestro programa se encargara de abrir la "manguera" por la que sale la coca.
Definiremos nuestros 3 puntos para este problema.
1) En este caso nuestra variable sera el tiempo en el mantendremos la manguera abierta.
2) Nuestro método de evaluación sera que tan llena o vacía queda el envase al pasar por nuestro programa, por ejemplo en la imagen, si la cantidad de coca vertida es justo la cantidad deseada obtendremos una calificación de 0, mientras que si nos pasamos o echamos de menos obtendremos una calificación negativa.
3) Y nuestra estrategia sera incrementar o disminuir el tiempo en el que dejamos la manguera abierta.
El uso de el tipo para aprender el bastante directo, puesto que lo que queremos es llenar una botella en cierto nivel, y el nivel de la botella depende de que tanto tiempo dejamos la manguera abierta. Nuestra función objetivo también es bastante directa, pues lo que queremos es vender cocas que contengan la cantidad de liquido que promocionamos (si no nos demandan) y sin embargo no darles mucho mas de esta cantidad, pues si no estamos regalandoles coca.
Aquí un disque código de un programa que intenta aprender este tiempo:
Aquí un disque código de un programa que intenta aprender este tiempo:
tiempo = 0;
mejorTiempo = 0;
mejorCalificacion = -infinito;
Mientras funcionemos
Abrir la manguera durante tiempo segundos y obtener nuestra calificación
si calificacion(tiempo) > mejorCalificacion{
mejorCalificacion = calificacion(tiempo)
mejorTiempo = tiempo;
}
tiempo = mejorTiempo + Random();
En la grafica pongo el resultado de una corrida de la siguiente implementación
http://pastebin.com/d9Cr93xU
Se gráfica el mejorTiempo en cada paso del loop contra la calificación obtenida por ese tiempo.
mejorTiempo = 0;
mejorCalificacion = -infinito;
Mientras funcionemos
Abrir la manguera durante tiempo segundos y obtener nuestra calificación
si calificacion(tiempo) > mejorCalificacion{
mejorCalificacion = calificacion(tiempo)
mejorTiempo = tiempo;
}
tiempo = mejorTiempo + Random();
En la grafica pongo el resultado de una corrida de la siguiente implementación
http://pastebin.com/d9Cr93xU
Se gráfica el mejorTiempo en cada paso del loop contra la calificación obtenida por ese tiempo.
No hay comentarios:
Publicar un comentario