Universidad Mayor de San Simón Facultad de Ciencias y Tecnología Carrera de Ingeniería Informática e Ingeniería de Sistemas INFORME PROYECTO DE PLANIFICACIÓN CON JADE Planificación y acción en el mundo real Inteligencia Artificial (I) Fecha de entrega: 29 de Diciembre Grupo 6 Integrantes: Ali Rodriguez Julio Grover Cabrera Bustamante Jose Ignacio Leaño Salles Mauricio Torrico Quispe Génesis Almendra Contenido Contenido 1 1. Descripción del problema 1 2. Planificación 1 3. Implementación de agentes 3.1 Civil 3.2 Arquitecto 3.3 Maquinaria Pesada 3.4 Albañil 3.5 Electricista 3.6 Plomero 3.7 Carpintero 3.8 Pintor 3 3 4 7 9 12 13 15 16 4. Resultados y pruebas del software 17 5. Conclusiones 18 1. Descripción del problema El presente proyecto consiste en simular las actividades de una empresa constructora de casas y/o edificios a través de agentes que cumplan el rol de trabajadores involucrados en las diferentes acciones necesarias para llevar a cabo la construcción de una casa. Una constructora tiene varias personas con diferentes profesiones trabajando en la empresa, como ser arquitectos, civiles, albañiles, carpinteros, plomeros, etc. En el proyecto estas personas se verán reflejadas por la implementación de agentes, para lo cual se hará empleo de la librería JADE, con el objetivo de mostrar cómo trabajan los agentes en sus diferentes actividades, a medida que van construyendo una casa. En este sistema se optimiza el trabajo de cada agente de manera que se lleve a cabo la construcción de la casa en un tiempo óptimo, lo cual evite que la empresa pierda recursos económicos. 2. Planificación En la planificación realizada se identificaron los siguientes planes, objetivos y agentes basados en el análisis realizado. 1 2 3. Implementación de agentes 3.1 Civil ❏ Descripción El agente Civil cumple las acciones correspondientes al estudio de suelos y diseño estructural. Al finalizar el estudio de suelos, el agente debe proporcionar la certificación de este, permitiendo de esta forma, que el agente Arquitecto inicie la fase de diseño arquitectónico. Dado que se cumplan estas acciones, el agente Civil podrá realizar su siguiente acción, la cual corresponde al diseño estructural, lo cual dará como resultado el plano estructural. ❏ Código package agents; import import import import import jade.core.AID; jade.core.Agent; jade.core.behaviours.CyclicBehaviour; jade.core.behaviours.OneShotBehaviour; jade.lang.acl.ACLMessage; public class Civil extends Agent{ protected void setup() { System.out.println("hello " + getLocalName()); addBehaviour(new Listen(this)); addBehaviour(new EstudioSuelos(this)); } } class EstudioSuelos extends OneShotBehaviour { private final Agent a; public EstudioSuelos(Agent a) { super(a); this.a = a; } public void action() { System.out.println("Se realizó el estudio de suelos"); ACLMessage msg = new ACLMessage(ACLMessage.INFORM); msg.addReceiver(new AID("arquitecto", AID.ISLOCALNAME)); msg.setLanguage("English"); 3 msg.setOntology("Weather-forecast-ontology"); msg.setContent("suelos"); a.send(msg); } } class Listen extends CyclicBehaviour { private final Agent a; public Listen(Agent a) { super(a); this.a = a; } public void action() { ACLMessage rec = a.receive(); if(rec != null) switch(rec.getContent()){ case "Plano Arquitectonico": DiseñoEstruc(); break; } else block(); } public void DiseñoEstruc(){ System.out.println("diseño estructural"); ACLMessage msg = new ACLMessage(ACLMessage.INFORM); msg.addReceiver(new AID("maquinariaPesada", AID.ISLOCALNAME)); msg.setLanguage("English"); msg.setOntology("Weather-forecast-ontology"); msg.setContent("Plano Estructural"); a.send(msg); } } 3.2 Arquitecto ❏ Descripción El agente Arquitecto. Su comportamiento y las acciones que realiza están en función al estudio de suelos(precondición) que se realiza por el agente Civil para poder realizar el diseño arquitectónico, la conclusión de esta acción o efecto de la acción 4 será tener el “diseño arquitectónico” para la posterior ejecución de los agentes que se ocuparan de los diseños estructurales, eléctricos e hidrosanitarios. ❏ Código package agents; import import import import jade.core.AID; jade.core.Agent; jade.core.behaviours.CyclicBehaviour; jade.lang.acl.ACLMessage; public class Arquitecto extends Agent{ protected void setup() { System.out.println("hello " + getLocalName()); addBehaviour(new Listen(this)); } class Listen extends CyclicBehaviour{ private final Agent a; public Listen (Agent a){ super(a); this.a = a; } public void action(){ ACLMessage rec = a.receive(); if(rec!=null){ switch(rec.getContent()){ case "suelos": DiseñoArqui(); break; case "Plano Arquitectonico": DiseñoElec(); DiseñoHidro(); break; } } else block(); } public void DiseñoArqui() { System.out.println("Diseño Arquitectonico"); ACLMessage msg = new ACLMessage(ACLMessage.INFORM); 5 msg.addReceiver(new AID("arquitecto", AID.ISLOCALNAME)); msg.addReceiver(new AID("civil", AID.ISLOCALNAME)); msg.setLanguage("English"); msg.setOntology("Weather-forecast-ontology"); msg.setContent("Plano Arquitectonico"); a.send(msg); } public void DiseñoElec(){ System.out.println("Diseño Electrico"); ACLMessage msg = new ACLMessage(ACLMessage.INFORM); msg.addReceiver(new AID("albañil", AID.ISLOCALNAME)); msg.setLanguage("English"); msg.setOntology("Weather-forecast-ontology"); msg.setContent("Plano Electrico"); a.send(msg); ACLMessage msg2 = new ACLMessage(ACLMessage.INFORM); msg2.addReceiver(new AID("maquinariaPesada", AID.ISLOCALNAME)); msg2.setLanguage("English"); msg2.setOntology("Weather-forecast-ontology"); msg2.setContent("Plano Electrico"); a.send(msg2); } public void DiseñoHidro(){ System.out.println("Diseño Hidrosanitario"); ACLMessage msg = new ACLMessage(ACLMessage.INFORM); msg.addReceiver(new AID("albañil", AID.ISLOCALNAME)); msg.setLanguage("English"); msg.setOntology("Weather-forecast-ontology"); msg.setContent("Plano Hidrosanitario"); a.send(msg); ACLMessage msg2 = new ACLMessage(ACLMessage.INFORM); msg2.addReceiver(new AID("maquinariaPesada", AID.ISLOCALNAME)); msg2.setLanguage("English"); msg2.setOntology("Weather-forecast-ontology"); msg2.setContent("Plano Hidrosanitario"); a.send(msg2); } } } 6 3.3 Maquinaria Pesada ❏ Descripción Agente Maquinaria Pesada. Este agente realiza la acción de movimiento de tierras y excavaciones en función al plano estructural (precondición para el agente Maquinaria Pesada) provisto por el agente Civil. Como resultado o efecto de la acción se tendrá el suelo listo. ❏ Código package agents; import import import import jade.core.AID; jade.core.Agent; jade.core.behaviours.CyclicBehaviour; jade.lang.acl.ACLMessage; public class MaquinariaPesada extends Agent{ protected void setup() { System.out.println("hello " + getLocalName()); addBehaviour(new trabajar(this)); } class trabajar extends CyclicBehaviour { private final Agent a; private boolean moverTierra = false; private boolean electrico = false; private boolean hidrosanitario = false; private boolean sueloListo = false; private ACLMessage rec; public trabajar (Agent a){ super(a); this.a = a; } public void action(){ this.rec = a.receive(); if((this.electrico && this.hidrosanitario) && this.sueloListo) Fundacion(); if(this.rec == null){ block(); } 7 else{ switch(rec.getContent()){ case "Plano Estructural": this.moverTierra= true; moverTierra(); break; case "Plano Electrico" : this.electrico = true; break; case "Plano Hidrosanitario": this.hidrosanitario = true; break; case "Suelo Listo": this.sueloListo = true; break; } } } public void moverTierra() { if (this.moverTierra) { System.out.println("Movimiento de tierras y excavación"); moverTierra = false; ACLMessage msg = new ACLMessage(ACLMessage.INFORM); msg.addReceiver(new AID("albañil", AID.ISLOCALNAME)); msg.setLanguage("English"); msg.setOntology("Weather-forecast-ontology"); msg.setContent("Suelo Listo"); a.send(msg); ACLMessage msg2 = new ACLMessage(ACLMessage.INFORM); msg2.addReceiver(new AID("maquinariaPesada", AID.ISLOCALNAME)); msg2.setLanguage("English"); msg2.setOntology("Weather-forecast-ontology"); msg2.setContent("Suelo Listo"); a.send(msg2); } } public void Fundacion() { 8 if(this.electrico && this.hidrosanitario && this.sueloListo) { this.electrico =false; this.hidrosanitario =false; this.sueloListo = false; System.out.println("Fundaciones-Maquinaria"); ACLMessage msg = new ACLMessage(ACLMessage.INFORM); msg.addReceiver(new AID("albañil", AID.ISLOCALNAME)); msg.setLanguage("English"); msg.setOntology("Weather-forecast-ontology"); msg.setContent("Fundaciones-Maquinaria"); a.send(msg); } } } } 3.4 Albañil ❏ Descripción El agente Albañil cumple gran parte de las acciones incluidas en el plan de construcción, estas son las fundaciones(hormigón, muros de contención), la realización de la estructura correspondiente a losas, columnas y gradas, la albañilería(actividades correspondientes a la obra gruesa), al igual que los revoques y revestimientos. Para llevar a cabo las fundaciones se debe tener el suelo listo (precondición) de lo cual se encarga el agente Maquinaria Pesada, al cumplirse esto las fundaciones se implementaran lo cual tendrá como resultado los cimientos listos (precondición), esto permitirá al agente Albañil proseguir con su siguiente acción, la cual refiere a la construcción de losas, columnas y gradas, esto dará como efecto la estructura terminada (precondición), dada esta situación el albañil podrá comenzar la fase de albañilería y concluida ésta dará lugar a los agentes Electricista y Plomero para realizar sus respectivas acciones de instalacion electrica y plomeria. Al concluir la fase de instalación eléctrica y de plomería, el agente Albañil podrá continuar con la implementación de revoques, y consecuentemente los revestimientos. 9 ❏ Código import import import import jade.core.AID; jade.core.Agent; jade.core.behaviours.CyclicBehaviour; jade.lang.acl.ACLMessage; public class Albañil extends Agent{ protected void setup() { System.out.println("hello " + getLocalName()); addBehaviour(new Listen(this)); } class Listen extends CyclicBehaviour{ private final Agent a; private boolean electrico = false; private boolean hidrosanitario = false; private boolean sueloListo = false; private boolean EstrucAlba = false; private boolean EstrucMaqui = false; private boolean plomeria = false; private boolean electricidad = false; private ACLMessage msg; public Listen (Agent a){ super(a); this.a = a; this.msg = null; } public void action(){ if((this.electrico && this.hidrosanitario) && this.sueloListo) Fundaciones(); if(this.electricidad && this.plomeria) Revoques(); if(EstrucAlba && EstrucMaqui) Estructura(); this.msg = a.receive(); if (this.msg != null){ switch(this.msg.getContent()){ case "Plano Electrico" : this.electrico = true; break; case "Plano Hidrosanitario": this.hidrosanitario = true; break; case "Suelo Listo": this.sueloListo = true; break; 10 case "Fundaciones-Albañil": this.EstrucAlba = true; break; case "Fundaciones-Maquinaria": this.EstrucMaqui = true; break; case "Estructura": Albañileria(); break; case "Plomeria": this.plomeria = true; break; case "instalacion electrica": this.electricidad = true; break; case "Revoques": Revestimientos(); break; } }else block(); } public void Fundaciones(){ System.out.println("Fundaciones-Albañil"); this.electrico =false; this.hidrosanitario=false; this.sueloListo=false; ACLMessage msg = new ACLMessage(ACLMessage.INFORM); msg.addReceiver(new AID("albañil", AID.ISLOCALNAME)); msg.setLanguage("English"); msg.setOntology("Weather-forecast-ontology"); msg.setContent("Fundaciones-Albañil"); a.send(msg); } public void Estructura(){ this.EstrucAlba = false; this.EstrucMaqui = false; System.out.println("Losas,Columnas y Gradas"); ACLMessage msg = new ACLMessage(ACLMessage.INFORM); msg.addReceiver(new AID("albañil", AID.ISLOCALNAME)); msg.setLanguage("English"); msg.setOntology("Weather-forecast-ontology"); msg.setContent("Estructura"); a.send(msg); } 11 public void Albañileria(){ System.out.println("tabiques y ladrillos"); ACLMessage msg = new ACLMessage(ACLMessage.INFORM); msg.addReceiver(new AID("electricista", AID.ISLOCALNAME)); msg.addReceiver(new AID("plomero", AID.ISLOCALNAME)); msg.setLanguage("English"); msg.setOntology("Weather-forecast-ontology"); msg.setContent("Obra Gruesa"); a.send(msg); } public void Revoques(){ System.out.println("Revoques"); this.electricidad = false; this.plomeria = false; ACLMessage msg = new ACLMessage(ACLMessage.INFORM); msg.addReceiver(new AID("albañil", AID.ISLOCALNAME)); msg.setLanguage("English"); msg.setOntology("Weather-forecast-ontology"); msg.setContent("Revoques"); a.send(msg); } public void Revestimientos(){ System.out.println("Revestimientos"); ACLMessage msg = new ACLMessage(ACLMessage.INFORM); msg.addReceiver(new AID("carpintero", AID.ISLOCALNAME)); msg.setLanguage("English"); msg.setOntology("Weather-forecast-ontology"); msg.setContent("Revestimientos"); a.send(msg); } } } 3.5 Electricista ❏ Descripción El agente Electricista tiene como acción realizar la instalación eléctrica, para poder llevar a cabo esto, es necesario tener la obra gruesa concluida(precondición), si es 12 así, el agente Electricista podrá proseguir con la instalación, lo cual dará como efecto la conclusión de la instalación eléctrica. ❏ Código package agents; import import import import jade.core.AID; jade.core.Agent; jade.core.behaviours.CyclicBehaviour; jade.lang.acl.ACLMessage; public class Electricista extends Agent{ protected void setup(){ System.out.println("hello " + getLocalName()); addBehaviour(new Listen(this)); } class Listen extends CyclicBehaviour{ private ACLMessage rec; private Agent a; public Listen(Agent a){ super(a); this.a = a; this.rec = null; } public void action(){ this.rec = this.a.receive(); if(rec ==null)block(); else switch(rec.getContent()){ case "Obra Gruesa": instalacionElectrica(); break; } } public void instalacionElectrica(){ System.out.println("instalacion electrica"); ACLMessage msg = new ACLMessage(ACLMessage.INFORM); msg.addReceiver(new AID("albañil", AID.ISLOCALNAME)); msg.setLanguage("English"); msg.setOntology("Weather-forecast-ontology"); msg.setContent("instalacion electrica"); a.send(msg); } 13 } } 3.6 Plomero ❏ Descripción El agente Plomero. Su comportamiento y las acciones que realiza están en función a la albañilería (precondición) que se realiza por el agente Albañil, la conclusión de esta acción o efecto de la acción será tener la “Instalación de Plomería Terminada” para la posterior ejecución de los agentes que se ocuparan de los Revoques ❏ Código package agents; import import import import jade.core.AID; jade.core.Agent; jade.core.behaviours.CyclicBehaviour; jade.lang.acl.ACLMessage; public class Plomero extends Agent{ protected void setup(){ System.out.println("hello " + getLocalName()); addBehaviour(new Listen(this)); } class Listen extends CyclicBehaviour{ private ACLMessage rec; private Agent a; public Listen(Agent a){ super(a); this.a = a; this.rec = null; } public void action(){ this.rec = this.a.receive(); if(rec ==null)block(); else switch(rec.getContent()){ case "Obra Gruesa": Plomeria(); break; } } 14 public void Plomeria(){ System.out.println("Plomeria"); ACLMessage msg = new ACLMessage(ACLMessage.INFORM); msg.addReceiver(new AID("albañil", AID.ISLOCALNAME)); msg.setLanguage("English"); msg.setOntology("Weather-forecast-ontology"); msg.setContent("Plomeria"); a.send(msg); } } } 3.7 Carpintero ❏ Descripción Agente Carpintero. Este agente realiza la acción de colocado de puertas y ventanas por políticas de la empresa estas se colocan después de los revestimientos, por lo que la precondición para este agentes es “revestimiento terminado” por parte del agente albañil. Como resultado o efecto de la acción se tendrá “instalación de puertas y ventanas concluido”. ❏ Código package agents; import import import import jade.core.AID; jade.core.Agent; jade.core.behaviours.CyclicBehaviour; jade.lang.acl.ACLMessage; public class Carpintero extends Agent{ protected void setup(){ System.out.println("hello "+ getLocalName()); addBehaviour(new Listen(this)); } class Listen extends CyclicBehaviour{ private Agent a; private ACLMessage msg; public Listen(Agent a){ this.a = a; } 15 public void action(){ this.msg = this.a.receive(); if(this.msg!=null && "Revestimientos".equals(this.msg.getContent())){ System.out.println("Puertas y ventanas"); ACLMessage msg = new ACLMessage(ACLMessage.INFORM); msg.addReceiver(new AID("pintor", AID.ISLOCALNAME)); msg.setLanguage("English"); msg.setOntology("Weather-forecast-ontology"); msg.setContent("Puertas y Ventanas"); a.send(msg); } } } } 3.8 Pintor ❏ Descripción Agente Pintor. Este agente realiza la acción de colocado de pintado después de la instalación de puertas y ventanas, por lo que la precondición para este agente es “instalación de puertas y ventanas concluido” por parte del agente Carpintero. Como resultado o efecto de la acción se tendrá “Pintado concluido” y por ser este la última acción la casa queda terminada. ❏ Código package agents; import jade.core.Agent; import jade.core.behaviours.CyclicBehaviour; import jade.lang.acl.ACLMessage; public class Pintor extends Agent{ protected void setup(){ System.out.println("hello "+ getLocalName()); addBehaviour(new Listen(this)); } class Listen extends CyclicBehaviour{ 16 private Agent a; private ACLMessage msg; public Listen(Agent a){ this.a = a; } public void action(){ this.msg = this.a.receive(); if(this.msg != null && this.msg.getContent().equals("Puertas y Ventanas")){ System.out.println("Pintura"); System.out.println("CASA CONSTRUIDA CORRECTAMENTE"); } } } 4. Resultados y pruebas del software 17 18 5. Conclusiones Después de realizar la planificación correspondiente se logró implementar cada agente con su respectivo comportamiento, tomando en cuenta las precondiciones, las acciones y los efectos de cada agente. Una vez realizada la implementación de los agentes pudimos entender su comportamiento e interacción, a la vez vimos que es importante tener una buena planificación para que los agentes realicen las acciones que les corresponde. 19 20