Advertisement
Guest User

Untitled

a guest
Dec 6th, 2019
144
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.61 KB | None | 0 0
  1. FleetManagercustomerCUSTOMERcustomerimport json
  2. import math
  3.  
  4. from simfleet.customer import CustomerStrategyBehaviour
  5. from simfleet.fleetmanager import FleetManagerStrategyBehaviour
  6. from simfleet.transport import TransportStrategyBehaviour
  7. from simfleet.utils import TRANSPORT_WAITING, TRANSPORT_WAITING_FOR_APPROVAL, CUSTOMER_WAITING, TRANSPORT_MOVING_TO_CUSTOMER, \
  8. CUSTOMER_ASSIGNED
  9. from simfleet.protocol import REQUEST_PERFORMATIVE, ACCEPT_PERFORMATIVE, REFUSE_PERFORMATIVE, PROPOSE_PERFORMATIVE, \
  10. CANCEL_PERFORMATIVE
  11. from simfleet.helpers import PathRequestException, distance_in_meters
  12.  
  13. ###############################################################
  14. # Desarrollado por Joaquin Sanchiz Navarro 54064236E #
  15. # Desarrollado por Carlos #
  16. ###############################################################
  17.  
  18.  
  19. class MyFleetManagerStrategy(FleetManagerStrategyBehaviour):
  20. """
  21. The default strategy for the FleetManager agent. By default it delegates all requests to all transports.
  22. """
  23.  
  24. async def run(self):
  25. msg = await self.receive(timeout=5)
  26. if msg:
  27.  
  28. content = json.loads(msg.body)
  29. id = content["customer_id"]
  30. pos = content["origin"]
  31. dest = content["dest"]
  32.  
  33. closer_transport = None
  34. min_dist = math.inf
  35. for transport in self.get_transport_agents():
  36.  
  37. if distance_in_meters(transport.get("current_pos"),pos) < min_dist:
  38. closer_transport = transport
  39. min_dist = distance_in_meters(transport.get("current_pos"),pos)
  40.  
  41. msg.to = str(closer_transport.jid)
  42. self.logger.debug("FleetManager sent request to transport {}".format(closer_transport.name))
  43. await self.send(msg)
  44.  
  45.  
  46. class MyTransportStrategy(TransportStrategyBehaviour):
  47. """
  48. The default strategy for the Transport agent. By default it accepts every request it receives if available.
  49. """
  50.  
  51. async def run(self):
  52. msg = await self.receive(timeout=5)
  53. if not msg:
  54. return
  55. self.logger.debug("Transport received message: {}".format(msg))
  56. content = json.loads(msg.body)
  57. performative = msg.get_metadata("performative")
  58.  
  59. self.logger.debug("Transport {} received request protocol from customer {}.".format(self.agent.name,
  60. content["customer_id"]))
  61. if performative == REQUEST_PERFORMATIVE:
  62. if self.agent.status == TRANSPORT_WAITING:
  63. await self.send_proposal(content["customer_id"], {})
  64. self.agent.status = TRANSPORT_WAITING_FOR_APPROVAL
  65.  
  66. elif performative == ACCEPT_PERFORMATIVE:
  67. if self.agent.status == TRANSPORT_WAITING_FOR_APPROVAL:
  68. self.logger.debug("Transport {} got accept from {}".format(self.agent.name,
  69. content["customer_id"]))
  70. try:
  71. self.agent.status = TRANSPORT_MOVING_TO_CUSTOMER
  72. await self.pick_up_customer(content["customer_id"], content["origin"], content["dest"])
  73. except PathRequestException:
  74. self.logger.error("Transport {} could not get a path to customer {}. Cancelling..."
  75. .format(self.agent.name, content["customer_id"]))
  76. self.agent.status = TRANSPORT_WAITING
  77. await self.cancel_proposal(content["customer_id"])
  78. except Exception as e:
  79. self.logger.error("Unexpected error in transport {}: {}".format(self.agent.name, e))
  80. await self.cancel_proposal(content["customer_id"])
  81. self.agent.status = TRANSPORT_WAITING
  82. else:
  83. await self.cancel_proposal(content["customer_id"])
  84.  
  85. elif performative == REFUSE_PERFORMATIVE:
  86. self.logger.debug("Transport {} got refusal from {}".format(self.agent.name,
  87. content["customer_id"]))
  88. if self.agent.status == TRANSPORT_WAITING_FOR_APPROVAL:
  89. self.agent.status = TRANSPORT_WAITING
  90.  
  91.  
  92. class MyCustomerStrategy(CustomerStrategyBehaviour):
  93. """
  94. The default strategy for the Customer agent. By default it accepts the first proposal it receives.
  95. """
  96.  
  97. async def run(self):
  98. if self.agent.status == CUSTOMER_WAITING:
  99. await self.send_request(content={})
  100.  
  101. msg = await self.receive(timeout=5)
  102.  
  103. if msg:
  104. performative = msg.get_metadata("performative")
  105. transport_id = msg.sender
  106. if performative == PROPOSE_PERFORMATIVE:
  107. if self.agent.status == CUSTOMER_WAITING:
  108. self.logger.debug("Customer {} received proposal from transport {}".format(self.agent.name,
  109. transport_id))
  110. await self.accept_transport(transport_id)
  111. self.agent.status = CUSTOMER_ASSIGNED
  112. else:
  113. await self.refuse_transport(transport_id)
  114.  
  115. elif performative == CANCEL_PERFORMATIVE:
  116. if self.agent.transport_assigned == str(transport_id):
  117. self.logger.warning("Customer {} received a CANCEL from Transport {}.".format(self.agent.name, transport_id))
  118. self.agent.status = CUSTOMER_WAITING
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement