def asignar_pedido_a_camioneta(self, tipo_de_pizza, camioneta): simulacion = Simulacion() simulacion.camionetas[camioneta].pizzas.append( Pizza(tipo_de_pizza, simulacion.time)) cliente0 = self.generar_cliente_en_rango() pedido0 = Pedido(cliente0, 10, simulacion.camionetas[camioneta], tipo_de_pizza) simulacion.camionetas[camioneta].asignar_pedido(pedido0)
def test_debe_retornar_distancia_recorrida_por_camionetas(self): simulacion = self.get_simulacion() cliente14 = self.generar_cliente_en_rango() camioneta14 = Camioneta() camioneta14.cargar_pizzas() pedido14 = Pedido(cliente14, 10, camioneta14, camioneta14.pizzas[0].tipo) pedido14.hora_entrega = 15 pedido14.pizza = camioneta14.pizzas[0] pedido14.entregado = True camioneta14.generar_evento_enviar_pedido(pedido14) simulacion.camionetas.append(camioneta14) distancia = simulacion.distacia_recorrida() self.assertEqual(distancia, 1999.6979771955564)
def enviar_pedido(self, pedido: Pedido): self.distancia_recorrida += self.obtener_distancia(self.ubicacion, pedido.cliente.ubicacion) self.ubicacion = pedido.cliente.ubicacion if not self._tengo_pizzas_para_entregar(pedido): self.generar_evento_volver_a_restaurante(pedido) else: pedido.ubicacion_origen = self.ubicacion from Simulacion import Simulacion simulacion = Simulacion() simulacion.dispatch(EventType.ENTREGAR_PEDIDO, {'hora': simulacion.time + timedelta(minutes=simulacion.utils.tiempo_entrega()), 'pedido': pedido})
def comunicacion(): global dsgraph global mss_cnt global best_offer global num_respuestas if current_process().name != 'MainProcess': return message = request.args['content'] gm = Graph() gm.parse(data=message) gr = None msgdic = get_message_properties(gm) if msgdic is None: gr = build_message(Graph(), ACL['not-understood'], sender=AgentUtil.Agents.AgenteCentroLogistico.uri, msgcnt=mss_cnt) else: perf = msgdic['performative'] # Se nos solicita que enviemos los lotes de cierta prioridad if perf == ACL.request: if 'content' in msgdic: content = msgdic['content'] if 'enviar-lotes' in str(content): prioridad = gm.value(subject=content, predicate=AB.prioridad) # Enviamos los lotes del tipo que tocan logger.info("[#] Percepcion - Enviar lotes de prioridad " + prioridad) enviar_lotes(prioridad) else: gr = build_message( Graph(), ACL['not-understood'], sender=AgentUtil.Agents.AgenteCentroLogistico.uri, msgcnt=mss_cnt) elif perf == ACL.inform: if 'content' in msgdic: content = msgdic['content'] # Contra-oferta final if 'informar-oferta-final' in str(content): oferta = Oferta() oferta.id = gm.value(subject=content, predicate=AB.id) oferta.precio = gm.value(subject=content, predicate=AB.precio) oferta.transportista = gm.value(subject=content, predicate=AB.transportista) logger.info( "[#] Percepcion - Transportista nos hace oferta final (%s) de %s euros" % (oferta.id, oferta.precio)) nombre_transportista = 'SEUR' if msgdic['sender'] == AgentUtil.Agents.AgenteTransportista.uri \ else 'CORREOS' if best_offer is None or best_offer.precio > oferta.precio: logger.info( "[#] Nueva mejor oferta | id: %s | precio: %s | transportista %s" % (oferta.id, oferta.precio, nombre_transportista)) best_offer = oferta best_offer.transportista = nombre_transportista num_respuestas += 1 if num_respuestas == 2: aceptar_oferta(best_offer.transportista) notificar_envios(best_offer.transportista) best_offer = None num_respuestas = 0 else: # Recibimos un pedido pedido = Pedido() pedido.id = gm.value(subject=content, predicate=AB.id) pedido.prioridad = gm.value(subject=content, predicate=AB.prioridad) pedido.fecha_compra = gm.value(subject=content, predicate=AB.direccion) pedido.compuesto_por = gm.value(subject=content, predicate=AB.compuesto_por) pedido.peso_total = gm.value(subject=content, predicate=AB.peso_total) pedido.direccion = gm.value(subject=content, predicate=AB.direccion) pedido.ciudad = gm.value(subject=content, predicate=AB.ciudad) logger.info( "[#] Percepcion - Organizar nuevo pedido (%s) " % pedido.id) prepare_shipping(pedido) gr = build_message( Graph(), ACL['inform-done'], sender=AgentUtil.Agents.AgenteCentroLogistico.uri, msgcnt=mss_cnt, receiver=msgdic['sender'], ) # Un transportista nos ha propuesto una oferta elif perf == ACL.propose: if 'content' in msgdic: content = msgdic['content'] oferta = Oferta() oferta.id = gm.value(subject=content, predicate=AB.id) oferta.precio = gm.value(subject=content, predicate=AB.precio) oferta.transportista = gm.value(subject=content, predicate=AB.transportista) logger.info("[#] Percepcion - Nueva oferta (%s)" % oferta.id) nombre_transportista = 'SEUR' if msgdic['sender'] == AgentUtil.Agents.AgenteTransportista.uri \ else 'CORREOS' if best_offer is None or best_offer.precio > oferta.precio: logger.info( "[#] Nueva mejor oferta | id: %s | precio: %s | transportista %s" % (oferta.id, oferta.precio, nombre_transportista)) best_offer = oferta best_offer.transportista = nombre_transportista proponer_oferta(oferta) else: gr = build_message( Graph(), ACL['inform-done'], sender=AgentUtil.Agents.AgenteCentroLogistico.uri, msgcnt=mss_cnt, receiver=msgdic['sender'], ) # Un transportista ha aceptado la contraoferta elif perf == ACL.accept_proposal: if 'content' in msgdic: content = msgdic['content'] oferta = Oferta() oferta.id = gm.value(subject=content, predicate=AB.id) oferta.precio = gm.value(subject=content, predicate=AB.precio) oferta.transportista = gm.value(subject=content, predicate=AB.transportista) logger.info("[#] Percepcion - Contraoferta aceptada (%s)" % oferta.id) nombre_transportista = 'SEUR' if msgdic['sender'] == AgentUtil.Agents.AgenteTransportista.uri \ else 'CORREOS' if best_offer is None or best_offer.precio > oferta.precio: logger.info( "[#] Nueva mejor oferta | id: %s | precio: %s | transportista %s" % (oferta.id, oferta.precio, nombre_transportista)) best_offer = oferta best_offer.transportista = nombre_transportista num_respuestas += 1 if num_respuestas == 2: aceptar_oferta(best_offer.transportista) notificar_envios(best_offer.transportista) best_offer = None num_respuestas = 0 else: gr = build_message( Graph(), ACL['inform-done'], sender=AgentUtil.Agents.AgenteCentroLogistico.uri, msgcnt=mss_cnt, receiver=msgdic['sender']) # Un transportista nos ha negado la contraoferta elif perf == ACL.reject_proposal: if 'content' in msgdic: content = msgdic['content'] num_respuestas += 1 logger.info("[#] Percepcion - Contraoferta denegada :(") # 2 proposed agents if num_respuestas == 2: aceptar_oferta(best_offer.transportista) notificar_envios(best_offer.transportista) num_respuestas = 0 best_offer = None else: gr = build_message( Graph(), ACL['inform-done'], sender=AgentUtil.Agents.AgenteCentroLogistico.uri, msgcnt=mss_cnt, receiver=msgdic['sender'], ) else: gr = build_message( Graph(), ACL['not-understood'], sender=AgentUtil.Agents.AgenteCentroLogistico.uri, msgcnt=mss_cnt) if gr is None: gr = build_message(Graph(), ACL['inform-done'], sender=AgentUtil.Agents.AgenteCentroLogistico.uri, msgcnt=mss_cnt, receiver=msgdic['sender']) mss_cnt += 1 return gr.serialize(format='xml')
def browser_purchase(): if request.method == 'POST': global mss_cnt peso_total = 0.0 query = """ prefix ab:<http://www.semanticweb.org/elenaalonso/ontologies/2018/4/OnlineShop#> SELECT ?id ?peso WHERE { %s ?Producto ab:id ?id . ?Producto ab:peso ?peso . } """ % AgentUtil.SPARQLHelper.filterSPARQLValues( "?id", request.form.getlist('items'), False) res = AgentUtil.SPARQLHelper.read_query(query) pedido = Pedido() pedido.id = random.randint(1, 99999999) # TODO: Get latest id pedido.prioridad = request.form['prioridad'] pedido.fecha_compra = datetime.now().strftime("%d/%m/%Y") pedido.direccion = request.form['direccion'] pedido.ciudad = request.form['ciudad'] for item in request.form.getlist('items'): pedido.compuesto_por.append(item) for p in res["results"]["bindings"]: peso_total += float(p["peso"]["value"]) pedido.peso_total = peso_total query = """ prefix ab:<http://www.semanticweb.org/elenaalonso/ontologies/2018/4/OnlineShop#> INSERT DATA { ab:Pedido%(id)s rdf:type ab:Pedido . ab:Pedido%(id)s ab:id %(id)s . ab:Pedido%(id)s ab:prioridad '%(prioridad)s' . ab:Pedido%(id)s ab:fecha_compra '%(fecha)s' . ab:Pedido%(id)s ab:direccion '%(dir)s' . ab:Pedido%(id)s ab:ciudad '%(ciudad)s' . ab:Pedido%(id)s ab:peso_total %(peso)s . ab:Pedido%(id)s ab:comprado_por '%(usuario)s' . """ % { 'id': pedido.id, 'prioridad': pedido.prioridad, 'fecha': pedido.fecha_compra, 'dir': pedido.direccion, 'ciudad': pedido.ciudad, 'peso': pedido.peso_total, 'usuario': session['username'] } for item in pedido.compuesto_por: query += "ab:Pedido%(id)s ab:compuesto_por %(item)s .\n" % { 'id': pedido.id, 'item': item } query += " }" res = AgentUtil.SPARQLHelper.update_query(query) query = """ prefix ab:<http://www.semanticweb.org/elenaalonso/ontologies/2018/4/OnlineShop#> DELETE { ?Producto ab:estado ?estado } INSERT { ?Producto ab:estado 'Vendido' } WHERE { %s ?Producto ab:estado ?estado . ?Producto rdf:type ab:Producto . ?Producto ab:id ?id . } """ % AgentUtil.SPARQLHelper.filterSPARQLValues( "?id", pedido.compuesto_por, False) AgentUtil.SPARQLHelper.update_query( query) # Los marcamos como vendidos para futuras busquedas logger.info("[#] Creado un nuevo pedido (%s) de productos: %s" % (pedido.id, pedido.compuesto_por)) gmess = Graph() gmess.bind('ab', AB) content = AB[AgentUtil.Agents.AgenteVendedor.name + '-preparar-pedido'] gmess.add((content, RDF.type, AB.Pedido)) gmess.add((content, AB.id, Literal(pedido.id))) gmess.add((content, AB.prioridad, Literal(pedido.prioridad))) gmess.add((content, AB.fecha_compra, Literal(pedido.fecha_compra))) gmess.add((content, AB.direccion, Literal(pedido.direccion))) gmess.add((content, AB.ciudad, Literal(pedido.ciudad))) for item in pedido.compuesto_por: gmess.add((content, AB.compuesto_por, Literal(item))) gmess.add((content, AB.peso_total, Literal(peso_total))) msg = build_message( gmess, perf=ACL.inform, sender=AgentUtil.Agents.AgenteVendedor.uri, receiver=AgentUtil.Agents.AgenteCentroLogistico.uri, content=content, msgcnt=mss_cnt) send_message(msg, AgentUtil.Agents.AgenteCentroLogistico.address) mss_cnt += 1 return render_template('finished.html')
def _enviar_pedido(self, pedido: Pedido): pedido.ubicacion_origen = self.ubicacion from Simulacion import Simulacion simulacion = Simulacion() simulacion.dispatch(EventType.ENTREGAR_PEDIDO, {'hora': simulacion.time + timedelta(minutes=simulacion.utils.tiempo_entrega()), 'pedido': pedido})
def test_debe_retornar_pedidos_perdidos(self): simulacion = self.get_simulacion() cliente13 = self.generar_cliente_en_rango() camioneta13 = Camioneta() camioneta13.cargar_pizzas() pedido13 = Pedido(cliente13, 10, camioneta13, camioneta13.pizzas[0].tipo) pedido13.hora_entrega = 15 pedido13.pizza = camioneta13.pizzas[0] pedido13.entregado = True simulacion.pedidos.append(pedido13) pedido23 = Pedido(cliente13, 10, camioneta13, camioneta13.pizzas[1].tipo) pedido23.hora_entrega = 15 pedido23.pizza = camioneta13.pizzas[1] pedido23.entregado = True simulacion.pedidos.append(pedido23) pedido33 = Pedido(cliente13, 10, camioneta13, camioneta13.pizzas[2].tipo) pedido33.hora_entrega = 15 pedido33.pizza = camioneta13.pizzas[2] pedido33.entregado = False simulacion.pedidos.append(pedido33) pedido43 = Pedido(cliente13, 10, camioneta13, camioneta13.pizzas[3].tipo) pedido43.hora_entrega = 15 pedido43.pizza = camioneta13.pizzas[3] pedido43.entregado = False simulacion.pedidos.append(pedido43) pedido53 = Pedido(cliente13, 10, camioneta13, camioneta13.pizzas[4].tipo) pedido53.hora_entrega = 15 pedido53.pizza = camioneta13.pizzas[4] pedido53.entregado = False simulacion.pedidos.append(pedido53) pedidos = simulacion.pedidos_perdidos() self.assertEqual(len(pedidos), 3)
def test_debe_retornar_el_tiempo_promedio_de_espera(self): simulacion = self.get_simulacion() cliente12 = self.generar_cliente_en_rango() camioneta12 = Camioneta() camioneta12.cargar_pizzas() pedido12 = Pedido(cliente12, simulacion.time, camioneta12, camioneta12.pizzas[0].tipo) pedido12.hora_entrega = simulacion.time + timedelta(minutes=15) pedido12.pizza = camioneta12.pizzas[0] pedido12.entregado = True simulacion.pedidos.append(pedido12) pedido22 = Pedido(cliente12, simulacion.time, camioneta12, camioneta12.pizzas[1].tipo) pedido22.hora_entrega = simulacion.time + timedelta(minutes=15) pedido22.pizza = camioneta12.pizzas[1] pedido22.entregado = True simulacion.pedidos.append(pedido22) pedido32 = Pedido(cliente12, simulacion.time, camioneta12, camioneta12.pizzas[2].tipo) pedido32.hora_entrega = simulacion.time + timedelta(minutes=15) pedido32.pizza = camioneta12.pizzas[2] simulacion.pedidos.append(pedido32) pedido42 = Pedido(cliente12, simulacion.time, camioneta12, camioneta12.pizzas[3].tipo) pedido42.hora_entrega = simulacion.time + timedelta(minutes=15) pedido42.pizza = camioneta12.pizzas[3] simulacion.pedidos.append(pedido42) pedido52 = Pedido(cliente12, simulacion.time, camioneta12, camioneta12.pizzas[4].tipo) pedido52.hora_entrega = simulacion.time + timedelta(minutes=15) pedido52.pizza = camioneta12.pizzas[4] simulacion.pedidos.append(pedido52) tiempo_espera = simulacion.tiempo_espera() self.assertEqual(tiempo_espera, 15)
def test_debe_retornar_la_cantidad_de_pizzas_vendidas_segun_tipo(self): simulacion = self.get_simulacion() cliente1 = self.generar_cliente_en_rango() camioneta1 = Camioneta() camioneta1.cargar_pizzas() pedido1 = Pedido(cliente1, 10, camioneta1, camioneta1.pizzas[0].tipo) pedido1.pizza = camioneta1.pizzas[0] pedido1.entregado = True simulacion.pedidos.append(pedido1) pedido2 = Pedido(cliente1, 10, camioneta1, camioneta1.pizzas[1].tipo) pedido2.pizza = camioneta1.pizzas[1] pedido2.entregado = True simulacion.pedidos.append(pedido2) pedido3 = Pedido(cliente1, 10, camioneta1, camioneta1.pizzas[2].tipo) pedido3.pizza = camioneta1.pizzas[2] pedido3.entregado = True simulacion.pedidos.append(pedido3) pedido4 = Pedido(cliente1, 10, camioneta1, camioneta1.pizzas[3].tipo) pedido4.pizza = camioneta1.pizzas[3] pedido4.entregado = True simulacion.pedidos.append(pedido4) pedido5 = Pedido(cliente1, 10, camioneta1, camioneta1.pizzas[4].tipo) pedido5.pizza = camioneta1.pizzas[4] pedido5.entregado = True simulacion.pedidos.append(pedido5) cantidad_de_pizzas_por_tipo = simulacion.pizzas_pedidas_por_tipo() self.assertIsInstance(cantidad_de_pizzas_por_tipo, dict)