Vida Artificial

Investigación

Artículos

Autor

Otros

Motor 07: ¡Velocidad!: Motor 05 reescrito en C++ y optimizado.

Las simulaciones de vida artificial demandan enormes ciclos de CPU (muchos cálculos). Java es un excelente lenguaje de programación, es completamente orientado a objetos, es multiplataforma, liviano, estable, descomplicado y diseñado para trabajar en ambientes interconectados. Pero por su misma naturaleza, en aplicaciones que requieren grandes cantidades de cálculos, Java comienza a mostrar su lado débil: lentitud. Y por dos razones: la primera es un lenguaje interpretado (requiere de una máquina virtual Java para ejecutar programas Java) y por su protección sobre la memoria (recolección de basura, verificación de pilas).

Por esa razón se cambió a C++, el cual ofrece un ambiente también de objetos, las instrucciones son muy parecidas a las de Java y por su velocidad. Los programas en C++ son compilados y optimizados para la plataforma. Para mantener la característica multiplataforma se escribió la aplicación en modo caracter (consola) y usando librerías estándar de C++. El código fuente esta disponible y el ejecutable esta para ambientes Windows 95/98/NT. Se usó Visual C++ para compilarlo.

Además de la simple traducción Java a C++, también se trabajó bastante en la optimización de varias funciones. El desempeño se elevó dramáticamente y se pudo agregar cierta funcionalidad a la simulación: almacenar en un archivo plano como va progresando la evolución de los algoritmos. Con los nuevos datos, se puede graficar como los algoritmos generados se van acercando (adaptando) poco a poco a la serie de salida.

Código fuente en C++ esta disponible: De clic aquí

Código ejecutable para Windows 95/98/NT/2000: De clic aquí OJO!: Chequee con un antivirus cualquier ejecutable que baje de Internet antes de ejecutarlo.


A continuación una serie de pruebas realizadas:

Motor 05. Serie Alterna. 100.000 intentos. 1-N instrucciones
Serie Entrada: 1,2,3,4,5,6,7,8,9,10,11,12,13,
Serie Salida: -1,2,-3,4,-5,6,-7,8,-9,10,-11,12,-13,
Intentos: 100.000
CPU: 130
Hay libertad de generar de 1 a N instrucciones

Posibilidades:
1. Tipo de Instrucciones. If Condicional: 50%, Asignación: 50%
2. En Instrucciones de If Condicional, el operador de comparación es: '==':25%, '>':25%, '<':25%, '!=':25%
3. Longitud de la expresión (número de operadores): 2

4. Construcción de las expresiones, posibilidad de salir X=33%, Paréntesis:33%, Números=34%
5. Variables que se asignaran, compararan o estarán al interior de las expresiones: W=25%, X=25%, Y=25%, Z=25%

Instrucciones Intento Aproximación
5 96770 74.000000
10 28214 72.000000
15 26002 81.000000
20 97956 17.000000
25 84482 19.000000
30 27982 52.000000
35 54042 60.000000
40 83584 52.000000
45 71772 12.200273
50 86 84.000000
55 29786 42.000000
60 93596 6.000000
Promedio: 47,60002275

image

De clic aquí para bajarse el archivo generado por esta simulación.


Motor05. Serie Alterna. 1.000.000 intentos. 1-N instrucciones
Serie Entrada: 1,2,3,4,5,6,7,8,9,10,11,12,13,
Serie Salida: 1,-2,3,-4,5,-6,7,-8,9,-10,11,-12,13,
Intentos: 1.000.000
CPU: 130
Hay libertad de generar de 1 a N instrucciones

Posibilidades:
1. Tipo de Instrucciones. If Condicional: 50, Asignación: 50
2. En Instrucciones de If Condicional, el operador de comparación es: '==':25, '>':25, '<':25, '!=':25
3. Longitud de la expresión (número de operadores): 2

4. Construcción de las expresiones, posibilidad de salir X=33, Paréntesis:33, Números=34
5. Variables que se asignaran, compararan o estarán al interior de las expresiones: W=25, X=25, Y=25, Z=25

Instrucciones Intento Aproximación
5 66134 54.000000
10 69524 62.000000
15 103596 48.000000
20 146054 12.000000
25 780072 8.000000
30 47348 72.000000
35 45408 71.000000
40 700642 0.000000
45 900170 71.000000
50 543176 4.745922
55 44000 72.000000
60 988810 0.729301
Promedio: 39.62293525

image

De clic aquí para bajarse el archivo generado por esta simulación.


Motor05. Serie Alterna. 1.000.000 intentos. N instrucciones
Serie Entrada: 1,2,3,4,5,6,7,8,9,10,11,12,13,
Serie Salida: 1,-2,3,-4,5,-6,7,-8,9,-10,11,-12,13,
Intentos: 1.000.000
CPU: 130
Es obligatorio generar N instrucciones

Posibilidades:
1. Tipo de Instrucciones. If Condicional: 50, Asignación: 50
2. En Instrucciones de If Condicional, el operador de comparación es: '==':25, '>':25, '<':25, '!=':25
3. Longitud de la expresión (número de operadores): 2

4. Construcción de las expresiones, posibilidad de salir X=33, Paréntesis:33, Números=34
5. Variables que se asignaran, compararan o estarán al interior de las expresiones: W=25, X=25, Y=25, Z=25

Instrucciones Intento Aproximación
5 455540 46.377579
10 406882 74.000000
15 954214 50.000000
20 132076 0.000000
25 830196 60.000000
30 126036 0.000000
35 956184 6.000000
40 9900 76.000000
45 53850 74.000000
50 218738 2.000000
55 438996 0.000000
60 718944 58.000000
Promedio: 37.1981315833333

image

De clic aquí para bajarse el archivo generado por esta simulación.


Motor05. Serie Ascendente. 1.000.000 intentos. 1-N instrucciones
Serie Entrada: 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,
Serie Salida: 2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,
Intentos: 1.000.000
CPU: 130
Hay libertad de generar de 1 a N instrucciones

Posibilidades:
1. Tipo de Instrucciones. If Condicional: 50, Asignación: 50
2. En Instrucciones de If Condicional, el operador de comparación es: '==':25, '>':25, '<':25, '!=':25
3. Longitud de la expresión (número de operadores): 2

4. Construcción de las expresiones, posibilidad de salir X=33, Paréntesis:33, Números=34
5. Variables que se asignaran, compararan o estarán al interior de las expresiones: W=25, X=25, Y=25, Z=25

Instrucciones Intento Aproximación
5 102874 45.000000
10 957520 39.447639
15 996508 18.000000
20 99218 53.000000
25 98898 45.999977
30 58268 43.000000
35 254238 45.000000
40 258604 35.066643
45 157938 55.000000
50 532500 24.766191
55 986362 32.444435
60 915824 59.420959
Promedio: 41.345487

image

De clic aquí para bajarse el archivo generado por esta simulación.


Motor05. Serie Ascendente. 1.000.000 intentos. N instrucciones
Serie Entrada: 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,
Serie Salida: 2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,
Intentos: 1.000.000
CPU: 130
Es obligatorio generar N instrucciones

Posibilidades:
1. Tipo de Instrucciones. If Condicional: 50, Asignación: 50
2. En Instrucciones de If Condicional, el operador de comparación es: '==':25, '>':25, '<':25, '!=':25
3. Longitud de la expresión (número de operadores): 2

4. Construcción de las expresiones, posibilidad de salir X=33, Paréntesis:33, Números=34
5. Variables que se asignaran, compararan o estarán al interior de las expresiones: W=25, X=25, Y=25, Z=25

Instrucciones Intento Aproximación
5 122572 53.600006
10 417310 27.000000
15 654810 34.000000
20 208450 55.000000
25 603730 33.999989
30 147940 55.000000
35 996706 21.421265
40 606862 20.666660
45 797128 22.205971
50 872330 31.037468
55 412528 36.099998
60 766004 42.036350
Promedio: 39.4510995

image

De clic aquí para bajarse el archivo generado por esta simulación.


Motor05. Serie Descendente. 1.000.000 intentos. 1-N instrucciones
Serie Entrada: 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,
Serie Salida: 97,89,83,79,73,71,67,61,59,53,47,43,41,37,31,29,23,19,17,13,11,7,5,3,2,
Intentos: 1.000.000
CPU: 130
Hay libertad de generar de 1 a N instrucciones

Posibilidades:
1. Tipo de Instrucciones. If Condicional: 50, Asignación: 50
2. En Instrucciones de If Condicional, el operador de comparación es: '==':25, '>':25, '<':25, '!=':25
3. Longitud de la expresión (número de operadores): 2

4. Construcción de las expresiones, posibilidad de salir X=33, Paréntesis:33, Números=34
5. Variables que se asignaran, compararan o estarán al interior de las expresiones: W=25, X=25, Y=25, Z=25

Instrucciones Intento Aproximación
5 225600 55.000000
10 267792 55.000000
15 826532 130.333328
20 494418 38.000000
25 682964 115.000000
30 327902 42.999989
35 681266 63.500000
40 148404 66.000000
45 109558 55.000000
50 872290 47.750000
55 670486 51.660690
60 823014 110.548561
Promedio: 69.232714

image

De clic aquí para bajarse el archivo generado por esta simulación.


Motor05. Serie Descendente. 1.000.000 intentos. N instrucciones
Serie Entrada: 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,
Serie Salida: 97,89,83,79,73,71,67,61,59,53,47,43,41,37,31,29,23,19,17,13,11,7,5,3,2,
Intentos: 1.000.000
CPU: 130
Es obligatorio generar N instrucciones

Posibilidades:
1. Tipo de Instrucciones. If Condicional: 50, Asignación: 50
2. En Instrucciones de If Condicional, el operador de comparación es: '==':25, '>':25, '<':25, '!=':25
3. Longitud de la expresión (número de operadores): 2

4. Construcción de las expresiones, posibilidad de salir X=33, Paréntesis:33, Números=34
5. Variables que se asignaran, compararan o estarán al interior de las expresiones: W=25, X=25, Y=25, Z=25

Instrucciones Intento Aproximación
5 887920 54.361118
10 959694 71.290817
15 640616 54.517761
20 661534 20.999996
25 938140 81.268394
30 488632 156.401413
35 764022 76.391617
40 997558 89.551041
45 897256 74.512314
50 972084 81.805405
55 824960 191.000000
60 998342 56.475044
Promedio: 84.04791

image

De clic aquí para bajarse el archivo generado por esta simulación.

Conclusiones:

1. Es llamativo que hay simulaciones que la aproximación es cero o muy cercana, y la siguiente la aproximación esta lejos. Para el propósito de buscar la mejor adaptación es bueno estudiar los algoritmos que dieron una aproximación lejana. ¿Por que? Porque pueden dar claves de la falla de la mutación y como implementar mejores mecanismos de mutación.

2. Nótese que la serie descendente siempre da una aproximación más lejana que una serie ascendente.

3. El número de instrucciones poco afecta a las simulaciones.

4. Con este aumento dramático de velocidad (simulaciones que tomaban días ahora toman horas), se puede implementar algoritmos mas complejos. Las nuevas simulaciones que usan procedimientos como Atrofia, Reproducción Sexual, Energía, Competencia, Cambios Ambientales serán implementadas en C++. En un futuro se implementará el uso de gráficos.

1