miércoles, 20 de enero de 2010

Ejercicio de programación lógica

Hoy, a pesar de ser miércoles, no os traigo un artículo divulgativo, sino más bien un problema colaborativo.

Todo aquel que haya entrado un poco en el mundo de la informática, sabrá que programar no es algo sencillo. Muchas veces, una simple coma (,) puede hacer que un programa haga lo contrario de lo que uno quiere (y créanme que hablo por experiencia propia). Así que hoy os traigo un pequeño problema de programación o de lógica, según se mire.

Hace tiempo, algún profesor del que lamentablemente no recuerdo su nombre, me contó este problema. En resumen: vamos a tratar de programar un robot para que se lave los dientes.

Las condiciones son las siguientes:

  • Tenemos un robot completamente virgen (sin segundas), es decir, hay que enseñarle TODO.
  • Vamos a suponer que el aspecto físico del robot es lo suficientemente parecido al humano, como para despreocuparnos de si tiene o no dientes, o si tiene o no dedos.

  • El programa que se elabore, debería ser lineal, es decir, en plan Orden-1, Orden-2, Orden-3,...

  • TODO utensilio que el robot vaya a necesitar, vamos a suponer que lo tiene al alcance de la mano, es decir, no hay que mandar al robot a buscar nada.

  • La secuencia de la programación, debe ser totalmente lógica.


La idea es que, entre todos, hagamos este programa para que nuestro robot pueda lavarse los dientes, a través de los comentarios. Si alguien cree que algún punto del programa puede fallar, también os invito a que lo comentéis y lo expliquéis.

Así que, sin más dilación, voy a iniciar yo mismo el programa.
  1. Enseñar al robot dónde están los dientes y las manos.
  2. Enseñar al robot qué es un cepillo de dientes y qué es un tubo de pasta de dientes.
Básicamente, acabo de inicializar las (algunas) variables del problema. A partir de aquí, podréis seguir vosotros.

Ánimo y al tororobot.

Tito Eliatron Dixit.


Fotografía editada de un original de FlySi en su Flickr.

10 comentarios:

  1. Comentas que hay que enseñarle todo, así que pondré un par de puntos más.

    3. Enseñar al robot a cerrar la mano para poder coger objetos.
    4. Enseñar al robot a utilizar el hombro para poder posicionar el brazo a la hora de coger un objeto.
    5. Enseñar al robot a doblar el codo para acercar la mano a su cara cuando lo desee.

    ResponderEliminar
  2. Este 'problema' es de 'Elementos de Programación' de 1º de Ingeniería Informática :D

    Si nos ponemos muy estrictos, el programa puede contener como un centenar de instrucciones...

    Tito, esto es sólo algo que se te ha ocurrido o nos estás usando de cobayas para programar un robot que te has montado? :P

    ResponderEliminar
  3. Los lenguajes de programación en robótica no son lineales. Hay un feedback entre las variables de entrada y salida y se manejan conceptos diferentes a los de la programación clásica. Posteriormente las variables y comportamiento del robot se supervisan con un sistema SCADA y se va depurando el código.

    Como me he dedicado a la robótica durante un tiempo, colaboro con gusto en el proyecto conjunto. Asumimos que el programa es lineal pero desde ya hay que ver que esto nos traerá algún problema. En particular al apretar la pasta de dientes con la mano.


    El concepto "que es" y "donde está" se puede resumir en variables asociadas al objeto. En principio solo nos hacen falta las coordenadas del objeto y poco más (puede que también la dureza de los mismos o similar)

    Después quizás habría que ponerse de acuerdo en lo siguiente: ¿el objetivo es que el robot tenga los dientes limpios o que simule un lavado de dientes? Lo digo porque lo segundo es mucho más complicado.

    ResponderEliminar
  4. Creo que Agustin ha dado en el clavo, yo resumiria lo necesario para empezar en 3 cosas:

    1- Cual es el objetivo. Que ningun diente este sucio, que simule el lavado...

    2- Cuales son las instrucciones iniciales que admite -API- y su nivel de abstraccion: Si existe la funcion CogeObjetoConFormaDe('cepillo') o si solo podemos hacer cosas mas simples por coordenadas, por ejemplo.

    3- Podemos averiguar cosas del robot desde codigo? Por ejemplo, EstaDienteLimpio(numero_de_diente) nos devolveria si o no.

    4- Que capacidades de aprender tiene: Minimo habra de poder memorizar secuencias de movimientos, pero mejor seria poder enseñarle cosas mas abstractas como: limpiar_dientes = por_cada_diente repite: si esta sucio, cepillarlo y repetir hasta limpio.

    Todo esto cambia mucho todo, hay que pensar que "virgen" esta un robot sin sistema operativo ni nada de nada, vamos, que solo sirve para adornar.

    ResponderEliminar
  5. En que lenguajde programacion va?
    Hay que enseñrle al robot a cambiar el cepillo, pues este se desgasta y no liampara bien.

    Como sabe este si tiene limpio los dientes?

    ResponderEliminar
  6. Lo que propones como comienzo del programa:

    "1. Enseñar al robot dónde están los dientes y las manos.
    2. Enseñar al robot qué es un cepillo de dientes y qué es un tubo de pasta de dientes."

    No es parte del programa del robot, sería el programa del prograqmador del robot. Y todo ello suponiendo que el robot tiene capacidad de aprendizaje real.

    ResponderEliminar
  7. Pueto que que vamos a tener que guisarlo todo nosotros propongo una estrategia de programacion TOP-DOWN (ver wiki) . Que alguien planifique como se lava un robot los dientes en unos poquitos pasos y luego vamos refininando sucesivamente hasta el nivel de detalle que se quiera. Empiezo yo (desde el nivel más burdo). Bauticemos al robot como Eliabot (abreviadamente E):

    100 E coge el cepillo con la mano derecha
    200 E coge el la pasta con la mano izquierda
    300 E unta pasta en el cepillo
    400 E lleva el cepillo a la boca
    500 E frota el cepillo contra sus dientes

    El que lo crea oportuno puede insertar o añadir lineas.

    ResponderEliminar
  8. Y si el robot es zurdo?
    100 E coge la pasta con la mano menos hábil
    200 E Saca la tapa al tubo de pasta
    300 E coge el cepillo por el mango con la mano más hábil
    400 E coloca el cepillo en posicion horizontal con las cerdas hacia arriba
    500 E Coloca el tubo de pasta en forma paralela y un poco por encima del cepillo, con la boca coincidiendo con el extremo inferior de las cerdas
    600 E Presiona levemente el tubo de pasta mientras desplaza despacio el tubo hacia el extremo superior de las cerdas hasta que las cerdas hayan quedado untadas con la pasta
    700 E Deja el tubo de pasta 'REM - ya lo cerraremos cuando tengamos la otra mano libre-
    800 E

    Uf... me animo a decir que se pueden hacer como 500 líneas de código y aún el robot no sabrá lo que tiene que hacer exactamente
    ¡Qué grande es nuestro cerebro!

    ResponderEliminar
  9. Internauta,
    Mi tesis es que Eliabot es igualmente hábil con las dos manos, pero sorprendentemente tiene alguna ventaja (mínima) que se comporte como diestro, debido a que los utensilios están (quizás injustamente) diseñados para diestros. (rosca del tapón del tubo, forma del cepillo etc...) No obstante todo es cuestión de convenio.

    Aporto una línea más:

    550 Presiona levemente el tubo hasta que comience a salir algo de pasta.

    Hago notar que todas las sentencias que contengan palabras como HASTA, HACIA... quizás tendrían que reconvertirse en algún tipo de bucle.

    ResponderEliminar
  10. "Uf... me animo a decir que se pueden hacer como 500 líneas de código y aún el robot no sabrá lo que tiene que hacer exactamente
    ¡Qué grande es nuestro cerebro!"

    Sin ánimo de ofender ;)

    Pero estoy seguro de que si al ser humano le dejaran programar, pulir, probar, pulir, probar, borrar, reprogramar... etc

    Durante unos mmm 2 millones de años (soy generoso, en realidad serian bastantes más), creo que lograría un robot que no sólo se cepillaría los dientes, si no también comprendería mucho más de lo que nosotros comprendemos ahora.

    Perdón si se desvío el tema ;)


    Para no caer en la furia de Gauss, y no ser su desayuno aporto mi línea.

    1000 E Comprobar reservas de energía, si llenas reiniciar linea 100 E.

    Asumiendo que recien "comido" estén llenas.

    Un cordial saludo.

    ResponderEliminar

Si no comentas, Gauss se comerá una integral.
Y, por favor, respeta a todos con tus opiniones.