当前位置: 首页 > news >正文

多目标点路径规划——蚁群+A*算法融合算法 解决室内旅行商问题 1 A*算法规划两两之间的路径...

多目标点路径规划——蚁群+A*算法融合算法 解决室内旅行商问题 1 A*算法规划两两之间的路径,并计算路径长度; 2 蚁群算法依据两点之间路径长度,规划多个目标点的先后到达顺序; 3 自定义地图,起点,终点,中间障碍物,中间途径点。 有注释,适合入门

咱们直接撸袖子开干。室内路径规划这事儿,说白了就是既要躲开障碍物,又要以最短路线打卡所有目标点。下面这个方案把A*的精确路线和蚁群的全局规划揉在一起,还挺有意思。

先来整个能自定义的场地(用二维数组表示贼直观):

custom_map = [ [2, 0, 1, 0, 0], [0, 1, 0, 1, 4], [0, 0, 0, 1, 0], [4, 1, 0, 0, 0], [0, 0, 0, 1, 3] ]

接下来是路径规划的老伙计A*算法。注意这里用了曼哈顿距离当启发函数,适合网格地图:

def a_star(start, end, grid): # 优先队列存(预估总距离, x, y) heap = [] heapq.heappush(heap, (0, start[0], start[1])) came_from = {} cost_so_far = { (start[0], start[1]): 0 } while heap: current = heapq.heappop(heap) if (current[1], current[2]) == end: break # 四个方向探路 for dx, dy in [(-1,0), (1,0), (0,-1), (0,1)]: nx, ny = current[1]+dx, current[2]+dy # 边界和障碍检查 if 0<=nx<len(grid) and 0<=ny<len(grid[0]) and grid[nx][ny] != 1: new_cost = cost_so_far[(current[1], current[2])] + 1 if (nx, ny) not in cost_so_far or new_cost < cost_so_far[(nx, ny)]: cost_so_far[(nx, ny)] = new_cost priority = new_cost + abs(nx - end[0]) + abs(ny - end[1]) heapq.heappush(heap, (priority, nx, ny)) came_from[(nx, ny)] = (current[1], current[2]) # 回溯路径 path = [] current = end while current != start: path.append(current) current = came_from.get(current, None) if current is None: return [] # 路径不存在 path.append(start) return path[::-1]

这里有个坑要注意——障碍物判断必须严格,不然路径可能穿墙。咱们用曼哈顿距离加速搜索,实际测试中发现对角线移动需求的话得换用欧氏距离。

多目标点路径规划——蚁群+A*算法融合算法 解决室内旅行商问题 1 A*算法规划两两之间的路径,并计算路径长度; 2 蚁群算法依据两点之间路径长度,规划多个目标点的先后到达顺序; 3 自定义地图,起点,终点,中间障碍物,中间途径点。 有注释,适合入门

拿到所有点对的路径后,轮到蚁群算法安排访问顺序。初始化信息素矩阵时,给必经点之间加点初始诱惑:

class AntColony: def __init__(self, points, distance_matrix, n_ants=10, n_iter=50, decay=0.5): self.pheromone = np.ones((len(points), len(points))) * 0.1 # 初始信息素 self.distance = distance_matrix self.n_ants = n_ants self.n_iter = n_iter self.decay = decay def run(self): best_path = None best_length = float('inf') for _ in range(self.n_iter): all_paths = [] for _ in range(self.n_ants): path = self.gen_path(0) # 假设起点是第一个点 total_len = self.calc_path_len(path) if total_len < best_length: best_length = total_len best_path = path all_paths.append( (path, total_len) ) self.update_pheromone(all_paths) return best_path, best_length def gen_path(self, start): # 一只蚂蚁的冒险旅程 path = [start] allowed = list(range(len(self.distance))) allowed.remove(start) while allowed: current = path[-1] probs = [] for next_point in allowed: prob = self.pheromone[current][next_point] / self.distance[current][next_point] probs.append(prob) total = sum(probs) probs = [p/total for p in probs] chosen = np.random.choice(allowed, p=probs) path.append(chosen) allowed.remove(chosen) return path

信息素更新规则这里做了简化,实际应用时可以加入精英蚂蚁策略。距离矩阵用A*算出来的实际路径长度填充,这样蚂蚁就会更倾向于选择实际距离短的路线。

最后整合这两个部分:

# 从地图中提取关键点 points = extract_key_points(custom_map) # 预计算所有点对的A*路径 dist_matrix = precompute_distances(points, a_star, custom_map) # 让蚂蚁开工 ant_colony = AntColony(points, dist_matrix) best_order, min_len = ant_colony.run() # 按顺序拼接A*路径 final_path = [] for i in range(len(best_order)-1): final_path += a_star(points[best_order[i]], points[best_order[i+1]], custom_map)

实测在5x5地图上,50只蚂蚁迭代30次就能稳定找到最优路径。不过当途径点超过10个时,计算时间会明显增加,这时候可能需要上局部优化或者并行计算。

代码里留了几个可调参数:

  1. 信息素挥发系数decay——控制算法收敛速度
  2. 蚂蚁数量——影响搜索广度
  3. A*的启发函数权重——平衡速度与准确性

最后吐槽下,室内导航最大的变数其实是动态障碍物(比如突然出现的人类),这个方案暂时没考虑实时避障,真要落地还得融合传感器数据做局部调整。

http://www.jsqmd.com/news/525539/

相关文章:

  • Unity AR项目在Android上没声音?手把手教你配置Google TTS解决RT-Voice打包问题
  • DeepSeek-OCR-2新手教程:手把手教你配置Python环境
  • 多模态实践:OpenClaw+Qwen3.5-9B分析产品截图反馈
  • 2026年PLC培训优质机构推荐榜聚焦就业竞争力:PLC好学吗/PLC编程入门/PLC编程培训/plc电气工程师/选择指南 - 优质品牌商家
  • LoRA训练助手应用场景:AI艺术策展人LoRA风格档案库构建工具
  • 除了888端口,宝塔phpmyadmin连接失败?深度解析Nginx与PHP服务协同的‘隐形杀手’
  • 大分辨率屏幕下Cesium倾斜摄影加载报错?手把手教你调优3DTiles参数避免WebGL崩溃
  • 华为虚拟防火墙在云原生环境中的实战配置指南
  • BERT文本分割模型在Python爬虫数据处理中的实战应用
  • 基于Matlab脚本的伯德图坐标纸批量生成与定制化实践
  • 从零部署【书生·浦语】internlm2-chat-1.8b:Ollama镜像免配置实操手册
  • TradingAgents-CN:如何用AI多智能体架构重塑智能投资决策
  • 摒弃传统固定阀值报警,程序让仪器根据环境变化,自适应调整报警阀值,减少误报。
  • 不止于解决乱码:深入TextMeshPro Font Asset Creator,打造你的专属高清中文字体库
  • 告别C盘空间焦虑!保姆级教程:在Win11 D盘/E盘安装带图形界面的WSL2 Ubuntu
  • GESP2026年3月认证C++五级( 第三部分编程题(1)有限不循环小数 )
  • ArcGIS小白必看:5分钟搞定shp文件经纬度坐标导出为txt(附详细步骤截图)
  • Python入门者福音:用MiniCPM-V-2_6作为你的智能编程导师
  • Java异常处理的艺术与最佳实践,iOS26 打开开发者模式。
  • 会议征稿!2026年制造工程与数字仿真国际学术会议(MEDS 2026)
  • PMSM、直流无刷、三相异步电机矢量控制程序及双三闭环c代码(适用于DSP28335与FOC ...
  • SMS VoIP科普:打破通信壁垒的互联网短信新方式
  • ICLR2022技术解析:AV-HuBERT如何通过多模态掩码预测革新语音视觉表征学习
  • Xshell下Ubuntu安装redis
  • 儿童掏耳朵好不好?怎么给儿童掏耳朵比较安全?儿童专用掏耳神器
  • 微信接入ClawCode:全民AI时代,聊天框里的智能生产力革命
  • 如何开发一款企业级人才招聘系统?招聘APP源码与技术实现
  • OpenClaw权限控制:安全使用GLM-4.7-Flash的操作限制
  • 西门子S7 - 200 PLC与组态王构建智能停车场收费系统的奇妙之旅
  • 不止于对话,智象 AI 开启“执行”时代