1. 项目概述
六边形网格路径规划在游戏开发、机器人导航、物流优化等领域有着广泛应用。与传统的方形网格相比,六边形网格具有更自然的邻接关系和更平滑的移动路径。本项目通过四种经典算法(A*、遗传算法、蚁群优化和元胞自动机)在四种典型场景下进行路径规划实验,并提供了完整的Python实现代码。
提示:六边形网格的坐标表示与方形网格不同,需要特殊的坐标转换方法。本文使用轴向坐标系统进行表示。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 六边形网格基础
2.1 六边形网格表示方法
六边形网格主要有三种坐标表示方式:
-
轴向坐标系统(Axial Coordinates):
- 使用两个坐标轴(q,r)表示
- 第三个坐标s = -q - r
- 相邻六边形坐标变化为:(+1,0), (+1,-1), (0,-1), (-1,0), (-1,+1), (0,+1)
-
立方体坐标系统(Cube Coordinates):
- 使用三个坐标(q,r,s)表示
- 满足q + r + s = 0
- 距离计算更直观
-
偏移坐标系统(Offset Coordinates):
- 类似方形网格,但需要区分奇偶行/列
- 适合在二维数组中存储
python复制class Hex:
def __init__(self, q, r):
self.q = q # 轴向坐标q
self.r = r # 轴向坐标r
self.s = -q - r # 计算得出的s坐标
def __eq__(self, other):
return self.q == other.q and self.r == other.r
def __add__(self, other):
return Hex(self.q + other.q, self.r + other.r)
def distance_to(self, other):
return (abs(self.q - other.q) +
abs(self.r - other.r) +
abs(self.s - other.s)) // 2
2.2 六边形网格的邻接关系
六边形网格中每个单元格有6个直接相邻的邻居,这使得路径规划更加灵活:
python复制# 六边形六个方向的坐标变化
hex_directions = [
Hex(+1, 0), Hex(+1, -1), Hex(0, -1),
Hex(-1, 0), Hex(-1, +1), Hex(0, +1)
]
def hex_neighbor(hex, direction):
return hex + hex_directions[direction]
3. 四种路径规划算法实现
3.1 A*算法实现
A*算法是路径规划中最常用的启发式搜索算法,在六边形网格中的实现需要考虑:
- 启发式函数选择:
- 可以使用六边形网格距离作为启发函数
- 保证启发函数是admissible的(不高估实际距离)
python复制def a_star_search(start, goal, grid):
frontier = PriorityQueue()
frontier.put(start, 0)
came_from = {}
cost_so_far = {}
came_from[start] = None
cost_so_far[start] = 0
while not frontier.empty():
current = frontier.get()
if current == goal:
break
for neighbor in grid.neighbors(current):
new_cost = cost_so_far[current] + grid.cost(current, neighbor)
if neighbor not in cost_so_far or new_cost < cost_so_far[neighbor]:
cost_so_far[neighbor] = new_cost
priority = new_cost + heuristic(goal, neighbor)
frontier.put(neighbor, priority)
came_from[neighbor] = current
return came_from, cost_so_far
def heuristic(a, b):
return a.distance_to(b)
3.2 遗传算法实现
遗传算法模拟自然选择过程,适用于复杂环境下的路径规划:
-
染色体编码:
- 使用方向序列表示路径
- 每个基因代表一个移动方向(0-5)
-
适应度函数:
- 路径长度
- 是否碰撞障碍物
