¡La programación genética es una forma de hacer que la computadora escriba programas para usted!
No piense en "programas" como MS Word, piense en "programas" de la siguiente manera:
function(x){ return x*2; }
Esta función (o programa), por sí misma, no tiene una razón para existir. Estamos buscando soluciones a los problemas. Si necesita encontrar la suma de dos números, simplemente abra la calculadora y haga los cálculos. ¿Qué pasa si alguien le dio la siguiente tabla y le pidió que descubriera la relación entre result
y x
y y
?
x y result
99 1 (3.02)
79 88 2.01
21 62 5.01
84 52 (6.58)
12 70 5.54
67 18 0.73
Estos datos son sus datos de "entrenamiento". Su computadora usará estos datos para generar algunas hipótesis, luego lo probará con datos reales.
Digamos que no conoce las estadísticas y decide que este problema es demasiado difícil de resolver por sí mismo, por lo que obtendrá la computadora para resolverlo por usted.
Haga que la computadora genere conjeturas al azar
Hace que la computadora genere un millón de respuestas y vea si alguna de ellas se adhiere (¡supongo ... un millón de veces!) El siguiente es un ejemplo de un par de conjeturas:
function(x,y){ return x+y; } // wrong
function(x,y){ return x/1*1*1*1*1*1+y; } //wrong, silly
Puede saberlo o no, pero las funciones o los programas también se pueden representar como árboles, por ejemplo, la segunda función sería:
(+ (/ x (* 1 (* 1 (* 1 (* 1 (* 1 1)))) y)
Puede hacer que se parezca más a un árbol sangrando así (por cierto, busque la notación de pulido inverso y la sintaxis de lisp ... pero comprenderá por qué representamos programas como este en breve):
(+
(/ x
(* 1
(* 1
(* 1
(* 1
(* 1 1))))
y)
( +
está en la parte superior con dos "hojas" de /
y y
. /
tiene varios hijos, etc.)
Es por eso que lees tanto sobre "árboles" en la programación genética. En cualquier caso, conectamos los valores de x
y y
en esta función y nos da la respuesta INCORRECTA. No es sorprendente, ya que generamos esto al azar.
Ahora decide generar un millón de tales soluciones. Todos ellos están equivocados. Sin embargo, observa que algunas respuestas están más cerca de la respuesta correcta que otras. En otras palabras, algunas soluciones son más "adecuadas" que otras. Tenga en cuenta que la computadora no sabe qué es "correcto" o "incorrecto", por lo que debe proporcionar su propia "función de estado físico". Esta función recibe una solución potencial, los datos de entrenamiento, y es responsable de decirle al sistema GP cuán "adecuada" es esta solución. Como puede imaginar, esta función se ejecuta millones y millones de veces.
Lo que hace diferente a GP
Esto es lo que hace que la programación genética sea diferente de las conjeturas salvajes. Decides hacer otra ronda de millones de conjeturas; sin embargo, lo haces un poco más inteligente. Usted toma el 10% superior de las conjeturas (las que se cerraron a los valores reales) y las hace parte de la segunda generación. También toma muchas de estas soluciones (quizás el mismo 10% ... no lo recuerdo) y decide "mezclarlas".
Elige aleatoriamente dos soluciones, elige aleatoriamente subárboles y comienza a intercambiarlas. Entonces, parte de la solución A termina bajo la solución B y viceversa: simplemente las "cruzó". También tomas algunas soluciones y simplemente las "mutas" ... toma un subárbol y 'atorníllalo' un poco (oye, si la solución es terrible, 'atornillarla sin ninguna razón' en realidad podría mejorarla).
Una buena forma de pensar en esto es la siguiente: su mamá y su papá tienen ciertos atributos: color del cabello, estatura, probabilidad de enfermedad, etc. Usted, como niño, hereda diferentes atributos de sus padres. Si tus dos padres fueran atletas olímpicos, también serás un súper atleta, ¿verdad? Bueno, biólogos, sociólogos e incluso historiadores podrían estar en desacuerdo con esta idea, pero los informáticos no están preocupados por la moralidad de la eugenesia aquí. Acaban de ver un "sistema" haciendo un trabajo bastante bueno proporcionando soluciones, por lo que decidieron modelarlo en software.
Si en realidad no coincide con la biología, pero aún así proporciona buenas respuestas ... muchos científicos informáticos dicen colectivamente "lo que sea, y gracias por la terminología". También tenga en cuenta que todos sus hermanos y hermanas y no EXACTAMENTE iguales ... incluso a través de ellos tienen los mismos padres. Cada persona tiene genes que mutan por cualquier razón (por favor, no se lo muestres a un biólogo, el punto es entender la motivación detrás de gran parte de la terminología).
Así que ahora estamos haciendo que la computadora genere millones de programas y midiendo su estado físico. Las mejores soluciones sobreviven hasta la próxima generación. También "mutamos" y cruzamos la "población" (observe cómo se usa el lenguaje de la genética y la biología). Una vez que se crea la segunda generación, la aptitud se mide nuevamente. Dado que esta generación tiene las mejores soluciones de la generación anterior Y cruzamos y mutamos las mejores soluciones (junto con una población mediocre para mantener la diversidad), esta generación debería ser al menos un poco mejor que la generación anterior.
Continuamos esto por un gran número de generaciones. Cada generación (con suerte) ofrece mejores y mejores soluciones, hasta que obtengamos la respuesta correcta. Por ejemplo:
(+ (- 2.2 (/ x 11) (* 7 (cos y))))
¡Mira esto, es correcto!
(Copié esto de http://en.wikipedia.org/wiki/Genetic_programming , que también tiene una representación gráfica de este árbol)
Retazos
Hay algunos problemas importantes, como cómo decide qué "terminales" ( +, -, *, /, cos, sin, tan
) están disponibles para su sistema GP, cómo escribe la función de estado físico y cómo maneja el sistema programas no sensoriales como (1 + cos)
o (2 / "hello")
(entre muchos otros).
Es bastante aburrido desarrollar ecuaciones. Se vuelve más interesante si su conjunto de terminales tiene el siguiente aspecto: (disparar, detectar al enemigo, moverse, ...) y su función de estado físico mide su salud y la cantidad de cadáveres de monstruos marciales.
Escribí la mayor parte de esto de memoria pero esta es la idea básica. Hice algunos GP en mis años universitarios. Definitivamente deberías jugar con eso. No se preocupe por comprender toda la terminología, solo descargue algunos sistemas GP gratuitos, revise algunos ejemplos para tener una idea y cree sus propios ejemplos interesantes (encuentre relaciones entre diferentes conjuntos de datos, intente conectarlo al juego API, etc.)