1 de abril de 2015

Inteligencia Artificial (1/2)

Se denomina inteligencia artificial (IA) a la rama de las Ciencias de la Computación dedicada al desarrollo de agentes racionales no vivos. El termino agentes se refiere a cualquier cosa capaz de percibir su entorno (recibir entradas), procesar tales percepciones y actuar en consecuencia (proporcionar salidas). Cuando nos referimos a racionalidad se entiende como la característica que posee una elección de ser correcta, que la decisión tomada sea la más cercana a la óptima. Una de las claves para que un videojuego sea entretenido es la IA de los elementos controlados por la computadora. Para programar una buena IA hay varios recursos (ejecución de una respuesta predeterminada por cada entrada, búsqueda del estado requerido en el conjunto de los estados producidos por las acciones posibles, algoritmos genéticos, etc.) y habría mucha información para analizar al respecto. Por eso, en esta ocasión tan solo vamos a analizar un ejemplo sencillo. Hace varios años, estaba desarrollando un juego de carreras en Basic. El juego fue cancelado ante la incapacidad de programar una buena IA. Aquí una imagen del juego:
Cuando un humano observa la imagen podría deducir que se trata de una carrera de pequeños automóviles, que por la disposición de los vehículos, los corredores deberán transitar por la pista hacía la derecha de la imagen. También podría percibir, que antes de llegar al límite, deberán realizar un giro de dirección para mantenerse dentro de la pista. El ser humano entiende, razona, deduce y puede tomar decisiones que le permiten seguir las reglas del videojuego.

Cuando la computadora observa” esa imagen, ¿qué percibe? Tan solo son unos cuantos bytes, en este caso 64.000 bytes que varían su valor entre 0 y 3, nada más. (Resolución CGA: 320x200 a 4 colores). ¿No reconoce que se tratan de pequeños automóviles en una pista? No, a menos que lo especifiquemos en una variable. ¿No reconoce que debe transitar dentro de la pista? No, a menos que lo determinemos por medio de condiciones.

En el momento en que se estaba desarrollando el juego, debido a la poca experiencia en programación y debido a que en proyectos anteriores se habían utilizado demasiadas variables, se optó por usar la menor cantidad variables posibles. Hacer que la IA de los corredores se adaptara a todo tipo de pista. Los únicos datos que la computadora tendría serían algunos puntos de verificación y la coordenada de la salida de la pista.

¿Cómo sabría la computadora hacía donde girar para guiar al corredor a la salida? Para hacerlo se utilizaron los datos de colores del escenario. El área transitable de la pista siempre sería de color azul. Por lo tanto, la computadora "entendería" que mientras el corredor se encontrara sobre una superficie de color azul, iba en la posición correcta. Luego, por medio de otros puntos de verificación en torno al corredor, determinaría hacia donde girar para seguir dentro de la pista. Esto parece razonable, y el uso de variables es mínimo. Pero, ¿qué resultado tendría? Lo vemos en el siguiente video:


A grandes razgos, la computadora determina la mayoría de las veces hacia donde girar para dirigir al corredor a la salida. Sin embargo, ocurren varias imprecisiones en ciertas partes complejas de la pista. Por lo que, en ocasiones resulta prácticamente imposible para la computadora determinar el giro correcto. Esto intentó ser arreglado provisoriamente por medio de algunas acciones al azar. Pero, no fue suficiente, el resultado no es el esperado. Entonces, ¿cómo solucionar este problema? Recientemente, se decidió hacer algunas modificaciones en el código que controla los corredores. ¿Cuál fue el resultado? Lo veremos en la siguiente entrada.