Mutaciones
Cómo cambia el ADN por azar, en vida y al nacer: los tipos de mutación, qué le hacen a las instrucciones, cómo se leen las tasas y cómo se encienden o apagan.
Las mutaciones son el motor de la evolución: cambios al azar en el ADN que pasan a los hijos. La mayoría rompe algo, alguna no cambia nada que se note, y muy de vez en cuando una sale mejor que el original. Si ese bot deja más hijos que sus vecinos, el cambio se queda.
En DarwinBots el ADN cambia en dos momentos: en vida, poco a poco, y al nacer, cuando se copia el ADN del padre (o se mezcla, en la reproducción sexual) para el hijo.
Quién muta
Para que un bot mute tienen que cumplirse dos cosas:
- Las mutaciones de la simulación están encendidas: es el interruptor Mutaciones de la app. Apagado, nadie muta, pase lo que pase.
- El bot tiene su propia tabla de mutaciones encendida. Cada bot lleva una tabla con una tasa para cada tipo de mutación, que hereda de su padre. Un tipo con tasa 0 no ocurre nunca.
La app siembra cada especie con la tabla encendida y las tasas de fábrica (ver abajo), así que en la práctica alcanza con el interruptor. Una tabla apagada o con tasas en 0 solo llega en los bots de una simulación guardada que la traen así.
Los tipos de mutación
| Tipo | Cuándo | Qué le hace al ADN | Tramo típico |
|---|---|---|---|
| Puntual | En vida | Cambia un tramo corto de instrucciones | 3 (± 1) |
| Delta | En vida | No toca el ADN: cambia una de las tasas del propio bot | — |
| Error de copia | Al nacer | Cambia instrucciones | 1 |
| Inserción | Al nacer | Agrega instrucciones nuevas | 1 |
| Inversión | Al nacer | Da vuelta el orden de un tramo | 3 (± 1) |
| Borrado grande | Al nacer | Borra un tramo | 3 (± 1) |
| Borrado chico | Al nacer | Borra una instrucción | 1 |
El tramo típico es cuántas instrucciones toca cada mutación: el motor lo sortea alrededor de ese valor. Las de nacimiento se aplican en el orden de la tabla, una pasada de cada tipo sobre el ADN del hijo. Las de vida corren en la fase de acciones de cada ciclo (ver El ciclo y el orden de las acciones).
El borrado grande y el chico son el mismo mecanismo con distinto tramo.
El motor tiene cuatro tipos más que vienen apagados y la app no enciende: una segunda puntual, un segundo error de copia, la translocación (mueve un tramo a otro lugar del ADN) y la amplificación (lo duplica).
Qué le pasa a una instrucción
La puntual y el error de copia cambian instrucciones una por una. Con la configuración de fábrica, de cada cinco cambios cuatro tocan el valor y uno el tipo:
- Cambiar el valor de un número (o de una lectura como
*50): lo corre un poco. La mitad de las veces es un salto grande (de unas decenas o un par de centenas) y la otra mitad un retoque de pocas unidades. Un número de más de 1000 se mueve en proporción: alrededor de un 10 %. - Cambiar el valor de un comando: lo reemplaza por otro de la misma familia. Un operador por otro operador (
addpormult, por ejemplo), una comparación por otra, unstartpor uncond. - Cambiar el tipo: la instrucción pasa a ser de otra clase. Un número se vuelve un operador, una comparación se vuelve un número, una lectura como
*.nrgse vuelve un store.
Como las direcciones son números, una mutación de valor sobre .up puede dejarte escribiendo en otra dirección: 10 .up store se convierte en 10 .dn store, o en un número que no es una sysvar y queda como memoria libre.
Hay dos cosas que ninguna mutación hace: tocar el end que cierra el ADN y crear uno nuevo.
Estos cambios los vimos pasar en hijos de un bot de un solo gen, partiendo de cond *.robage 5 > start … stop:
cond *.robage 5 > 291 start … inserción: un número suelto antes de start
cond *.robage > start … borrado chico: se fue el 5
cond > 5 *.robage start … inversión del tramo «*.robage 5 >»
cond *.robage 5 > … stop borrado del start: el cuerpo pasó a ser condición
El último es un buen ejemplo de mutación letal: sin start, los stores del gen quedan en la zona de condiciones y no escriben nada (ver Genes: cond, start, else y stop). Ese bot ya no se reproduce.
Las tasas
Cada tasa es un número N que se lee «una en N»: cuanto más grande, más rara la mutación. El valor de fábrica es 5000 para todos los tipos, y es el que reciben las especies que siembra la app.
| Tipo | Probabilidad |
|---|---|
| De nacimiento | Una en N por cada instrucción del ADN, en cada parto, para cada tipo. |
| Puntual | Una en 1000 × N por cada instrucción, en cada ciclo de vida. |
| Delta | Una en 100 × N por ciclo de vida. |
Con las tasas en 5000 y un ADN de 100 instrucciones:
- Cada tipo de nacimiento tiene un 2 % de tocar al hijo; sumando los cinco, alrededor de uno de cada diez hijos nace con algún cambio.
- Una mutación puntual le toca al bot cada unos 50000 ciclos de vida. En vida casi nada cambia: la evolución pasa por los partos.
Un ADN más largo muta más, porque hay más instrucciones donde sortear.
Las tasas se heredan, y la mutación delta las va moviendo: cuando ocurre, elige un tipo al azar y le cambia la tasa unos cientos para arriba o para abajo. Así un linaje puede volverse más estable o más cambiante con el tiempo.
Reproducirse para explorar: .mrepro
.mrepro funciona como .repro, pero el hijo nace con la tabla de mutaciones dividida por 10 solo para ese parto: cada tipo de nacimiento es diez veces más probable. Un tipo con tasa 0 pasa a 1000. Además el hijo muta aunque su tabla estuviera apagada; lo único que lo impide es apagar Mutaciones.
Después del parto el hijo vuelve a la tabla heredada: en vida muta como su padre, y sus propios hijos con .repro también.
Con las tasas de fábrica, en una población de bots de 20 instrucciones, cerca de 1 de cada 60 hijos nació con algún cambio al reproducirse con .repro, y casi 1 de cada 5 con .mrepro.
La idea es reservar .mrepro para cuando conviene probar cosas nuevas. El Animal_Minimalis_mod_stress del Bestiario se reproduce con .repro en condiciones normales y con .mrepro cuando está en apuros. Una versión mínima, que explora si viene perdiendo energía (.pain):
' Si viene perdiendo energia, explora; si no, se copia
cond
*.nrg 4000 >
*.pain 0 >
start
33 .mrepro store
stop
cond
*.nrg 4000 >
*.pain 1 <
start
33 .repro store
stopQué más cambia cuando un bot muta
- El color: cada mutación corre un poco uno de los tres canales del color, así que los linajes que mutan se van distinguiendo a la vista.
- La subespecie: el bot pasa a una subespecie nueva dentro de su especie (ver Especies y linaje).
.dnaleny.genesse actualizan en el momento.- La firma del ADN que leen las sysvars my* y que ven los demás con
.refeye,.refshooty compañía se rehace en el momento. - El contador de mutaciones del bot sube, y lo hereda el hijo.
La oscilación
El motor puede multiplicar las probabilidades de todos los bots a la vez, alternando épocas de mucho cambio con épocas de calma: hasta 16 o 20 veces más mutaciones en la subida y otro tanto menos en la bajada. Las tasas heredables no cambian; el factor se aplica encima, en el momento de cada sorteo. Viene apagada y la app no tiene un control para encenderla. El detalle está en El ciclo y el orden de las acciones.
Cómo encenderlas y apagarlas
| Querés | Hacé |
|---|---|
| Que nadie mute | Apagá Mutaciones. Es la única forma de frenar también a .mrepro. |
| Que muten más los hijos que el bot elija | Usá .repro para el parto normal y .mrepro para explorar: esos hijos mutan diez veces más. |
| Hijos distintos sin mutaciones | Usá la reproducción sexual: la mezcla ya varía el ADN. |
El motor trae además tres mecanismos que vienen apagados y la app no ofrece: un régimen alternativo en el que las tasas de cada hijo derivan al azar en cada parto, la auto-especiación (un bot que acumuló muchas mutaciones funda una especie nueva con otro nombre) y el reinicio epigenético (un linaje muy mutado deja de heredar la memoria genética, ver Memoria libre y epigenética).