В этом руководстве мы создаём продвинутую, полностью автономную логистическую симуляцию, в которой несколько умных грузовиков-доставщиков работают в динамической дорожной сети города. Мы проектируем систему так, чтобы каждый грузовик вёл себя как агент, способный делать ставки на заказы на доставку, планировать оптимальные маршруты, управлять уровнем заряда батареи, искать зарядные станции и максимизировать прибыль за счёт принятия решений, основанных на собственных интересах.
Основные блоки построения симуляции
Мы устанавливаем все основные блоки симуляции, включая импорты, глобальные параметры и базовые структуры данных. Мы также определяем класс AgenticTruck и инициализируем ключевые атрибуты, включая положение, заряд батареи, баланс и рабочее состояние. Мы закладываем основу для развития поведения агентов.
Импорт библиотек и инициализация параметров:
«`python
import networkx as nx
import matplotlib.pyplot as plt
import random
import time
from IPython.display import clear_output
from dataclasses import dataclass, field
from typing import List, Dict, Optional
NUM_NODES = 30
CONNECTION_RADIUS = 0.25
NUM_AGENTS = 5
STARTING_BALANCE = 1000
FUEL_PRICE = 2.0
PAYOUT_MULTIPLIER = 5.0
BATTERY_CAPACITY = 100
CRITICAL_BATTERY = 25
«`
Определение класса `Order`:
«`python
@dataclass
class Order:
id: str
target_node: int
weight_kg: int
payout: float
status: str = «pending»
«`
Класс `AgenticTruck`:
«`python
class AgenticTruck:
def init(self, agentid, startnode, graph, capacity=100):
self.id = agent_id
self.currentnode = startnode
self.graph = graph
self.battery = BATTERY_CAPACITY
self.balance = STARTING_BALANCE
self.capacity = capacity
self.state = «IDLE»
self.path: List[int] = []
self.current_order: Optional[Order] = None
self.targetnode: int = startnode
«`
Логика принятия решений для грузовиков
Мы реализуем продвинутую логику принятия решений для грузовиков. Мы вычисляем кратчайшие пути, определяем ближайшие зарядные станции и оцениваем, является ли заказ прибыльным и выполнимым. Мы также готовим грузовик к принятию заданий или проактивно ищем зарядку, когда это необходимо.
Методы класса `AgenticTruck`:
«`python
def getpathcost(self, start, end):
try:
length = nx.shortestpathlength(self.graph, start, end, weight=’weight’)
path = nx.shortest_path(self.graph, start, end, weight=’weight’)
return length, path
except nx.NetworkXNoPath:
return float(‘inf’), []
def findnearestcharger(self):
chargers = [n for n, attr in self.graph.nodes(data=True) if attr.get(‘type’) == ‘charger’]
best_charger = None
min_dist = float(‘inf’)
best_path = []
for charger in chargers:
dist, path = self.getpathcost(self.current_node, charger)
if dist < min_dist:
min_dist = dist
best_charger = charger
best_path = path
return bestcharger, bestpath
def calculate_bid(self, order):
if order.weight_kg > self.capacity:
return float(‘inf’)
if self.state != «IDLE» or self.battery < CRITICAL_BATTERY:
return float(‘inf’)
disttotarget, = self.getpathcost(self.currentnode, order.target_node)
fuelcost = disttotarget * FUELPRICE
expectedprofit = order.payout — fuelcost
if expected_profit < 10:
return float(‘inf’)
return disttotarget
«`
Управление пошаговыми действиями каждого грузовика
Мы управляем пошаговыми действиями каждого грузовика во время работы симуляции. Мы обрабатываем зарядку батареи, финансовые последствия движения, расход топлива и выполнение заказов. Мы обеспечиваем плавный переход агентов между состояниями, такими как движение, зарядка и простой.
Метод `step` класса `AgenticTruck`:
«`python
def step(self):
if self.state == «IDLE» and self.battery < CRITICAL_BATTERY:
self.go_charge()
if self.state == «CHARGING»:
self.battery += 10
self.balance -= 5
if self.battery >= 100:
self.battery = 100
self.state = «IDLE»
return
if self.path:
next_node = self.path[0]
edgedata = self.graph.getedgedata(self.currentnode, next_node)
distance = edge_data[‘weight’]
self.currentnode = nextnode
self.path.pop(0)
self.battery -= (distance * 2)
self.balance -= (distance * FUEL_PRICE)
if not self.path:
if self.state == «MOVING»:
self.balance += self.current_order.payout
self.current_order.status = «completed»
self.current_order = None
self.state = «IDLE»
elif self.state == «TO_CHARGER»:
self.state = «CHARGING»
«`
Создание симулированного мира и координация взаимодействия агентов
Мы создаём симулированный мир и координируем взаимодействие агентов. Мы генерируем граф-город, запускаем грузовики с разной вместимостью и создаём новые заказы на доставку. Мы также реализуем простой рынок, где агенты делают ставки на задачи, основываясь на прибыльности и расстоянии.
Класс `Simulation`:
«`python
class Simulation:
def init(self):
self.setup_graph()
self.setup_agents()
self.orders = []
self.order_count = 0
def setup_graph(self):
self.G = nx.randomgeometricgraph(NUMNODES, CONNECTIONRADIUS)
for (u, v) in self.G.edges():
self.G.edges[u, v][‘weight’] = random.uniform(1.0, 3.0)
for i in self.G.nodes():
r = random.random()
if r < 0.15:
self.G.nodes[i][‘type’] = ‘charger’
self.G.nodes[i][‘color’] = ‘red’
else:
self.G.nodes[i][‘type’] = ‘house’
self.G.nodes[i][‘color’] = ‘#A0CBE2’
def setup_agents(self):
self.agents = []
for i in range(NUM_AGENTS):
startnode = random.randint(0, NUMNODES-1)
cap = random.choice([50, 100, 200])
self.agents.append(AgenticTruck(i, start_node, self.G, capacity=cap))
«`
Запуск симуляции
Мы запускаем симуляцию и визуализируем логистическую систему в реальном времени. Мы обновляем состояния агентов, рисуем сеть, отображаем активные заказы и анимируем движение каждого грузовика. Запуская этот цикл, мы наблюдаем за возникающей координацией и конкуренцией, которые определяют нашу мультиагентную логистическую экосистему.
Метод `step` класса `Simulation`:
«`python
def step(self):
if random.random() < 0.3:
self.generate_order()
self.run_market()
for agent in self.agents:
agent.step()
«`
Метод `visualize` класса `Simulation`:
«`python
def visualize(self, step_num):
clear_output(wait=True)
plt.figure(figsize=(10, 8))
pos = nx.getnodeattributes(self.G, ‘pos’)
node_colors = [self.G.nodes[n][‘color’] for n in self.G.nodes()]
nx.draw(self.G, pos, nodecolor=nodecolors, withlabels=True, nodesize=300, edge_color=’gray’, alpha=0.6)
for agent in self.agents:
x, y = pos[agent.current_node]
jitter_x = x + random.uniform(-0.02, 0.02)
jitter_y = y + random.uniform(-0.02, 0.02)
color = ‘green’ if agent.state == «IDLE» else (‘orange’ if agent.state == «MOVING» else ‘red’)
plt.plot(jitterx, jittery, marker=’s’, markersize=12, color=color, markeredgecolor=’black’)
plt.text(jitterx, jittery+0.03, f»A{agent.id}\n${int(agent.balance)}\n{int(agent.battery)}%»,
fontsize=8, ha=’center’, fontweight=’bold’, bbox=dict(facecolor=’white’, alpha=0.7, pad=1))
for order in self.orders:
if order.status in [«assigned», «pending»]:
ox, oy = pos[order.target_node]
plt.plot(ox, oy, marker=’*’, markersize=15, color=’gold’, markeredgecolor=’black’)
plt.title(f»Graph-Based Logistics Swarm | Step: {step_num}\nRed Nodes = Chargers | Gold Stars = Orders», fontsize=14)
plt.show()
«`
Заключение
Мы увидели, как отдельные компоненты — генерация графа, автономное планирование маршрутов, управление батареями, аукционы и визуализация — объединяются, чтобы сформировать живую, развивающуюся систему агентских грузовиков. Мы наблюдаем, как агенты договариваются о рабочих нагрузках, конкурируют за прибыльные возможности и реагируют на такие факторы окружающей среды, как расстояние, расходы на топливо и потребности в зарядке. Запуская симуляцию, мы наблюдаем за возникающими динамиками, которые отражают поведение реальных автопарков, предоставляя мощную среду для экспериментов с логистической интеллектуальностью.
1. Какие основные блоки и компоненты включает в себя симуляция автономной мультиагентной логистической системы, описанная в статье?
Ответ:
Симуляция включает в себя следующие основные блоки: импорт библиотек и инициализация параметров, определение класса `Order`, класс `AgenticTruck` с методами для управления поведением агентов, класс `Simulation` для создания симулированного мира и координации взаимодействия агентов.
2. Какие методы используются для управления пошаговыми действиями каждого грузовика во время работы симуляции?
Ответ:
Для управления пошаговыми действиями каждого грузовика используются методы `step` класса `AgenticTruck` и `step` класса `Simulation`. Метод `step` класса `AgenticTruck` обрабатывает зарядку батареи, финансовые последствия движения, расход топлива и выполнение заказов, а метод `step` класса `Simulation` запускает симуляцию и визуализирует логистическую систему в реальном времени.
3. Какие факторы учитываются при принятии решений грузовиками в симуляции?
Ответ:
При принятии решений грузовиками учитываются следующие факторы: кратчайший путь до цели, наличие зарядных станций, прибыльность и выполнимость заказа, а также уровень заряда батареи и текущее состояние грузовика.
4. Какие методы используются для визуализации логистической системы в реальном времени?
Ответ:
Для визуализации логистической системы в реальном времени используется метод `visualize` класса `Simulation`. Этот метод обновляет состояния агентов, рисует сеть, отображает активные заказы и анимирует движение каждого грузовика.
5. Какие классы и методы используются для создания симулированного мира и координации взаимодействия агентов?
Ответ:
Для создания симулированного мира и координации взаимодействия агентов используются класс `Simulation` и его методы `setupgraph`, `setupagents`, `step` и `visualize`. Класс `Simulation` инициализирует граф-город, запускает грузовики с разной вместимостью и создаёт новые заказы на доставку, а также реализует простой рынок, где агенты делают ставки на задачи.