JADE - Enviar, recibir y operar ARRAYS

627 views
Skip to first unread message

Jorge Hernández

unread,
Mar 10, 2009, 12:11:36 PM3/10/09
to ju...@googlegroups.com
Hola a todos,

Les escribo en esta oportunidad pues estoy buscando ayuda para poder desarrollar el intercambios de ARRAYS en JADE. Por lo que si alguien me pudiese ayudar con algún ejemplo (código) y/o decirme dónde puedo encontrar alguno pues se los agradecería mucho.

Principalmente, requiero que un cierto número de agentes (A1, A2, A3, A4, etc...) envíen mensajes a otro agente receptor (Ar) donde el contenido de los mensajes serán ARRAYS, por ejemplo:

A1 --> envía: 1,2,3,4
A2 --> envía: 3,4,5,6,7
A3 --> envía: 3,4,
A4 --> envía: 1,2,3,3,4,8,9,10

Entonces, cuando Ar reciba todos los mensajes pues generará otro ARRAY compuesto de las de la suma de las posiciones correspondientes. Porejemplo,

Ar --> genera: 1+3+3+1, 2+4+4+2, 3+5+0+3, 4+6+0+3, 0+7+0+4, 0+0+0+8, 0+0+0+9, 0+0+0+10, o sea genera un ARRAY compuesto por: 8, 12, 13, 11, 8, 9, 10

Si alguien me pudiese ayudar, pues los agradecería mucho, o si también hubiese algún código de ejemplo por ahí para entender mejor como realizar esto, pues también les agradecería que me orientacen con esto!.

Gracias de antemano! Cualquier ayuda será bien recibida.

Saludos,
Jorge

Jose Coronel

unread,
Mar 12, 2009, 9:22:39 AM3/12/09
to ju...@googlegroups.com
Jorge

La clase 'ACLMessage' que utilizas para enviar mensajes entre agente tiene el metodo 'setContentObject'. Este metodo es el que tienes que utilizar para enviar el arreglo dentro del mensaje:

En la documentacion hay un ejemplo del metodo:

setContentObject

public void setContentObject(java.io.Serializable s)
throws java.io.IOException
This method sets the content of this ACLMessage to a Java object. It is not FIPA compliant so its usage is not encouraged. For example:
 ACLMessage msg = new ACLMessage(ACLMessage.INFORM);
Date d = new Date();
try{
msg.setContentObject(d);
}catch(IOException e){}
 
Saludos
José Coronel
Parameters:
s - the object that will be used to set the content of the ACLMessage.
Throws:
java.io.IOException - if an I/O error occurs.

Jorge Hernández

unread,
Mar 12, 2009, 12:27:41 PM3/12/09
to ju...@googlegroups.com
Hola a todos,

Gracias por responder.

La verdad de las cosas, más que en el envío, mi duda está en la recepción. Cómo el agente que recibe los arrays podrá hacer cálculos con ellos?. Esto es lo que no visualizo.

Saludos,
Jorge

2009/3/12 Jose Coronel <jcorone...@gmail.com>

Jose Coronel

unread,
Mar 12, 2009, 12:44:03 PM3/12/09
to ju...@googlegroups.com
Jorge

Si el agente recibe


A1 --> envía: 1,2,3,4
A2 --> envía: 3,4,5,6,7
A3 --> envía: 3,4,
A4 --> envía: 1,2,3,3,4,8,9,10

Primero deberias crear un arreglo cuyo largo sea igual al mayor de los largos recibidos.

Despues vacias el primer arreglo sobre el arreglo SUMA y para los otros N arreglos, los recorres con un 'for' y el valor obtenido de cada posicion se lo suma al valor de la misma posicion del arreglo SUMA.


Saludos

José Coronel

Jorge Hernández

unread,
Mar 12, 2009, 1:34:09 PM3/12/09
to ju...@googlegroups.com
Hola a todos,

Gracias por las explicaciones. Pero para aclararme más me gustaría verlo más "gráficamente".

Por ejemplo, un agente podrá enviar lo siguiente:
import jade.core.*;
import jade.core.behaviours.*;
import jade.lang.acl.*;
 
public class Emisor extends Agent
{
class EmisorComportaminento extends SimpleBehaviour
{
boolean fin = false;
public void action()
{
System.out.println(getLocalName() +": Preparandose para enviar un mensaje a bubal");
AID id = new AID();
id.setLocalName("bubal");


ACLMessage msg = new ACLMessage(ACLMessage.INFORM);
Date d = new Date();
try{
msg.setContentObject(d);
  send(mensaje);
System.out.println(getLocalName() +": Enviando hola a bubal");
fin = true;
}catch(IOException e){}
}
  public boolean done()
{
return fin;
}
}
protected void setup()
{
addBehaviour(new EmisorComportaminento());
}
}
 
DUDA 1: cómo le paso al parámetro "d" tipo Date los valores de los arreglos?.

Luego, supuniendo que "d" ya contiene los valores de los arreglos, comunmente el agente receptor sería de la siguiente manera donde receibiría "mensaje":

import jade.core.*;
import jade.core.behaviours.*;
import jade.lang.acl.ACLMessage;
 
public class Receptor extends Agent
{
class ReceptorComportaminento extends SimpleBehaviour
{
private boolean fin = false;
public void action()
{
ACLMessage mensaje = receive();
if (mensaje!= null)
{
System.out.println(getLocalName() + ": acaba de recibir el siguiente mensaje: ");
System.out.println(mensaje.toString());
fin = true;
}
}
public boolean done()
{
return fin;
}
}
protected void setup()
{
addBehaviour(new ReceptorComportaminento());
}
}
Pero, sí bien entiendo lo de "Despues vacias el primer arreglo sobre el arreglo SUMA y para los otros N arreglos, los recorres con un 'for' y el valor obtenido de cada posicion se lo suma al valor de la misma posicion del arreglo SUMA.", tecnicamente nosé como implementarlo.

DUDA 2: Cómo se podría implementar lo anterior?. Si pudiésemos verlo en base a este ejemplo lo agradecería mucho, pues de momento es que no lo visualizo mucho.

Gracias de antemano,

Jose Coronel

unread,
Mar 12, 2009, 2:01:53 PM3/12/09
to ju...@googlegroups.com
Jorge

¿A que te refieres con pasarle los parámetros del arreglo a un objeto java.util.Date?. ¿Necesitas modificar la fecha?¿...o por lo que entiendo quieres enviar el arreglo en vez del objeto Date?

Si es lo ultimo, lo puedes hacer asi:


ACLMessage msg = new ACLMessage(ACLMessage.INFORM);
String [ ] valores = new String [10];
msg.setContentObject(valores );

Para la suma de arreglos aqui tienes un ejemplo http://sagito3x.phpleo.com/2009/03/05/suma-de-los-elementos-de-un-arreglo/


Saludos

José Coronel

Jorge Hernández

unread,
Mar 12, 2009, 3:29:15 PM3/12/09
to ju...@googlegroups.com
Hola,

Sí, me precipité un poco, gracias por la corrección.

DUDA1: supongamos que se quiere enviar una ARRAY del estilo 1,2,3,4,5

Entonces, basándome en el ejemplo que me han enviado, PREGUNTO, quedaría así?:


ACLMessage msg = new ACLMessage(ACLMessage.INFORM);
String [ ] valores = new String [10];
valores ={1,2,3,4,5};
msg.setContentObject(valores );

Luego, según el ejemplo, la suma se hace así:

int total=0
for(int i=0; i<=suma.length-1; i++)  
{  
total += suma;  
miLista.addElement(suma);  
}  
txtSuma.setText(""+total);

DUDA 2: cuando el agente recibe el mensaje de la siguiente forma:
public void action()
{
ACLMessage mensaje = receive();
if (mensaje!= null)
{
System.out.println(getLocalName() + ": acaba de recibir el siguiente mensaje: ");
System.out.println(mensaje.toString());
fin = true;
}
}
Quedaría algo así como:


public void action()
{
ACLMessage mensaje = receive();
if (mensaje!= null)
{
System.out.println(getLocalName() + ": acaba de recibir el siguiente mensaje: ");
System.out.println(mensaje.toString());
                                for(int i=0; i<=mensaje.length-1; i++)  
                                {  
                                 total += mensjae;  
                                 miLista.addElement(mensaje);  
                                }  
                                txtSuma.setText(""+total);

                    fin = true;
}
}

Ya me dicen algo. Como podrán, mi duda a lo mejor es algo trivial, pero esque me enredo al momento de querer hacer algo más que enviar y recibir mensajes, pues no lo he visto en otros sitios.

saludos a todos y gracias de antemano!

Jorge Hernández

unread,
Mar 13, 2009, 2:14:54 AM3/13/09
to ju...@googlegroups.com
Hola a todos,

Bueno, cuando puedan me echan una manito con la pregunta anterior. Tras ver todas las ayudas que he recibido, mi única dificultad es en cómo programar el hecho de que una vez el agente receptor vaya recibiendo los ARRAYS de parte de varios agentes pues, o bien se de cuenta que no le quedan más recibir para luego operarlos, o bien que a medida que van llegand va generando otro.

En que parte del código del agente receptor se haría esto?. Tendría que utilizar otro behaviour dentro del código de recibir mensaje?.

cualquier ayuda y/o comentario se agredecerá montón, y si alguien me lo pudiese explicar en base al ejemplo que está más abajo pues me ayudaría mucho ya que así lo podría visualizar in-situ!.

Saludos
Jorge

2009/3/12 Jorge Hernández <jorge.in...@gmail.com>

Jorge Hernández

unread,
Mar 13, 2009, 5:24:35 AM3/13/09
to ju...@googlegroups.com
Hola nuevamante a todos,

He estado indagando bastante, y pareciera ser que el tema de que un agente reciba varios mensajes de tipo ARRAYS es bastante complejo. Principalmente por que el arreglo tendría que ser tipo int y ocurre que int no es un objeto.

No obstante, creo que en JADE, además de poder recibir mensajes con un contenido, algo más se tendrá que poder hacer.

A cualquiera que lea esto, pues le pido ayuda para ver como solucionar esto que me urge bastante.

Saludos,
Jorge

2009/3/13 Jorge Hernández <jorge.in...@gmail.com>
Reply all
Reply to author
Forward
0 new messages