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 |
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 |
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 |
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 |
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 |
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 |
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 |
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.