jueves, 22 de noviembre de 2012

Practica 4 - Sistemas Multiagente

Introducción y Desarrollo
En la presente práctica de laboratorio se implementó un sistema multi-agente con el protocolo ContractNet. Se escoge al mejor, que tenga similitudes, y se envía un mensaje de aceptación.


En los juegos en linea se utiliza una herramienta para buscar otros jugadores que se encuentren jugando 'cierta partida' entonces similar al protocolo contract net donde el agente cierra un contrato al encontrar a otro agente similar(en este caso , su experiencia en nivel del juego).


A continuación se presenta un fragmento del código de la clase MatchMaking.java

public class MatchMaking extends Agent{

private boolean CrearPartida=false;
 
private AgentAddress encontrado=null;


public void activate(){
 println("Matchmaking");
 println("Buscando Jugadores...");
 
if(isGroup("Halo")){
 println ("Existe, me uno");
 CrearPartida=false;
 }
 else{
println ("No existe, voy a crearlo");
createGroup(true,"halo",null,null);
CrearPartida=true;
}
requestRole("halo","jugador",null);
}

public void live(){
 println("Buscando a otro jugador...");
do
{
 exitImmediatlyOnKill();
 pause(100);
 AgentAddress[] v = getAgentsWithRole("halo","jugador");
 
for (int i=0; i < v.length; i++){
 AgentAddress agent = v[i];
 if (! agent.equals(getAddress()))
 encontrado = agent;
 }
 }
 while (encontrado == null);
 
println("El Jugador se ha unido :"+encontrado);
// Si no soy el creador del grupo, envio la pelota primero.
 
if (! CrearPartida)
 
sendMessage(encontrado, new StringMessage("Se creo una partida.. "));
for (int i = 5; i > 0; i--){

Message m = waitNextMessage();
 
if(! m.getSender().equals(encontrado)){
while(true){

exitImmediatlyOnKill();
Message m2 = waitNextMessage(1000);
 
if(m2==null){
encontrado = m.getSender();
i=5;
println("El Creador del grupo se fue");
println("Encontre un nuevo jugador "+encontrado);
break;
}
else if(m2.getSender().equals(encontrado))
break;
}
}


Video


Referencias
  • En la pagina Madkit.org se encontraron referencias de las clases y de cómo crear y enviar mensajes (comunicación) entre los agentes.

viernes, 2 de noviembre de 2012

Practica 3 - Reconocimiento de Patrones

Introducción
El reconocimiento de voz es una herramienta esencial en cuanto a la accesibilidad de algunos usuarios, se pueden dar órdenes y el sistema interpretara los comandos, de ésta manera se facilita por ejemplo : a las personas que no pueden escribir u alguna discapacidad, tiene la opción de interactuar con la máquina mediante comandos de voz. También por comodidad se puede usar en otras áreas , cosas de la vida cotidiana como encender un foco , cerrar/abrir una llave, entre otras cosas.

El reconocimiento del Habla permite a un ser humano comunicarse con un ordenador. A grandes rasgos, consiste en que el ordenador captura la señal de voz que emite una persona a través de un micrófono, convirtiéndola en información digital. El motor de voz debe ser capaz de reconocer las silabas de entre un conjunto de fonemas que ha recibido, y combinarlas para formar las palabras que se habían dicho anteriormente por el usuario.

Durante las últimas décadas se ha estudiado la posibilidad de desarrollar interfaces hombre-computador controlados por voz para sustituir en ciertas aplicaciones a las interfaces tradicionales basadas en teclados o ratones. El Reconocimiento Automático de Voz es un campo de investigación de creciente relevancia que día a día gana mas partidarios.

El reconocimiento es basado en la comparación de patrones de referencia denominados modelos con los vectores de características generados para la palabra a reconocer.

Objetivo
Por medio de ésta práctica, el alumno implementará una de las técnicas vistas hasta el momento en clase, programando un sistema adaptativo relacionado con temas de sistemas inteligentes.

Desarrollo
Usando la librería de Cloud Garden TalkingJava SDK con la implementación de Java Speech API se ha conseguido realizar el reconocimiento de ciertas palabras mediante un diccionario que cumple con JSGF, el cual es un conjunto de convenciones para la gramática en el reconocimiento de Voz.

Elegimos Reconocimiento de Voz debido al interés por ir avanzando con nuestro proyecto de CLASE que va muy relacionado. Se desarrolló un Sistema Inteligente basado en JAVA donde el objetivo radica en ejecutar aplicaciones de Windows mediante la voz.

El inconveniente en ésta práctica es que sólo está soportada para el Sistema Operativo Windows. Entre los problemas que se presentaron está que al utilizar el micrófono integrado con la webcam de una laptop, con el ruido del entorno se tarda en reconocer y confunde ciertas palabras similares.Aún así haciendo pruebas con un micrófono externo se logran reconocer correctamente las palabras incluidas en el Archivo Programas.txt

A continuación se presenta un fragmento del código de la clase Reconocedor.java

public void iniciarRec() {
  
JOptionPane.showMessageDialog(null, "Pronuncie Aplicacion a Ejecutar");
  
 try{
  //Se configura al reconocedor para que entienda el idioma inglés
  oreja = Central.createRecognizer(new EngineModeDesc(Locale.ROOT));
  oreja.allocate();
  FileReader diccionario =new FileReader("Programas.txt"); //ruta donde esta el archivo con las Frases
  RuleGrammar gramatica = oreja.loadJSGF(diccionario);//Establece la forma en que debe de estar estructurado el archive gramatica
  gramatica.setEnabled(true); //accesa al archivo
  oreja.addResultListener(new Programas());  //Se hace referencia a la clase de escucha del reconocedor
 
  for(int i=0;i<=23;i++){
   System.out.println("");
  }
  System.out.println("Pronuncia un programa");
  oreja.commitChanges();
  oreja.requestFocus();
  oreja.resume();
 } catch (Exception e){
            e.printStackTrace();
     System.exit(0);
 } 
return;
}
A continuación se presenta un fragmento del código de la clase Programas.java

public void resultAccepted(ResultEvent e){
 try {
     Result res = (Result)(e.getSource());
     ResultToken tokens[] = res.getBestTokens();
     String Frase[]= new String[1];
     Frase[0]="";

     for (int i=0; i < tokens.length; i++){
  Programa = tokens[i].getSpokenText();
  Frase[0]+=Programa+" "; 
  System.out.print(Programa + " ");
     }
     System.out.println();
   
     if(Programa.equals("Fin")){
  oreja.deallocate();
  Frase[0]="Hasta la proxima!";
  System.out.println(Frase[0]);
  System.exit(0);
     }
     else if(Programa.equals("Facebook")) {
  try { 
      System.out.println("Abriendo Facebook...");
      // Se lanza el ejecutable. 
       Process p=Runtime.getRuntime().exec ("cmd.exe /c start Chrome www.facebook.com"); 
             
      InputStream is = p.getInputStream(); 
                    BufferedReader br = new BufferedReader (new InputStreamReader (is)); 
             
      String aux = br.readLine(); 
                    while (aux!=null) { 
   System.out.println (aux); 
   aux = br.readLine(); 
      } 
  } catch (Exception es) { 
      es.printStackTrace(); 
  } 
     }
            else {
  getPrograma();
  oreja.suspend();
  oreja.resume();
     }
 }catch(Exception ex) {
 }
}

Para ver el código completo:

http://gist.github.com/4002766
Video

Conclusiones
Una vez visto los resultados de la aplicación se observa que el reconocimiento de voz es un área de estudio muy grande, la cual está en desarrollo continuo.

Aún se piensa ir mejorando la aplicación sobretodo pensando en nuestro Proyecto Final de Clase.

Referencias
  • TalkingJava SDK with Java Speech API implementation Current Version 1.7.0
  • http://www.sicuma.uma.es/sicuma/independientes/argentina08/Liliana/JSAPI.htm
  • http://www.w3.org/TR/jsgf