viernes, 27 de abril de 2012

Sistema Experto: Language Picker

Para nuestro proyecto decidimos que era realmente mucha lata el aprender uno de los shells ya existentes, por lo que decidimos que la mejor opción era montar nuestro proyecto en Rubí sobre Rieles, más conocido como Ruby on Rails. También decidimos que sería una buena idea que el dominio de conocimiento que usaríamos serían “lenguajes de programación” porque estaba chido.

Empezamos obteniendo la mayor cantidad de información de los lenguajes. Para esto nos pirateamos la base de datos de Wikipedia y del TIOBE Index. Basándonos en los lenguajes más populares, obtuvimos las características que consideramos más importantes de cada uno y alimentamos un modelo de Rails usando Active Record con dicha información.

Después hicimos una serie de hechos para ser evaluados por las reglas. Los hechos los armamos basándonos en los atributos que ya teníamos cargados.

Hechos:
- Java es un lenguaje con un paradigma orientado a objetos
- C es un lenguaje con un typing estático
- Visual Básic es un lenguaje con frameworks disponibles
- Pascal no es un lenguaje de bases de datos
- Erlang es un lenguaje con opciones de desarrollo para móviles
- Python es un lenguaje con una facilidad de uso de 1
- C# es un lenguaje en el que se facilita el trabajo en equipo
- Assembly es un lenguaje de bajo nivel
- Actionscript es un lenguaje con opciones de desarrollo para aplicaciones web
- Scratch es un lenguaje con opciones de uso educativas

Por otra parte, una vez que tuvimos los hechos pudimos hacer diferentes combinaciones de hechos para tener reglas.

Reglas:
- If C(Dinámico) then not C(Estático)
- If Cp(Benchmark) then Ct = L(HP) - (20*(L(Benchmark)-Cp(Benchmark)))
- If Cp(Memory) then Ct = L(HP) - (20*(L(Memory)-Cp(Memory)))
- If C1(low_level) then not C1(high_level)
- If C(DB) then not C(not DB)
- If C(Esoteric) then C(Benchmark) = 0
- If Cp(Learning) then Ct = L(HP) - (20*(L(Learning)-Cp(Learning)))-
- If C(Team) then not C(not Team)
- If Cp(Mobile) and L(not Mobile) then Cf = 0

Encontramos que Ruby on Rails fue una plataforma muy útil que nos permitió tener mucha libertad y que nos facilitó escribir tanto las reglas como los hechos, sin embargo nos encontramos con algunas limitantes; principalmente por que la cantidad de datos que manejamos era de un tamaño considerable y tuvimos algunos problemas trasportándolos.

Empezamos a hacer pruebas con usuarios, les pedimos que usaran el sistema para observar qué resultados les entregaba el sistema. Tuvimos opiniones variadas.

Opiniones:

Usuario 1: Andrés: “Está chido, hay muchas opciones sólo que sí le hacen falta más lenguajes”
Usuario 2: Rafa: “Si buscas más o menos una asesoría de qué lenguajes quieres aprender podría servir mucho, es buena idea”
Usuario 3: Daniel “Pues yo pienso que está padre aunque tal vez podría tener más características por lenguaje”
Usuario 4: Alberto “Me agrada para escoger lenguajes nuevos”
Usuario 5: Adriana “No conozco muchos lenguajes de programación pero creo que esto podría servir para aprender algunos nuevos.”

Con estas opiniones concluimos que a pesar de que hicimos una base de conocimientos que consideramos grande, los datos que tenemos de los lenguajes resultan insuficientes para cierto tipo de reglas. Además, hacen que las reglas pierdan precisión. A mayor precisión de datos, mayor precisión de reglas lo cuál entrega una mayor precisión en la inferencia.

Como trabajo futuro, nos gustaría darle más precisión a los datos de las reglas y posiblemente implementar un sistema más complicado de inferencias que pueda actualizar a los lenguajes basado en feedback del usuario. Esto sería muy útil para ciertos parametros, por ejemplo qué tan rápido un usuario considera que un lenguaje es, cuanta memoria considera que es poca o mucha o qué tan fácil es un lenguaje u otro.




1 comentario:

  1. Chicos!!

    Muy bien por el sistema experto! Y estoy de acuerdo con las conclusiones. Al incorporar preguntas más puntuales se podrá lograr que el resultado de la inferencia sea más acertado. Esto pueden lograrlo incorporando manejo de incertidumbre por medio de grados de certeza o lógica difusa.

    Felicidades!! Me gustó su proyecto!

    ResponderEliminar