Diseño inteligente

¡No!, no os preocupéis por el título. No voy a hablar de ese Diseño Inteligente impuesto por ciertos grupos religiosos, mayoritariamente en Estados Unidos. Lo que en realidad voy a hacer, es proponeros una hipótesis muy particular mía sobre el asunto que espero que al menos; y a pesar de que sea, como no puede ser de otro modo pura especulación, os interese y os haga pasar un buen rato de reflexión trascendental.

Metodología.

Vamos a dividir esta entrada en dos partes diferenciadas: en una primera parte del artículo vamos a trabajar mediante un relato alegórico el cual esconde una doble lectura que se hará evidente conforme avance el mismo y de manera más explícita en la segunda parte del trabajo, donde se hará un resumen extenso de lo que vengo realmente a proponer.

Es necesario advertir que el tema que voy a tratar en toda esta entrada es bastante denso y que requiere de ciertos conocimientos previos (gran parte de los cuales ya he tratado personalmente en este mismo blog). Esto quiere decir que aquel lector que sea ingeniero, matemático o físico le será más fácil comprender la argumentación que voy a proponer (aunque no la comparta), pero quiero hacer hincapié en que creo que tampoco es totalmente necesario: cualquiera puede seguir el hilo a pesar de que quizás necesite un poco más de esfuerzo intelectual.

Dicho esto, empecemos :).

Parte I: "El encargo del jefe" (Relato alegórico)

Pongámonos en la piel de un ingeniero (el cual forma parte de un equipo o grupo de trabajo), al cual le proponen la difícil tarea de simular una enorme realidad. 

Así de simple: una mañana llega nuestro jefe a la oficina y nos suelta la bomba de que necesita que le solucionemos el modo en que lograr la ardua tarea de simular una gigantesca realidad. Una realidad que tendrá que ser totalmente consistente en el tiempo, y que además deberá cumplir estrictamente los siguientes cinco requisitos que el cliente final ha determinado:

  1. El mundo simulado puede ser de cualquier tamaño, siempre y cuando este tamaño permita cumplir el resto de exigencias que se enumeran a continuación.
  2. El mundo simulado debe contener estructuras complejas y diferenciables en el tiempo.
  3. El movimiento de tales estructuras debe ser autónomo y estar regido por comportamientos regulares en circunstancias equivalentes.
  4. Se requiere de la mayor eficiencia posible en la simulación de manera que se optimice el uso de recursos computacionales, con lo cual se minimice en lo posible la potencia delhardware requerido.
  5. Y finalmente: es requisito que se garantice que en cierto momento varias de estas estructuras complejas llegarán a alcanzar una relación de movimiento tal, que surja en ellas un estado de conciencia e inteligencia similar (en lo posible) al nuestro. También se desea que dichas conciencias se sientan independientes e interactúen mecánicamente entre ellas; y que sea el estado inicial de la simulación con su dinámica el que determine las configuraciones, propiedades, y formas de tales entes (y no una pre-programación con cierto diseño concreto).

Un inciso.

Llegados a este punto, puede que a muchos el relato os esté pareciendo absurdo, pero nada más lejos de la realidad: a decir verdad, si mi jefe llegase hoy mismo a la oficina y me pidiese lo anterior simplemente excluyendo el quinto requisito (de conciencia), no tendría ningún problema en realizar la tarea en menos de una jornada de trabajo (si dispusiese de un equipo lo suficientemente potente).

Y si aún así sigues teniendo reparos en la idea de una simulación a gran escala, echa por favor un ojo a este artículo: www.seeker.com/mind-blowing-computer-simulation-recreates-our-universe, donde se explica cómo hace apenas cuatro meses un equipo de investigadores ha conseguido la simulación del Universo más precisa hasta la fecha. Según los expertos, esta simulación ha mostrado la evolución de un universo metido en un cubo de 350 millones de años luz de lado durante 13.000 millones de años...¡y estamos hablando de tecnología ya existente, lo que deja mucho margen para lo que futuras generaciones podrán lograr en el campo de la simulación computacional (sobre todo conforme aumente la capacidad de procesamiento disponible en los supercomputadores)!

Es más, a continuación os voy a ofrecer un claro y sencillo ejemplo de tal mundo simulado que cumple los cuatro primeros puntos; y que por cierto se hizo famoso en su momento. Se trata del llamado "Juego de la vida" programado en Javascript y embebido en tu navegador web, el cual será el encargado de computar dicha realidad simulada a continuación:

 Este diseño fue ideado por el matemático británico John Horton Conway en 1970, y basa su funcionamiento en un "mundo" en dos dimensiones (2D) el cual contiene cierto número finito de celdas que pueden estar o no ocupadas por una estructura. En este diseño, el estado inicial determina el posterior transcurso autónomo y regular del movimiento de tales estructuras por entre las celdas conformándose con el tiempo a veces, y a pesar de la simplicidad de la programación, estructuras con patrones muy interesantes.

Si queréis echar un ojo al código fuente de este tipo de diseño pero en versión Java, podéis entrar por ejemplo aquí: www.bitstorm.org/gameoflife/code/

Pero continuemos con el relato.

Presentamos la idea de algo similar al "Juego de la vida" a nuestro jefe, pero evidentemente el jefe sabe que al cliente final esto le va a parecer claramente insuficiente y que no es para nada lo que necesita, puesto que su principal requisito es en realidad el quinto: es decir; que en cierto momento las estructuras simuladas alcancen una conciencia similar a la nuestra. Y con este simple mundo en 2D esto no va a ocurrir por mucho que esperemos y por mucho que extendamos el espacio (el tamaño) de la simulación.

Así que en el equipo de desarrollo nos disponemos (a nuestro pesar :P) a idear el modo en que podríamos conseguir este último y complejo requisito:

Lo primero que se nos viene a la cabeza es aumentar el número de grados de libertad del mundo simulado a tres dimensiones (3D) e idear luego una "física" que sea capaz de dar cuenta de los tres primeros puntos. Y ciertamente no vale con programar cualquier "física" que podamos imaginar, ya que alguna de tales "físicas" no permitirían por ejemplo la diferenciación entre estructuras (requisito 2), o un movimiento regular y repetible en circunstancias similares (requisito 3); e incluso muchas "físicas" contendrían indeterminaciones y otros problemas de computabilidad que harían inviable el procesamiento de la simulación. 

Otro inciso.

Esta "física" (con comillas) de la que se habla es, por supuesto, un compendio de fórmulas matemáticas programadas en algoritmos a tal fin de que según sea el estado en cierto "lugar" de la simulación, el computador pueda de manera autónoma dirigir el movimiento y determinar el futuro estado del sistema. Para lograr estos fines "físicos" podemos hacer uso de cualquier secuencia de procesos matemáticos, agrupándolos en funciones de cualquier número de variables sin restricción en cuanto a suavidad, continuidad, dominio ni imagen. Tenemos absoluta libertad matemática siempre y cuando el resultado final sea el requerido.

Todo esto, de hecho, ya se hace hoy día por ejemplo en los modernos juegos 3D para las consolas de última generación. En este tipo de juegos, el mundo se divide en tres grandes coordenadas espaciales (x,y,z), y se subdivide el espacio en pequeños volúmenes Δx·Δy·Δz que se denominan en la jerga informática como píxeles. La "física" matemática programada mediante las ya mencionadas funciones generales determina el estado de dichos píxeles y el comportamiento futuro del sistema para cada intervalo de tiempo Δε (que normalmente será un valor finito y racional mayor que cero, y que frecuentemente se relaciona con los frames por segundo que se desean mostrar).

De nueva cuenta, si mi jefe me diese personalmente el tiempo y el equipo hardware necesario, yo mismo podría (y de hecho en alguna ocasión tuve que hacer algo similar aunque a mucha menor escala) programar un mundo 3D con una riqueza comparable a la del mejor juego de la actualidad (se suele utilizar mucho en este tipo de programación el lenguaje C++ sumado al uso de alguna API o framework que facilite en gran medida el trabajo). El resultado a veces es similar al siguiente (y es de esperar que en pocos años la realidad virtual lograda aumente en gran medida):

Este vídeo es impresionante y da una clara muestra de lo que está por venir, y de la potencia de simulación que un simple PC o consola va a poseer en pocos años (cuando no es el caso que la posee ya).

Sigamos de nuevo con el relato.

Fenomenal, parece que vamos por muy buen camino pero tenemos un problema, y es un problema doble: los puntos cuatro y cinco. Aunque finalmente llegásemos algún día a diseñar y programar tras mucho esfuerzo un ente o conjunto de entes con todas las cualidades de inteligencia que el cliente pide, resulta que lo habremos no obstante pre-programado todo, mientras que lo que el cliente realmente desea es un generador de mundos simulados y no un mundo creado ad hoc. Este cliente no quiere depender de nosotros ni de diseñadores que tengan que hacer, rehacer y modificar todo el trabajo, sino que desea un producto final que a partir de cierta configuración paramétrica inicial espontáneamente evolucionen sus constituyentes de manera dinámica hasta lograr finalmente el hito deseado en el quinto punto de conciencia e inteligencia. De este modo, cada vez que se cambie un parámetro inicial de los disponibles (uno de los valores constantes posibles que podremos a su disposición y que luego participará en las fórmulas de nuestra "física" simulada), la dinámica de la simulación será distinta y el resultado final también: de manera que con ciertas constantes iniciales en nuestra "física" se alcanzarán estas estructuras inteligentes, mientras que para otros valores la simulación será un caos sin pies ni cabeza.

El otro problema tiene que ver más con el punto 4: la eficiencia y el requerimiento de hardware. El procedimiento de programación que se sigue en los juegos actuales es aceptable en casos donde se debe calcular el estado de cientos de estructuras y algunos millones de píxeles (normalmente los que aparecen en pantalla), pero pretender extender este mecanismo para computar una simulación de miles de billones de billones de "píxeles" y partículas produce tal explosión combinatoria (a causa de las interacciones y los cálculos dinámicos), que no hay en nuestro planeta espacio suficiente para colocar todos los computadores que serían necesarios para llevar adelante este cómputo con garantías (amén de que el cliente tampoco quiere tener que esperar una eternidad para que un computador menos potente procese cada paso simulado de Δε).

Recapitulando:

Así que necesitamos diseñar una "física" (punto 3) que aplicar sobre pequeños volúmenes de espacio. Estos volúmenes evidentemente no pueden ser infinitesimales dx·dy·dz dado el requisito de eficiencia y la necesidad de computabilidad que acabamos de ver, aunque no obstante sí que podrán ser volúmenes finitos y discretos Δx·Δy·Δz pero que acerquemos tanto su valor a cero que en la práctica no se note la diferencia. 

Por otra parte, esta "física" (y este espacio) necesitan admitir el cambio y el movimiento congruente de modo que sea posible la aparición de estructuras diferenciadas (requisito 2); y además, es preciso que sea un estado inicial configurable (constantes "físicas" iniciales) el que determine el resultado de la simulación, no pudiéndose pre-programar ad hoc absolutamente nada a parte de la propia "física" propuesta. 

Por último, necesitamos que como fruto de todo esto surja mediante esta dinámica autónoma en la simulación una (al menos una) estructura que demuestre conciencia y una inteligencia similar a la nuestra (resto del requisito 5). Sin olvidar que no podemos hacer un uso intensivo de infinitos recursos de hardware, sino que estamos limitados a conseguir una eficiencia tal que todo funcione con soltura en el equipo menos potente posible (el cual esté al alcance del cliente).

Ufff, menudo trabajo. Este jefe nuestro pilla cualquier marrón con tal de ganar dinero ;). Pero bueno, nosotros, como buenos currantes que somos vamos a ponernos manos a la obra sin rechistar:

Para empezar como Dios manda decidimos reunirnos todos los ingenieros del equipo y empezar con la tradicional tormenta de ideas:

En la reunión se arma mucho revuelo, y son varios los compañeros que desde el principio piensan que este proyecto es inviable y que el jefe se ha pillado los dedos; pero el jefe de proyectos pone orden e insta a buscar soluciones y no tirar la toalla a las primeras de cambio. Así que la reunión continúa y tras una larga deliberación terminamos con el siguiente resultado técnico previo:

1) Las leyes "físicas" que inventemos deben ser tales que garanticen la aparición de estructuras complejas inteligentes, pero como toda la dinámica va a estar regida por lasconstantes iniciales y dado que dichas constantes pueden tomar una infinidad de valores; no tendremos más remedio que repetir la simulación una y otra vez hasta que se produzca el resultado deseado.

2) Tendremos que poder detectar que se ha logrado el resultado deseado por entre millones de simulaciones y repeticiones cada una con unas características muy variopintas, cuestión que nos obliga a diseñar estas "físicas" de manera que sea fácil averiguar si en alguno de esos "mundos" se ha logrado por fin el requisito 5 y en cual de ellos ha sido.

3) Configurar manualmente las constantes iniciales es claramente inviable dada la infinitud de valores posibles y dado además que el más pequeño cambio en una de estas constantes iniciales producirá un gran cambio en la dinámica que muestre la "física" que luego genere. Se propone entonces que sea un proceso iterativo el que vaya seleccionando tales valores de entre el dominio disponible para cada constante inicial.

4) Por otra parte, nos damos cuenta de que las propias constantes iniciales: el número de constates y el dominio posible para cada una pueden ser también variables, y que tendremos pues que diseñar y proponer cuántas constantes iniciales usaremos y de qué modo haremos uso de ellas luego en las fórmulas de la "física" (amén de determinar qué rango de valores podrán tomar a la hora de ser configuradas al inicio de cada simulación).

5) Como no conocemos el tamaño ideal (volumen y diámetro) ni tampoco la forma que debe poseer el espacio de una simulación para poder llegar a albergar conciencia, nos vemos obligados a permitir que dicho tamaño sea variable y que dependa idealmente de la "física" y de las constantes iniciales seleccionadas. Ciertas combinaciones de "físicas" y constantes darán lugar a espacios mayores y en constante crecimiento, mientras que otras darán lugar a espacios menores o que con el tiempo entrarán en contracción.

6) Muy importante: la "física" no sólo debe ser tal que permita el cambio y el movimiento, sino que como ya vimos debe permitirnos detectar fácilmente si se alcanzó la inteligencia buscada y lo más importante de todo: debe poder computarse todo de manera eficiente y abarcable a nivel de hardware teniendo en cuenta que los "mundos" pueden ser enormes y que millones de simulaciones tendrán que llevarse a cabo antes de lograrse finalmente el quinto requisito.

En el equipo estamos desolados. Cuanto más pensamos en el problema, más complicado parece que se vuelve llevarlo a la práctica. Lo más importante de esta reunión es que ha quedado claro que es inviable pretender construir a tanteo la "física" adecuada y las constantes iniciales adecuadas. Las combinaciones son tantas y la dinámica tan caótica y sensible al menor cambio que podríamos estar miles de años probando alternativas y jamás llegaríamos al objetivo deseado.

Pero no desistamos, y empecemos a idear alternativas teóricas:

¿Qué "física" podría ser la adecuada para cumplir con todos los requisitos que ya hemos visto? Es decir; que leyes o regularidades mecánicas son las ideales o, en otras palabras, que conjunto de funciones y procesos matemáticos son los adecuados para lograr nuestro fin?

En principio no lo sabemos, y ya acordamos que dada la riqueza matemática disponible (prácticamente infinita) buscar a tientas esta "física" parece poco útil. No creo que el cliente tenga toda la eternidad para que le entreguemos el proyecto finalizado. Por lo tanto, vamos a tomar una alternativa muy útil en estos casos: nos decidimos a usaralgoritmos de computación evolutiva.

En este punto creo que es aconsejable que antes de seguir eche el lector al menos un ligero vistazo a estos dos artículos del blog donde explico qué es la computación evolutiva y muestro un ejemplo práctico de aplicación de la computación evolutiva.

El pseudocódigo que vamos a seguir es muy similar al siguiente:

Simplemente, y a grosso modo, vamos a comenzar generando una "población" inicial de simulaciones (cada una con su propia "física" generada de manera aleatoria y con los valores iniciales constantes también distribuidos de manera estocástica) y posteriormente vamos a dejar progresar libremente a esta población inicial de simulaciones, cada una siguiendo su propia "física" y ajustes iniciales durante un intervalo de Δε pasos. 

Una vez transcurridos libremente esos Δε pasos (que van a equivaler a una cierta cantidad de tiempo Δt en cada simulación), procedemos al segundo paso de evaluar cada simulación dentro de la "población" inicial aleatoria. Pero claro, ¿evaluar cómo? ¿En qué medida? Muy buena pregunta. De hecho, es una pregunta crucial:

El hecho de evaluar cada simulación nos sirve posteriormente para seleccionar aquellos individuos (simulaciones) que mejor parezcan estar consiguiendo el objetivo buscado, que en este caso es lograr encontrar alguna "física" que consiga con su simple dinámica autónoma alcanzar tras cierta cantidad de pasos en su progresión "futura", el hito de que aparezcan en dicha simulación estructuras inteligentes (junto con el resto de requisitos que ya discutimos antes). Pero, evidentemente, esta evaluación no puede ser certera ya que si tuviésemos un modo de poder prever de manera totalmente determinada si una simulación va a alcanzar o no el objetivo nos podríamos ahorrar todo el proceso evolutivo y directamente usar ese método para entresacar la "física" correcta. No es éste, desde luego, el caso, por lo que nuestra evaluación tendrá que estar basada en alguna triquiñuela que inventemos.

Así que, ¿cómo podríamos tantear cuantitativamente a partir del estado de una simulación en cierto momento la probabilidad de que se encuentre o no en camino de lograr el objetivo? La respuesta más evidente consiste en medir de alguna manera la complejidad total alcanzada por dicho "mundo". Es de suponer que un "mundo" con estructuras inteligentes deberá ser un mundo que contenga una gran complejidad estructural en él y que sea por lo tanto poco homogéneo o simple. Valdría pues con asignar mayor valor a aquellas simulaciones que contengan mayor cantidad de complejidad estructural. Un mundo donde la "física" no favorezca estructuras que puedan incrementar asociativamente su complejidad (como ocurre en nuestro mundo, donde hay varias partículas que se pueden agrupar en átomos, y luego éstos en moléculas que dan lugar a una rica combinación química, etc.) es mal candidato. Y aunque este punto parece claro sin embargo nos surge una nueva duda: ¿cómo medir este nivel de complejidad?

Esta es la clave principal de todo lo tratado. Si necesito medir cómo de compleja es una simulación, tendré que apañármelas para poder realizar de modo cuantitativo esta comparación o medida entre "mundos", y para ello tendré que imaginar algún postulado que todas estas "físicas" vayan a poseer en común: podríamos, por ejemplo; suponer que cualquier "física" va a disponer siempre al comienzo de una cierta cantidad inicial de movimiento en potencia y otra cantidad de movimiento efectivo; y que, aunque la suma de ambas cantidades vaya a ser siempre constante se permita el paso de un tipo de movimiento a otro, dependiendo el movimiento en potencia únicamente de la posición de las estructuras mientras que el movimiento efectivo dependerá además del ratio al que la propia estructura cambia de posición en el espacio.

Esto que acabamos proponer es equivalente a decir que aunque cada simulación va a disponer de sus propias y variadas leyes "físicas" matemáticas; todas van a compartir una especie de base que para entendernos podemos identificar como la cantidad de movimiento en potencia (cantidad de energía potencial del "mundo"), la cantidad de movimiento efectivo (energía cinética) y la conservación de la suma de ambas cantidades (conservación de la energía total).

Técnicamente lo único que necesitamos es establecer un marco común por el cual en toda "física" admisible deberá presentar siempre dos variables K  y U, las cuales representen la suma total de estos dos tipos de movimiento en la simulación para cada intervalo de tiempo (y que la suma K + U permanezca contante) y poco más: el modo en que K y U sea representado en cada "física" (las fórmulas que den lugar en cada instante a estas cantidades totales) se dejará variar libremente entre simulaciones.

Ahora sí, ¿cómo medir la complejidad en cierto momento de cierta simulación? Pues en base al postulado común que hemos montado, podemos establecer que un mundo será tanto más complejocuanto más rápidamente convierta su movimiento en potencia en movimiento efectivo por unidad de tiempo, es decir; cuanto más trabajo se realicé en él de media en cada instante o, en otras palabras, cuanto más potente sea la simulación.

Aclarado esto, ya podemos continuar con el proceso de computación evolutiva que dejamos antes a medias. Decíamos que, transcurridos Δε pasos procedíamos a evaluar cada simulación; y ahora vemos que esa evaluación se basará simplemente en calcular cuantitativamente lapotencia total interna de cada "mundo". Un modo sencillo (pero no el único) podría ser almacenar el valor global de K (Kp) en la evaluación anterior, y simplemente tomar como representación de la potencia interna el valor en el instante actual de restado al valor previo:

P = K - Kp

Pues bien, procedemos de esta manera y evaluamos cada simulación de la "población" inicial, tras lo cual vamos a terminar con un valor P que representará numéricamente con cierta precisión la potencia de una simulación o, lo que es lo mismo, el ratio al que dicha simulación va convirtiendo movimiento en potencia en movimiento efectivo dado un intervalo de pasos Δε.

Lo siguiente es sencillo: seleccionar las, por ejemplo; N / 2 simulaciones más potentes, donde N es un entero que representa el número constante de individuos -simulaciones- en la "población" con la que trabajamos. Tras lo cual únicamente nos queda clonar esos N / 2"mundos" seleccionados para generar a partir de ellos otras N / 2 simulaciones. Pero, y esto es muy importante, cada clonación será propensa a un cierto número de modificaciones aleatorias (que podemos denominar si queremos mutaciones), las cuales modificarán ligeramente la "física" y las condiciones iniciales de su simulación "padre".

Y con esto ya podemos trabajar con el algoritmo evolutivo (a la espera de definir lacondición de parada, que veremos posteriormente). Simplemente deberemos proceder a declarar el valor del intervalo de pasos Δε con el que vamos a trabajar (por ejemplo, Δε = 500.000.000.000.000.000 pasos)  y el número de simulaciones que va a contener la "población" de simulaciones (por ejemplo, N = 1.000.000.000 simulaciones). Y de esta manera comenzaremos la iteración evolutiva e iremos dejando pasar generación tras generación. 

Una cosa debe quedar clara. Siguiendo este proceso, tenemos asegurado que con el transcurso de las generaciones iremos obteniendo (descubriendo) cada vez "físicas" y estados iniciales más y más potentes (i.e., complejos). Y lo más importante, este proceso evolutivo esabarcable; cosa que no ocurre si se intenta aproximar este desafío por fuerza bruta (intentando iterar directamente sobre todas y cada una de las posibilidades matemáticas para la "física" y para los valores iniciales, ya que vimos que se trata de combinaciones prácticamente infinitas). 

Nos falta un último paso, pero quizás el más importante. ¿Cuándo paramos el proceso evolutivo? ¿Cuándo podemos suponer que uno de estos "Universos" simulados ha alcanzado el requisito de que contenga una inteligencia similar a la nuestra?:

Para ello, vamos primero a estudiar nuestra propia inteligencia. ¿Qué consecuencias físicastiene en nuestra realidad el hecho de nuestra sobresaliente inteligencia racional? Pues un rápido vistazo nos demuestra que nuestra inteligencia como la conocemos hoy ha supuesto desde su mismo origen hace decenas de miles de años un aumento, al comienzo gradual y posteriormente exponencial, de la cantidad de energía libre consumida (es decir; de la cantidad de trabajo que hemos realizado). Cada vez consumimos más energía potencial y de más variadas fuentes para realizar con ella el trabajo necesario capaz de mantener nuestra compleja estructura personal y también social. Y no sólo eso, sino que también nos afanamos por replicar nuestra estructura tanto como sea posible, siendo el ideal un crecimientoexponencial de la población, lo cual va aparejado con un necesario crecimiento exponencialde la producción y consumo de energía y recursos.

Es más, el ideal de nuestra inteligencia es (y quizás sea logrado algún día) llegar acolonizar otros planetas los cuales explotar del mismo modo que hemos hecho aquí en nuestro planeta. Concluimos, por lo tanto, que una inteligencia similar a la nuestra supone a nivel físico una clara tendencia hacia explotar exponencialmente toda la energía libre disponible de modo que sea factible una replicación también exponencial de su propia estructura, siendo el ideal de tal tendencia física llegar en algún momento a escapar de su lugar de nacimiento y colonizar o expandirse por entre todo el espacio disponible.

Resumimos, por lo tanto, que la condición de parada del proceso de computación evolutiva podría ocurrir cuando, al dejarse transcurrir los Δε pasos para cada simulación de la generación en curso, en alguna de ellas acontezca un súbito, explosivo y disperso evento de aumento en la complejidad global estructural (i.e. en el consumo medio de la energía en potencia por unidad de área). Este exponencial y disperso aumento en el trabajo neto realizado en el "mundo" sería una clara señal de que una enorme complejidad estructuralhabría acontecido, pudiéndose correlacionar dicha complejidad con el surgimiento de alguna inteligencia como la nuestra que haya logrado expandirse por su "Universo" simulado. 

Para aclarar un poco la cosa.

Vamos a suponer que echamos a andar el algoritmo evolutivo y que, en algún momento, la "física" (y las condiciones iniciales) de alguna simulación mutada en la enésima generación resulta tal que aproximadamente al cabo de, por ejemplo; 435.196.800.000.000.000 pasos (lo cual, suponiendo que cada paso equivalga a un segundo supondría para la simulación el transcurso de aproximadamente 13.800 millones de años) se detecta en cierto lugar de su "espacio" un súbito y explosivo aumento por unidad de área en el consumo de energía (es decir; que la diferencia entre Kp K crece exponencialmente en cierto lugar). Imaginemos además que ese aumento exponencial en el consumo de energía libre por unidad de área lo ha causado la aparición primero de "vida", y posteriormente el surgimiento de una "inteligencia" como la nuestra. Si finalmente esa inteligencia logra (como nosotros mismos deseamos) colonizar otros "planetas" y se expande por el "cosmos" simulado, se podría detectar ese evento como que ese súbito y exponencial aumento en la complejidad se dispersa rápidamente por el "espacio" (tras otra cantidad de pasos). Si esto llega a ocurrir, el algoritmo pararía indicando que con la "física" de esa "simulación" es muy probable que se haya logrado alcanzar una inteligencia similar a la nuestra (que era lo que el cliente esperaba). 

En el equipo estamos emocionados. Aunque parecía imposible, finalmente lo hemos conseguido. Parece ser que ya lo tenemos por fin todo analizado y preparado, listos para empezar a programar. Pero pronto nos damos cuenta de que no va a ser tan fácil, y es que hay que tener en cuenta un detalle importante: no cualquier "física" es completamente computable. Habrá formulaciones para la "física" que lleven en el transcurso de los Δε pasos a estados indefinidos o indeterminados que podrían originar paradojas matemáticas imposibles de computar (por poner un ejemplo, la consabida división por cero), y también podría ocurrir que alguna física cayese en algún tipo de bucle infinito que hiciera imposible continuar computacionalmente hablando con el resto de pasos hasta alcanzar los Δε pasos previos a laevaluación. Y habrá que tener en cuenta además las limitaciones en cuanto a la precisión de los registros y a la memoria disponible por el equipo físico (hardware) encargado de procesar el cálculo de las simulaciones.

Todas estas "físicas" problemáticas deben ser desechadas para que no interfieran en el proceso evolutivo, y una buena manera es evitando siempre en lo posible el aumento incontrolado del valor definido para las variables de la "física". Para tal fin, vamos a forzar primeramente a que deba existir siempre un valor máximo para la cantidad de cambio por unidad de tiempo, es decir; vamos a obligar a que siempre exista en la "física" una determinada velocidad máxima que no podrá ser rebasada (con lo cual evitamos que con el tiempo la velocidad de algún "objeto" vaya aumentando (acelerando) de manera tal que desborde con su valor los registros disponibles en el hardware. También pusimos ya cota a la cantidad mínima de volumen de espacio con el que vamos a trabajar de manera que haremos discreto el "espacio" disponible Δx·Δy·Δz, aunque vamos a dejar abierto el número de dimensiones con lo que podríamos llegar a tener algo así:Δx1·Δx2·Δx3·Δx4·Δx5·Δx6·Δx7·Δx8·Δx9·Δx10. Igualmente, también vamos a hacer discreta la cantidad mínima de tiempo que puede transcurrir Δt entre dos eventos.

Si todo este concepto de procesar "físicas" virtuales mediante computación evolutiva te parece complicado o poco creíble, quizás te interese echar un ojo a estos dos trabajos propios (con código fuente incluido) donde precisamente se programa algo similar (aunque a una escala evidentemente menor): Ejemplo I de programación evolutiva aplicada a un sistema Lennard-JonesEjemplo IIEjemplo III.

Es decir; que en resumen, por ahora hemos llegado a las siguientes conclusiones sobre las "físicas" admisibles a tener en cuenta en el proceso evolutivo, las cuales deben cumplir con que:

  1. Habrá siempre en ellas una velocidad (incremento en el cambio espacial por unidad de tiempo: Δx / Δt) máxima alcanzable (cuyo valor será libre y variable para cada simulación). Esta velocidad extrema (que podemos llamar c) supone al mismo tiempo que existirá siempre un límite en cuanto a la cantidad de cambio. La máxima traslación espacial posible (teniendo en cuenta que max. Δx / Δt = c) vendrá dada entonces (en cada dimensión) por la relación Δx = c · Δt
  2. El volumen de espacio mínimo a tener computacionalmente en cuenta será discreto, aunque de dimensiones variadas (por ejemplo; Δx1·Δx2·Δx3·Δx4·Δx5·Δx6·Δx7·Δx8·Δx9·Δx10).
  3. El intervalo mínimo de tiempo a tener en cuenta computacionalmente  también será discreto Δt (y estará relacionado con el número de pasos Δε acontecidos de manera externa por el computador). Esto permite que exista así un tiempo relativo t en la simulación, pero que aun así exista un tiempo absoluto ε (el paso) que será trascendental e independiente de la simulación.
  4. Siempre existirán dos variables K y (que representan cuantitativamente como vimos a la cantidad de movimiento efectivo y en potencia), cuya suma dará siempre un mismo valor constante E, y participando siempre estas variables (formando parte de un modo u otro en las fórmulas de la "física") en todo proceso de cambio en el movimiento interno a una simulación.
  5. El valor total de E (la suma global de K + U) será un valor finito y constante.

Todo esto nos ayuda a evitar en parte "físicas" problemáticas y no computables ya que se garantiza que no acontezcan fácilmente cálculos que impliquen valores infinitos aunque, a pesar de todo, todavía detectamos que es posible que algún bucle en alguna función se vuelva infinito (o tan grande que se vuelva computacionalmente inabordable por nuestro equipo dehardware). Por lo tanto, no nos queda otro remedio que implicar una nueva restricción a las "física" a tener en cuenta:

  1. Siempre habrá una cantidad mínima y discreta de acción que formará parte implícita en cada proceso de cambio. Es decir; se va a establecer un cuanto de acción el cual pondrá cota al número de cálculos requeridos a la hora de tener en cuenta cómo varía la energía con el tiempo. El valor de esa acción mínima es libre para cada "simulación":

De esta manera, teniendo en cuenta que el valor de E es finito y constante, U y K serán finitos en todo momento (puesto que la cantidad de cambio se ha hecho discreta), y como además dichas variables participan en todo movimiento y el incremento en el movimiento por unidad de tiempo discreto Δt no puede superar cierto valor c, al mismo tiempo que todo movimiento es impulsado por una acción A finita y discreta relacionada siempre con una constante de mínima de acción a la que podemos denominar por ejemplo como h, se garantiza en conjunto que la "física" en consideración será computable y estará libre de infinitos, indeterminaciones y bucles de cómputo demasiado grandes. Se descarta así cualquier física que contenga llamadas a funciones con bucles o cálculos que superen cierto umbral del tiempo establecido puesto que el cuanto de acción supone una cota cuantitativa a la complejidad computacional requerida para procesar todos los cambios "materiales".

Eficiencia computacional.

Vale. Ya tenemos el diseño conceptual bien definido, pero tenemos un grave problema: echar a andar tal cual todo lo que hemos propuesto es computacionalmente ineficiente (una locura). A pesar de todas las acotaciones y discretizaciones todavía nos encontramos con que tratar todas las interacciones internas a cada simulación supone un uso exponencial de recursos (explosión combinatoria en la dinámica "material"). De manera que vamos a tener que imponer algunas nuevas reglas al conjunto de fórmulas que vamos a permitir para nuestra "física":

  1. Vamos a usar y abusar del concepto de simetría. Cualquier "física" a tener en cuenta, siempre irá a poseer un comportamiento tal que los "fenómenos" internos a dicha simulación sean equivalentes ante cualquier cambio de coordenadas o propiedad. De esta manera vamos a evitar tener que recalcular una infinidad de combinaciones equivalentesde interacciones, movimientos y estados.
  2. Se obligará a que la "física" de cómputo muestre una conservación interna del valor de ciertas variables, de modo que finalmente exista una conservación general en el valor local (y global) de la variable principal que antes hemos denominado E y que se relacionada los valores de K y U. Esta es la manera más sencilla y eficiente de conseguir acotar enormemente la cantidad de combinaciones posibles en que los "fenómenos" pueden interactuar y trasladarse. Es decir; que puesto que van a existir claras reglas de conservación en ciertas propiedades "materiales", vamos a poder desechar así una infinidad de movimientos y cambios que no serán ya aptos (que no mantendrían esta conservación "física"), por lo que vamos a asegurar que nuestra "física" será siempre finita y mínima en cuanto al número de opciones a tener en cuenta a la hora de determinar (computar) el movimiento futuro del "fenómeno".

Pero a pesar del avance que estas sencillas reglas de selección (para la "física") suponen en cuanto a mejora en la eficiencia, aún no es suficiente. Todavía haría falta una capacidad de cómputo inimaginable para poder simular millones de estas "realidades" conteniendo miles de billones de entes "materiales" diferenciables interactuando durante miles de billones de pasos ε en un proceso evolutivo iterativo como el que hemos visto. Todos comprendemos en el equipo de desarrollo que para computar todo lo necesario haría falta posiblemente un ordenador tan grande o casi tan grande como la propia realidad que se quiere simular. Es evidente que debemos marcar nuevas reglas de selección que permitan que los requisitos dehardware sean radicalmente menores:

Lo primero que se nos viene a la mente, es que el mayor coste de cómputo viene de tener que llevar el cálculo en cada paso (ε) de la posición y la interacción exacta de cada ente "material" en relación con el resto de la simulación. Este es el verdadero origen de la explosión combinatoria en el cálculo de la simulación, y el remedio no puede ser otro que sencillamente NO llevar este cálculo cada paso ε, sino realizar el cálculo únicamente cuandosea necesario. Muy bien pero, ¿cómo?:

  1. Lo primero que haremos será usar funciones de probabilidad conjunta para los entes "materiales". De este modo, el estado y la trayectoria en el "tiempo" de un enorme conjunto de entes "materiales" estará descrito por la suma lineal solapada de una enorme cantidad de estas funciones de probabilidad Ψ = ψ1 + ψ2 + ... + ψn
  2.  Es decir; que ninguna "física" va a calcular de continuo el estado y la trayectoria de cada estructura de "materia" y su interacción con el resto de "entes" (coste exponencial), sino que será una suma lineal de funciones de probabilidad la que determine el comportamiento coherente futuro de un sistema cualquiera. 
  3. Y sólo en el momento en que sea preciso, por ejemplo cuando en un sistema local se supere cierto valor umbral para la probabilidad Ψ de interacción entre entes (o de cambio de estado), será cuando se proceda a calcular realmente el estado y la posición de la materia; entresacando un valor aleatorio de entre los posibles para dicho estado, pero siguiendo siempre la densidad de probabilidad de la que estamos hablamos.
  4. En este sentido, cualquier "física" será libre de definir la forma matemática concreta de estas funciones de probabilidad, pero estará restringida a NO llevar un cálculo continuo e individual del estado y la trayectoria de cada ente, limitándose a construir una función de agregados lineales que represente la densidad de probabilidad del comportamiento de enormes cantidades de "materia" al mismo tiempo.

Esta regla sí que nos ha supuesto una enorme mejora de eficiencia. Al no tener que tratar por separado la trayectoria, el estado y la interacción en cada momento de cada "partícula" (orden claramente exponencial), hemos logrado reducir la complejidad de cómputo a un orden lineal O(n) mucho más abarcable. Y, además, la introducción de funciones de probabilidad cuya densidad vamos a seguir a la hora de entresacar (colapsar) valores observables, nos permite que la "realidad" simulada sea coherente a pesar de todo. Pero sigamos afinando:

  1.  Los entes "materiales" se van a distinguir unos de otros por ciertas propiedades particulares relacionadas con su manera de interactuar con los demás entes, pero siempre que dos "entes" o "partículas" sean del mismo tipo (tengan las mismas propiedades básicas) se tratarán computacionalmente como si fuesen indistinguibles e indiferenciables, i.e. como entes intercambiables. Esto va a permitir un enorme ahorro a la hora de llevar el cálculo de estas "partículas" de propiedades idénticas al permitirnos desechar aquellas combinaciones cuyos cálculos nos producirían el mismo resultado (al tratarse de "partículas" idénticas). 
  2. Vamos a suponer un umbral de separación mínima entre "partículas". Esto supone que dos entes no van a poder estar más cerca de cierto intervalo Δx, lo que se traduce en que la densidad de probabilidad de encontrar dos "partículas" en un mismo estado y posición debe ser cero. Esto nos va a permitir un ahorro considerable de cálculo al no ser posible muchas combinaciones de estado, pero fundamentalmente va a permitir una variabilidad más alta de estados (al no permitirse que toda la "materia" se aglomere en un único punto), y también va a permitir que la evolución de la simulación sea más suave, sin que toda la energía libre sea consumida simplemente acomodándose cada "partícula" en un mismo estado de energía mínima. Este punto va a garantizar, por tanto, una "lucha" y "competición" por aquellos estados de energía mínima tanto a nivel individual, como a nivel de conjunto. Se podría hablar de una especie de principio de exclusión de estados idénticos en momentos idénticos en un mismo lugar.

Con estas reglas de selección que hemos visto, nos aseguramos la finitud en el cálculo de cada paso en el proceso de computación del algoritmo de la "física" de cada "mundo" simulado; y al mismo tiempo, hemos logrado que la complejidad de cómputo sea lineal en su transcurrir excepto en aquellas ocasiones en que sea necesario procesar una interacción al superarse algún umbral para el colapso de cierta distribución de probabilidad local.

Por último, y para rematar la faena, vamos a obligar a que la precisión a la hora de calcular ciertas variables de estado conjugadas: fundamentalmente posición y cantidad de interacción (momento), no puedan superar cierto valor umbral. Es decir; que conforme aumente la precisión con que se calcule una de tales variables de estado, disminuya el esfuerzo invertido en calcular la variable conjugada. Esta indeterminación o impresión en variables de algún modo relacionadas evitará cálculos que entren en un proceso de exclusión mutuainfinito al intentar calcular con demasiada precisión una de tales variables y al mismo tiempo a su conjugada. Si denominamos a este valor umbral como ħ (un número real constante), esta limitación significa que toda "física" deberá presentar una restricción parecida (aunque no necesariamente igual) a la siguiente para cada par de variables conjugadas de algún modo:

ΔxΔp ≥ ħ/2

Por fin, parece que todo ya encaja: hemos preparado un algoritmo evolutivo capaz de generar millones de simulaciones y adaptarse y progresar generación tras generación buscando aquellos mundos con una "física" potente capaz de albergar estructuras muy complejas. También hemos ideado el modo de asegurar un método que nos indique cuando es probable que la inteligencia haya emergido en alguno de tales mundos "virtuales" computados. Y más importante aún; hemos establecido las reglas de selección necesarias para acotar las "físicas" admisibles, válidas y eficientes a tener en cuenta en la población de simulaciones de cada iteración evolutiva.

Felices, y con el trabajo ya hecho, nos vamos a descansar todos a la cafetería un rato. Sin embargo la conversación termina girando de nuevo en torno al enorme proyecto que hoy nos han encargado. En un momento dado, un compañero comenta algo que nos da que pensar al resto: - "Chicos, ¿os habéis fijado en lo parecidas que necesariamente van a ser las "físicas" permitidas por nuestro programa con la física de nuestro propio mundo?". Es sin duda algo que da que pensar y que nos hace dudar honestamente a todos de si no seremos nosotros mismos también parte del procesamiento de un computador que trasciende nuestra propia realidad...y por cierto: ¿para qué querrá el cliente de nuestro jefe conseguir simular mundos con entes inteligentes? Y más importante aún: ¿sufrirán y padecerán esos entes "virtuales" como nosotros lo hacemos? En tal caso, ¿es siquiera moral el trabajo que hemos hecho?

Acabado el descanso volvemos a nuestros puestos en la oficina: la parte fácil ya está hecha, ahora quedan por delante un par de décadas para llegar a programar todo este gran diseñoideado. Tenemos trabajo para rato.

Parte II: "La moraleja, y sus consecuencias"

Es complicado, si no imposible, que algún equipo de trabajo de hoy día tenga la capacidad de hardware requerida para llevar a cabo un desarrollo como el propuesto en el relato anterior. La capacidad de cómputo sigue siendo ciertamente enorme (a pesar de los esfuerzos por minimizar el coste de computación), y es bastante improbable que algún organismo público o privado tenga la tecnología necesaria para lograr la proeza de procesar esa especie de multiverso computacional. Pero eso no implica que algún día (no tiene necesariamente que ser en un momento demasiado lejano) la humanidad no pueda alcanzar ese nivel de desarrollo técnico necesario; del mismo modo en que tampoco se puede descartar que alguna hipotética civilización no humana lo haya logrado ya en algún otro lugar del cosmos.

Imaginemos por un momento que éste sea el caso, y que cierta civilización en cierto momento en cierto "Lugar", ha conseguido la capacidad de cómputo suficiente para programar y echar a andar el proceso evolutivo de múltiples simulaciones que hemos descrito antes. Si este fuera el caso, algún "mundo" de entre las múltiples simulaciones de ese Superordenador trascendente (trascendente para cualquier "inteligencia" nacida en cualquiera de esas simulaciones) podría presentar tranquilamente tras n iteraciones del proceso evolutivo una "física" como la siguiente:

De hecho, cuando se aplica un proceso evolutivo por mutación y recombinación este es el estilo de cosas que suelen funcionar: complicados e intrincados resultados que a pesar de no ser respuestas elegantes ni sencillas, aun así funcionan (os remito de nuevo a estas entradas donde explico qué es la computación evolutiva y muestro un ejemplo práctico de aplicación de la computación evolutiva).

Pues bien, ese "chorizo" matemático que veis arriba, junto con esa tabla con algunas de las constantes físicas de nuestro Universo, es precisamente un resumen esquemático de las matemáticas del Modelo Estándar; la propuesta física más actual y vigente que tenemos del modo en que funciona y se mueve nuestro Universo. De hecho, llevamos más de 35 años atascados en ella y no hay manera de superarla ni de encontrar siquiera indicios (empíricos) de que haya algo más a parte de ella. Incluso físicos actuales de la talla de Stephen Hawking se decantan precisamente por rendirse ante la evidencia de que es este modelo matemático lo máximo que se puede lograr siguiendo el método científico tradicional, y que la idea de ir más allá no tenga siquiera sentido porque quizás no haya un más allá (que no exista una teoría unificadora o teoría del todo, sino sólo las matemáticas del modelo estándar y las constantes físicas empíricas que medimos).

Hawkins propone, de hecho, en su libro "El Gran Diseño" una propuesta muy similar a la que he descrito en esta entrada, salvo con la excepción de que no menciona en ningún momento el origen de los multiversos en los que él se basa para explicar entre otras cosas el fino ajuste de las constantes cosmológicas y de las regularidades físicas de nuestro perfecto mundo capaz de albergar vida inteligente. Es evidente que cualquiera que lea este interesante trabajo de Hawkins verá que queda incompleto. Precisamente el último capítulo del libro finaliza justo cuando uno esperaría ver llegar la verdadera explicación para ese multiverso propuesto. Se trata por supuesto de un claro intento del físico de moda por esquivar la propia pregunta sobre qué es en sí ese multiverso con semejante potencial para generar mundos (matemáticos): pero la pregunta está ahí, y es legítima.

Porque si la aparente casualidad del fino ajuste de la física de nuestro mundo se quiere evitar proponiendo una infinidad de mundos alternativos (mutliverso) los cuales conforman una especie de meta-realidad platónico-matemática: ¿qué es en sí esta meta-Realidad "platónico-matemática" infinita? ¿Cuál es su esencia? ¿Qué causa y sostiene este mundo ideal generador de realidades? ¿Por qué existe (en lugar de no hacerlo) y por qué existe además del modo tan concreto en que lo hace con esa capacidad asombrosa de materializar "mundos" desde la nada (de la nada material)? ¿Por qué no es todo de otro modo? ¿Qué hace posible y sustenta además la infinita materialización de estas ideas (o propuestas) matemáticas? ¡¿Y cómo sucede dicha materialización?! Y puestos en que aún es necesario explicar la Causa real de (la esencia tras) este meta-Mundo ideal matemático: ¿podría poseer dicha Causa algún tipo de Intención? ¿Habría después de todo una respuesta al para qué de este infinito conjunto ideal matemático con capacidad para transfigurarse en realidades materiales?

Como decimos, Hawkins ni se plantea estas preguntas y se queda tan ancho finalizando su libro simplemente con su feliz idea del multiverso y del principio antrópico fuerte como método para evitar tener que implicar intencionalidad trascendente para el origen de nuestro fino Universo. A mí personalmente me parece un error, puesto que deja su cosmovisión incompleta e insatisfactoriamente abierta. De hecho, esto es lo que más se le reprochó en su día a su obra y creo que con razón.

¿Es nuestro mundo resultado de una computación trascendente?

Cualquiera que haya tenido la paciencia para continuar leyendo hasta aquí, hará tiempo que se habrá percatado de a dónde he querido ir a parar desde el principio: ¿podría nuestro m