The before code assigns orders randomly, which can overload some agents. The after code assigns orders to the agent with the least current workload, balancing assignments and improving efficiency.
### Before: naive random assignment
import random
class DeliveryAgent:
def __init__(self, id):
self.id = id
class Order:
def __init__(self, id):
self.id = id
class AssignmentService:
def __init__(self, agents):
self.agents = agents
def assign(self, order):
agent = random.choice(self.agents)
print(f"Order {order.id} assigned to agent {agent.id} (random)")
### After: assignment based on least workload
class DeliveryAgentWithLoad:
def __init__(self, id):
self.id = id
self.current_load = 0
class AssignmentServiceWithLoad:
def __init__(self, agents):
self.agents = agents
def assign(self, order):
# Pick agent with least current load
agent = min(self.agents, key=lambda a: a.current_load)
agent.current_load += 1
print(f"Order {order.id} assigned to agent {agent.id} (least load)")
# Example usage
agents = [DeliveryAgentWithLoad(i) for i in range(3)]
service = AssignmentServiceWithLoad(agents)
orders = [Order(i) for i in range(5)]
for order in orders:
service.assign(order)