Delaunay y Voronoi

Vamos a comentar intuitivamente uno de los algoritmos más famosos y más útiles de la geometría computacional usando un ejemplo práctico. Aprenderemos a generar imágenes como esta:

Comenzamos la aventura. Imaginaros que tenemos una empresa de transporte con varias centrales de distribución, cada punto de la imágen representa uno de estos centros:

Ahora imaginaros que debemos determinar las zona que debe cubrir cada central de distribución de forma que tengamos que viajar lo mínimo posible. Es decir, debemos determinar las zonas del plano que están más cercanas a cada punto.

Para calcular estas zonas hay que seguir una serie de pasos. Primero debemos aplicar el algoritmo de Delaunay, que consiste en trazar triángulos entre los vértices con ciertas restricciones que ahora veremos. Veamos una posible triangulación:

Esta es una forma de triangular, pero para nuestro propósito no es válida. Debemos conseguir una triangulación de forma que Cualquier circunferencia trazada entre los 3 vértices de cada triángulo no tenga ningún otro punto dentro. Lo veremos más claro con una imágen que demuestra que la triangulación anterior no era válida:

¿Cómo solucionamos el problema? Pues probando diversas triangulaciones (Hay un método complicado de explicar que lo hace muy bien) hasta que no haya ninguna circunferencia que toque más de 3 vértices. En nuestro caso solo tenemos que cambiar una arista:

Fijaros que hemos cambiado un poco la triangulación y ahora al trazar la circunferencia ya no tenemos ningún otro vértice interior. Si hacemos lo mismo con el resto de triángulos vemos que hemos conseguido que no tengan otros vértices dentro, en este momento hemos conseguido la Triangulación de Delaunay a partir de los vértices/centrales de distribución iniciales. En la siguiente imagen trazamos todas las circunferencias posibles, fijaros que ninguna toca más de 3 vértices.

Pufff, un poco lioso pero lo que queda es cuesta abajo. A continuación debemos calcular las regiones más cercanas a cada punto (A estas regiones las llamaremos Regiones de Voronoi). Para ello nos apoyaremos en la Triangulación de Delaunay que ya hemos calculado. Marcamos el punto central de cada circunferencia y trazamos Perpendiculares a las aristas de los triángulos. Vamos a verlo con dos de los círculos para no liar (Los puntos amarillos son los centros de las circunferencias y las líneas naranjas son perpendiculares a las aristas de los triángulos):

Si seguimos aplicando el mismo método (y eliminamos del dibujo los circulos para no liar) obtendremos lo siguiente:

Si además eliminamos la Triangulación de Delaunay, tendremos la imagen definitiva donde se definen las zonas más cercanas a cada centro de distribución:

Por ejemplo, la zona coloreada de verde es la Región de Voronoi del punto A. Esto quiere decir que todo lo que está pintado de verde está más cerca de A que de cualquier otro punto del dibujo. Lo podéis comprobar con una regla si no os convenzo ;)

Si habéis llegado hasta aquí, tenéis premio: Un applet donde haciendo clicks podéis ir colocando las sedes de vuestra empresa y vais viendo en tiempo real la triangulación de Delaunay y las regiones de Voronoi. También podéis generar muchos puntos dándole al botón Generar, con el que conseguiréis una imagen similar a la mostrada al inicio de este artículo. A los programadores os pongo el código fuente por si quieren trastear algo, os aviso que está muy poco documentado.

Resumiendo, en geometría computacional las regiones de Voronoi son las zonas del plano más cercanas a un conjunto dado de puntos. Esto a nivel práctico lo utilizan muchas empresas para definir sus zonas de cobertura. Por ejemplo, McDonalds lo utiliza para decidir donde tiene que poner una nueva sede. También se utiliza en planes de prevención de riesgos para saber a que zonas afectaría un escape de una central nuclear.

También se utiliza en aplicaciones más artísticas, como en la primera imágen de este artículo, la creación de cristaleras etc. También podéis generar vuestras regiones de voronoi utilizando Photoshop: Filtro -> Textura ->Vidriera . Para aplicar ese filtro Photoshop internamente realizar la Triangulación de Delaunay que hemos aprendido y posteriormente calcula las Regiones de Voronoi. Todos a crear Vidrieras y si no os queda algo claro preguntad :)

El test de Turing y los ordenadores Inteligentes

El test de Turing es una prueba que se propuso en los años 50 para comprobar si una máquina es inteligente o no.

El test consiste en poner a chatear a una persona con otra persona y con un ordenador; sin decirle a priori cual es la máquina y cual es la persona. Si chateando descubre quién es la persona, y quién es el ordenador se concluye que el ordenador No es inteligente. Pero si no somos capaces de determinar cual de los dos es una máquina, entonces el ordenador ha pasado el Test de Turing y se podría considerar como una aparato inteligente.

Después de 50 años ningun programa ha conseguido pasar el test realmente, aunque se han hecho muchos intentos. Pensad en lo sencillo que sería descubrir a la máquina con alguna pregunta medianamente complicada, podeís charlar con un ordenador en esta web en inglés para comprobarlo. Pero en los años 80 John Searle desarrolló un contraejemplo diciendo que aunque una máquina pasara el Test de Turing, ésta no sería inteligente:

Imagemos ahora, que un chino está chateando con nosotros por Internet. Utilizamos un diccionario de chino y diversos manuales para contestarle. De esta forma él pensará que nosotros sabemos chino cuando realmente no tenemos ni idea, simplemente seguimos unas reglas que vienen en los diccionarios y libros. ¿Quién sabe chino? ¿Nosotros, los manuales y el diccionario, el ordenador que usamos para chatear o todo el conjunto de elementos? Según Searle no sabemos chino, al igual que una máquina que pasara el Test de Turing no es sería inteligente ya que simplemente sigue unas reglas sin ser consciente de ellas.

A partir de el contraejemplo de Searle la Inteligencia Artificial vive una época de incertidumbre acerca de sus posibilidades a largo plazo. Las hipótesis de Searle nos sirven también para preguntarnos si un programa que juega al ajedrez sabe realmente jugar o simplemente sigue unas reglas predefinidas y poco inteligentes. Igual que el hombre que tiene el diccionario de chino no sabe chino y simplemente sigue unas reglas que le vienen indicadas.

La IA ha avanzado mucho en diferentes campos y somos capaces de resolver muchas tareas concretas: jugar al ajedrez, reconocer objetos, resolver problemas matemáticos, traducir textos etc. También somos capaces de crear programas que ‘aprendan’ a resolver ciertas tareas concretas, por ejemplo los filtros bayesianos que instalamos en los lectores de correo electrónico van aprendiendo a detectar los e-mails de spam. El problema es que no sabemos crear un sistema más general, un programa que juega al ajedrez no puede aprender por si solo a traducir textos, reconocer objetos o filtrar correos de spam.

Espero vuestros comentarios acerca de los fallos del contraejemplo de Searle (Hay uno muy evidente). También podéis comenzar a crear un programa que supere el Test de Turing o crear el programa definitivo que sea capaz de aprender cualquier cosa por si solo ;)


Nota: los ejemplos sobre el Test de Turing y el contraejemplo de Searle (Más conocido como la Sala china) han sido adaptados según mi visión a la época actual. Evidentemente en los años 50 no existía Internet y por lo tanto lo de chatear con otra persona no tiene sentido. Originalmente se explicaba todo en base a personas y ordenadores metidas en salas de forma que no se pudiera ver lo que hay dentro. El ‘Juez’ estaba fuera y debía determinar dentro de que sala estaba el ordenador y en cual estaba la persona. En el caso de Searle, una persona que no sabe chino que se mete en una sala con el diccionario de chino (De ahí el nombre de Sala china). El ‘Juez’ está fuera y debe determinar si la persona de dentro de la sala sabe chino.

Más información sobre el Test de Turing
Contraejemplo de Searle en Más que código