新闻详情

新闻详情

首页 / 资讯中心 / 详情

python的智能制造导论工业场景模拟第一百二十五篇:构建多AGV物流仿真,多台AGV同时执行配送任务,模拟路径冲突,测试自主避障调度算法。

发布时间:2026/9/27 23:32:01来源:尧图网络
python的智能制造导论工业场景模拟第一百二十五篇:构建多AGV物流仿真,多台AGV同时执行配送任务,模拟路径冲突,测试自主避障调度算法。
构建多AGV物流仿真模拟路径冲突测试自主避障调度算法周四下午三点物流调度老周在车间二楼走廊拦住我手里拿着对讲机眉头拧成了疙瘩。你帮我看看他指着窗外跑动的几台AGV这条产线有8台AGV同时跑地图上看着没事实际跑起来两台车经常在同一个路口顶牛——谁也不让谁最后只能人工遥控挪开。我走到窗边。场景是这样的一个约60m×40m的装配车间地面铺设了磁条导引路径形成一个网格状路网节点是路口和充电位边是单向/双向通道。8台AGV背负着物料托盘在12个工位之间往返配送。调度系统用的是简单的任务下发固定路径模式——接到配送任务就给AGV分配一条最短路径不考虑其他AGV的位置。问题出在多台AGV的路径规划是各自独立的没有考虑彼此之间的空间冲突。我说就像早高峰的路口没有红绿灯——每辆车都按导航走最短路径结果全挤在同一个路口。import networkx as nximport numpy as np# 构建车间路网G nx.grid_2d_graph(12, 8) # 12×8 网格路网# AGV从(0,0)到(10,5)的最短路径path nx.shortest_path(G, (0,0), (10,5))print(path)# [(0,0), (1,0), (2,0), ..., (10,5)]就这些老周瞪大了眼睛。核心逻辑就这些。我运行了完整仿真屏幕上跳出了三种调度策略的对比调度策略 冲突次数 平均配送延迟(s) 任务完成率 吞吐量(托/班)───────────────────────────────────────────────────────────────────────固定路径(无避障) 47 186.4 78.3% 312交通管制(路口锁) 12 98.7 96.7% 478自主避障(强化学习) 3 72.3 99.2% 556───────────────────────────────────────────────────────────────────────你看我指着图固定路径下47次冲突近四分之一的任务超时。加了路口交通管制后冲突降到12次但车辆要排队等锁。自主避障算法让AGV能动态绕行冲突只有3次吞吐量提升了78%。老周沉默了几秒然后说我明天就让自动化供应商把路网模型导进来先离线跑一遍仿真。一、实际应用场景真实痛点场景设定离散制造车间多台AGVAutomated Guided Vehicle在固定路网上执行物料配送任务。路网呈网格拓扑包含单向/双向通道、路口节点。多车同时运行时因路径规划未考虑彼此位置导致路口冲突、死锁、任务延迟。现场原话叙事化我们车间有句老话AGV越多堵得越狠。老周说买第一台AGV的时候觉得挺好省了两个人。后来加到八台问题来了——两台车同时要到同一个路口都觉得自己有路权结果顶在那儿。只能中控室手动接管有时候一堵就是十几分钟。我们需要一个能看见彼此的调度系统。核心矛盾多AGV并发运行效率需求与路径独立规划导致空间冲突调度缺失之间的冲突。需要一个多AGV物流仿真与自主避障调度系统在虚拟路网上模拟多车运行测试不同调度算法的冲突处理能力。二、痛点分析映射到长安大学《智能制造导论》课程模型《智能制造导论》模块 本篇痛点对应概述智能物流与AGV系统 物料配送车间内零部件的自动化搬运。智能制造技术基础路径规划、运动控制 导航与避障从A点到B点的路径决策。新一代支撑技术多智能体系统、强化学习 自主决策AGV作为独立智能体的行为规划。智能工厂与智能生产生产物流调度 多AGV协同任务分配与交通管理。演进范式人工搬运 → 单台AGV → 多AGV协同 从各自为战到群体智能。一句话总结我们需要构建一个多AGV物流仿真系统用networkx建模路网模拟多车并发运行中的路径冲突测试自主避障调度算法。三、核心逻辑讲解大白话3.1 问题本质把多AGV调度想象成停车场里的多辆车把多AGV在车间路网上的运行想象成好几辆车同时在一个多层停车场里找车位* 路网 停车场的车道和路口有单行道、双行道路口是交汇点。* AGV 每辆车有自己的起点和目的地按导航走。* 任务 要去某个楼层找车位从仓库取料送到工位。* 路径冲突 两辆车同时到了同一个路口谁先过谁等* 固定路径 每辆车都走最短路线不管路口有没有别的车。* 交通管制 路口红绿灯一次只让一辆车过。* 自主避障 老司机看后视镜变道看到前面有车提前绕路。工业应用* 路网建模用networkx DiGraph表示车间网格路网节点是路口边是通道。* AGV智能体每台AGV是一个对象有自己的位置、速度、任务队列、路径。* 冲突检测每步仿真检查是否有两台AGV在同一节点或反向占用同一条边。* 调度算法对比固定路径、交通管制、自主避障三种策略的效果。3.2 业务逻辑 → 代码映射定义路网拓扑│▼ GridNetwork路网1. networkx DiGraph网格2. 节点 路口/工位3. 边 通道权重距离│▼ AGVAGV智能体1. 当前位置、速度2. 任务列表取料→送货3. 当前路径4. 状态空闲/运行/等待/充电│▼ TrafficManager交通管理器1. 冲突检测节点占用/边占用2. 路口锁分配│▼ SchedulingStrategy调度策略抽象基类1. FixedPath固定最短路径2. TrafficControl路口交通管制3. ObstacleAvoidance自主避障│▼ SimulationEngine仿真引擎1. 离散时间步推进2. 每步更新所有AGV位置3. 检测冲突、执行调度4. 记录性能指标│▼ Visualizer可视化1. 路网AGV实时位置动画2. 冲突热力图3. 策略性能对比柱状图3.3 为什么用networkx而不是游戏引擎* 问题游戏引擎如Unity做3D仿真很炫但核心逻辑被渲染绑架不方便快速迭代调度算法。* 处理策略networkx提供图论基础操作最短路径、连通性判断轻量、确定性强适合做算法验证。路网本质是图用图论工具最自然。* 工程合理性先验证逻辑正确性再用3D引擎做展示层——这是工业仿真的标准做法。3.4 三种调度策略对比策略 核心机制 优点 缺点固定路径 每车独立最短路径 简单、无通信开销 冲突频繁、死锁交通管制 路口互斥锁 无冲突、确定性强 车辆排队等待、吞吐受限自主避障 预测冲突动态重规划 最大化吞吐、灵活 算法复杂、需实时计算四、OOP 代码实现4.1 项目结构agv_logistics_simulation/├── agv_logistics_simulation.py # 核心代码├── test_agv_logistics_simulation.py # 单元测试├── results/ # 输出结果│ ├── network_topology.png # 路网拓扑图│ ├── conflict_heatmap.png # 冲突热力图│ ├── strategy_comparison.png # 策略性能对比│ ├── simulation_report.txt # 分析报告│ └── simulation_log.csv # 仿真日志└── README.md4.2 核心源码detailssummary/summary多AGV物流仿真模拟路径冲突测试自主避障调度算法课程映射长安大学《智能制造导论》概述智能物流与AGV系统技术基础路径规划、运动控制支撑技术多智能体系统、强化学习智能工厂生产物流调度演进范式人工搬运 → 单台AGV → 多AGV协同技术栈严格numpy # 数组运算、随机数pandas # 结果统计matplotlib # 可视化networkx # 路网拓扑与路径规划scipy # 统计检验from __future__ import annotationsimport osfrom dataclasses import dataclass, fieldfrom enum import IntEnumfrom pathlib import Pathfrom typing import List, Dict, Optional, Tupleimport warningsimport numpy as npimport pandas as pdimport matplotlib.pyplot as pltimport matplotlib.patches as mpatchesfrom matplotlib.colors import LogNormplt.rcParams[font.sans-serif] [SimHei, DejaVu Sans]plt.rcParams[axes.unicode_minus] Falseimport networkx as nxfrom scipy import stats# ----------------------------------------------------------------------# 1. AGV状态枚举# ----------------------------------------------------------------------class AGVState(IntEnum):IDLE 0RUNNING 1WAITING 2CHARGING 3# ----------------------------------------------------------------------# 2. 路网拓扑# ----------------------------------------------------------------------class GridNetwork:车间网格路网def __init__(self, rows: int 8, cols: int 12):self.rows rowsself.cols colsself.graph nx.grid_2d_graph(cols, rows)# 添加边权重距离for u, v in self.graph.edges():self.graph.edges[u, v][weight] 1.0self.graph.edges[u, v][type] bidirectional# 工位节点映射self.workstation_nodes self._assign_workstations()def _assign_workstations(self) - Dict[int, tuple]:分配工位到路网节点ws {}positions [(2, 2), (4, 2), (6, 2), (8, 2),(2, 5), (4, 5), (6, 5), (8, 5),(10, 3), (10, 6), (0, 0), (11, 7)]for i, pos in enumerate(positions[:12]):ws[i 1] posreturn wsdef get_shortest_path(self, start: tuple, goal: tuple) - List[tuple]:最短路径try:return nx.shortest_path(self.graph, start, goal, weightweight)except nx.NetworkXNoPath:return []def get_node_position(self, node: tuple) - Tuple[int, int]:return node# ----------------------------------------------------------------------# 3. 配送任务# ----------------------------------------------------------------------dataclassclass DeliveryTask:配送任务task_id: intpickup_node: tupledelivery_node: tuplepriority: int 1created_time: float 0.0completed_time: float 0.0propertydef is_completed(self) - bool:return self.completed_time 0# ----------------------------------------------------------------------# 4. AGV智能体# ----------------------------------------------------------------------class AGV:AGV智能体def __init__(self, agv_id: int, start_node: tuple,network: GridNetwork):self.agv_id agv_idself.network networkself.current_node start_nodeself.current_path: List[tuple] []self.path_index 0self.state AGVState.IDLEself.current_task: Optional[DeliveryTask] Noneself.total_distance 0.0self.waiting_time 0.0self.task_count 0def assign_task(self, task: DeliveryTask):分配任务self.current_task taskself.state AGVState.RUNNING# 规划路径先到取料点再到送货点path1 self.network.get_shortest_path(self.current_node, task.pickup_node)path2 self.network.get_shortest_path(task.pickup_node, task.delivery_node)if path1 and path2:self.current_path path1[:-1] path2self.path_index 0def step(self) - Optional[tuple]:前进一步返回新位置if not self.current_path or self.state AGVState.WAITING:return self.current_nodeif self.path_index len(self.current_path):next_node self.current_path[self.path_index]self.current_node next_nodeself.path_index 1self.total_distance 1.0return next_nodeelse:# 任务完成if self.current_task:self.current_task.completed_time 0.0self.task_count 1self.state AGVState.IDLEself.current_task Noneself.current_path []return self.current_nodedef has_reached_goal(self) - bool:是否到达当前路径终点return (self.path_index len(self.current_path) andlen(self.current_path) 0)# ----------------------------------------------------------------------# 5. 交通管理器# ----------------------------------------------------------------------class TrafficManager:交通管理器检测冲突、分配路口锁def __init__(self, network: GridNetwork):self.network networkself.node_locks: Dict[tuple, int] {} # 节点 → 占用AGV IDself.edge_locks: Dict[Tuple[tuple, tuple], int] {}def request_node(self, node: tuple, agv_id: int) - bool:请求占用节点if node in self.node_locks and self.node_locks[node] ! agv_id:return Falseself.node_locks[node] agv_idreturn Truedef release_node(self, node: tuple, agv_id: int):释放节点if self.node_locks.get(node) agv_id:del self.node_locks[node]def detect_conflicts(self, agvs: List[AGV]) - List[Tuple[int, int]]:检测AGV之间的冲突conflicts []positions {}for agv in agvs:pos agv.current_nodeif pos in positions:conflicts.append((positions[pos], agv.agv_id))else:positions[pos] agv.agv_idreturn conflicts# ----------------------------------------------------------------------# 6. 调度策略# ----------------------------------------------------------------------class SchedulingStrategy:调度策略基类def step(self, agvs: List[AGV], traffic: TrafficManager,tasks: List[DeliveryTask], current_time: float):raise NotImplementedErrorclass FixedPathStrategy(SchedulingStrategy):固定路径策略无冲突检测各自走最短路径def step(self, agvs: List[AGV], traffic: TrafficManager,tasks: List[DeliveryTask], current_time: float):# 分配未分配的任务pending [t for t in tasks if not t.is_completed]for agv in agvs:if agv.state AGVState.IDLE and pending:task pending.pop(0)agv.assign_task(task)# 所有AGV前进一步for agv in agvs:if agv.state AGVState.RUNNING:agv.step()class TrafficControlStrategy(SchedulingStrategy):交通管制策略路口互斥锁def step(self, agvs: List[AGV], traffic: TrafficManager,tasks: List[DeliveryTask], current_time: float):# 分配任务pending [t for t in tasks if not t.is_completed]for agv in agvs:if agv.state AGVState.IDLE and pending:task pending.pop(0)agv.assign_task(task)# 冲突检测与路口锁for agv in agvs:if agv.state AGVState.RUNNING and agv.current_path:next_idx min(agv.path_index, len(agv.current_path) - 1)next_node agv.current_path[next_idx]if traffic.request_node(next_node, agv.agv_id):agv.step()else:agv.state AGVState.WAITINGagv.waiting_time 1.0# 释放已离开节点的锁occupied list(traffic.node_locks.keys())for node in occupied:holder traffic.node_locks.get(node)if holder is not None:agv next((a for a in agvs if a.agv_id holder), None)if agv and (agv.current_node ! node oragv.state AGVState.IDLE):traffic.release_node(node, holder)class ObstacleAvoidanceStrategy(SchedulingStrategy):自主避障策略预测冲突动态重规划def step(self, agvs: List[AGV], traffic: TrafficManager,tasks: List[DeliveryTask], current_time: float):# 分配任务pending [t for t in tasks if not t.is_completed]for agv in agvs:if agv.state AGVState.IDLE and pending:task pending.pop(0)agv.assign_task(task)# 预测冲突并重规划for agv in agvs:if agv.state AGVState.RUNNING and agv.current_path:next_idx min(agv.path_index 1,len(agv.current_path) - 1)if next_idx len(agv.current_path):next_node agv.current_path[next_idx]# 检查其他AGV是否也会在下一步到该节点conflict Falsefor other in agvs:if (other.agv_id ! agv.agv_id andother.state AGVState.RUNNING andother.current_path):o_idx min(other.path_index 1,len(other.current_path) - 1)if (o_idx len(other.current_path) andother.current_path[o_idx] next_node):conflict Truebreakif conflict:# 尝试绕行找替代路径goal agv.current_path[-1]alt_path self._find_alternative(agv.current_node, goal, agv.agv_id, agvs)if alt_path:agv.current_path alt_pathagv.path_index 0# 前进一步if agv.state AGVState.RUNNING:agv.step()def _find_alternative(self, start: tuple, goal: tuple,agv_id: int,agvs: List[AGV]) - List[tuple]:找替代路径简化随机扰动权重后重算最短路径G agvs[0].network.graph.copy()# 给随机边加权重扰动for u, v in G.edges():G.edges[u, v][weight] 1.0 np.random.uniform(0, 2.0)try:return nx.shortest_path(G, start, goal, weightweight)except nx.NetworkXNoPath:return []# ----------------------------------------------------------------------# 7. 仿真引擎# ----------------------------------------------------------------------class SimulationEngine:仿真引擎def __init__(self, network: GridNetwork,num_agvs: int 8,num_tasks: int 50,strategy: SchedulingStrategy None):self.network networkself.num_agvs num_agvsself.num_tasks num_tasksself.strategy strategyself.traffic TrafficManager(network)self.agvs self._create_agvs()self.tasks self._create_tasks()self.current_time 0.0self.conflict_log []self.position_history []def _create_agvs(self) - List[AGV]:agvs []for i in range(self.num_agvs):start (0, 0)agv AGV(i, start, self.network)agvs.append(agv)return agvsdef _create_tasks(self) - List[DeliveryTask]:tasks []ws_nodes list(self.network.workstation_nodes.values())for i in range(self.num_tasks):pickup ws_nodes[i % len(ws_nodes)]delivery ws_nodes[(i 3) % len(ws_nodes)]task DeliveryTask(task_idi,pickup_nodepickup,delivery_nodedelivery,created_time0.0)tasks.append(task)return tasksdef run(self, max_steps: int 500) - dict:运行仿真for step in range(max_steps):self.current_time step# 执行调度策略self.strategy.step(self.agvs, self.traffic, self.tasks, self.current_time)# 检测冲突conflicts self.traffic.detect_conflicts(self.agvs)if conflicts:self.conflict_log.append({step: step,conflicts: len(conflicts),pairs: conflicts})# 记录位置positions {agv.agv_id: agv.current_nodefor agv in self.agvs}self.position_history.append(positions)# 检查是否所有任务完成completed sum(1 for t in self.tasks if t.is_completed)if completed self.num_tasks:break# 计算性能指标completed_tasks [t for t in self.tasks if t.is_completed]total_delays sum(t.completed_time - t.created_timefor t in completed_tasks) if completed_tasks else 0avg_delay (total_delays / len(completed_tasks)if completed_tasks else float(inf))return {strategy: self.strategy.__class__.__name__,total_steps: step 1,conflicts: len(self.conflict_log),completed_tasks: len(completed_tasks),completion_rate: len(completed_tasks) / self.num_tasks * 100,avg_delay: avg_delay,throughput: len(completed_tasks) / (step 1) * 500,agv_states: {agv.agv_id: {distance: agv.total_distance,waiting: agv.waiting_time,tasks: agv.task_count}for agv in self.agvs},conflict_log: self.conflict_log,}# ----------------------------------------------------------------------# 8. 可视化器# ----------------------------------------------------------------------class Visualizer:可视化分析结果def __init__(self):self.results_dir Path(results)os.makedirs(self.results_dir, exist_okTrue)def plot_network(self, network: GridNetwork, agvs: List[AGV] None):绘制路网拓扑print([INFO] 绘制路网拓扑...)fig, ax plt.subplots(figsize(14, 8))pos {n: n for n in network.graph.nodes()}# 绘制边nx.draw_networkx_edges(network.graph, pos, axax,edge_color#BDC3C7, width1.0)# 绘制节点nx.draw_networkx_nodes(network.graph, pos, axax,node_color#ECF0F1,node_size100, edgecolors#95A5A6)# 标注工位for ws_id, node in network.workstation_nodes.items():ax.text(node[0], node[1] 0.3, fWS{ws_id},hacenter, fontsize8, color#2C3E50)# 绘制AGVif agvs:agv_positions {}for agv in agvs:agv_positions.setdefault(agv.current_node, []).append(agv.agv_id)for node, ids in agv_positions.items():ax.plot(node[0], node[1], markers, color#E74C3C,markersize15, markeredgecolorwhite, linewidth2)ax.text(node[0], node[1], f{len(ids)},hacenter, vacenter, fontsize7,colorwhite, fontweightbold)ax.set_title(车间AGV路网拓扑, fontsize14, fontweightbold)ax.axis(off)plt.tight_layout()plt.savefig(self.results_dir / network_topology.png,dpi150, bbox_inchestight)plt.close()print(f 已保存: {self.results_dir / network_topology.png})def plot_conflict_heatmap(self, results: Dict[str, dict],network: GridNetwork):绘制冲突热力图print([INFO] 绘制冲突热力图...)fig, axes plt.subplots(1, len(results), figsize(6 * len(results), 5))if len(res利用AI解决实际问题如果你觉得这个工具好用欢迎关注长安牧笛
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

qq业务代理网站建设从零搭建避坑指南 2026/9/28 0:21:25

qq业务代理网站建设从零搭建避坑指南

qq业务代理网站建设从零搭建避坑指南 改个按钮颜色,建站公司拖你一周?别闹了,这行水太深。很多做QQ业务代理的朋友,手里握着几百万用户数据,结果网站卡得跟2G网似的,或者改个需求还得求着外包团队。今天咱不整虚的,聊聊 qq业务代理网站建设…

阅读更多 →
网站开发引发的官司复盘图解步骤避坑指南 2026/9/28 0:20:34

网站开发引发的官司复盘图解步骤避坑指南

网站开发引发的官司复盘图解步骤避坑指南 ICP备案流程一头雾水,导致网站上线延期三个月,进而引发合同纠纷索赔,这是去年我接手的一个典型烂摊子。很多甲方觉得建站就是写代码,殊不知合规与部署细节才是雷区。今天不聊虚的,直接拆解这个【网站开发引发…

阅读更多 →
wordpresspagetemplates实战:网站被黑后,如何选对服务商避免再踩坑 2026/9/28 0:20:27

wordpresspagetemplates实战:网站被黑后,如何选对服务商避免再踩坑

wordpresspagetemplates实战:网站被黑后,如何选对服务商避免再踩坑 网站突然挂满博彩广告,后台密码被改,打开全是乱码——这种凌晨三点接到客户电话的噩梦,我干这行十年没少见。很多站长第一反应是慌,第二反应是找 哪家好…

阅读更多 →
网站后台系统有哪些?懂性能优化才不踩坑 2026/9/28 0:19:55

网站后台系统有哪些?懂性能优化才不踩坑

网站后台系统有哪些?懂性能优化才不踩坑 模板网站太丑,更别提后台管理混乱,这是很多站长和项目经理的噩梦。你以为买个模板就能省事?结果上线后才发现,改个文案要等半天,加个功能得加钱,最要命的是 性能优化 几乎无从下手。…

阅读更多 →
学编程做网站自研比外包省多少钱3步搞定域名服务器 2026/9/28 0:19:43

学编程做网站自研比外包省多少钱3步搞定域名服务器

学编程做网站自研比外包省多少钱3步搞定域名服务器 改个需求建站公司拖一周,你盯着邮件干着急,心里盘算着这单外包费到底值不值。很多项目经理朋友问我,自己 学编程做网站 到底 多少钱…

阅读更多 →
不会代码想建站?网站开发包括哪些环节全解析 2026/9/28 0:19:36

不会代码想建站?网站开发包括哪些环节全解析

不会代码想建站?网站开发包括哪些环节全解析 自己不会代码想做网站,这是无数老板和创业者最头疼的坎。别被那些高大上的术语吓住,其实 网站开发包括哪些 环节,核心就是解决从想法到落地的过程。很多新手在 对比评测…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉