A星寻路算法

A星寻路算法

from queue import PriorityQueue

# 定义二维网格
grid = [
    [0, 1, 0, 0, 0],
    [0, 1, 0, 1, 0],
    [0, 0, 0, 0, 0],
    [0, 1, 1, 1, 0],
    [0, 1, 0, 0, 0]
]

# 定义起点和终点
start = (1, 1)
goal = (5, 5)


# 定义A*算法的启发式函数
def heuristic(a, b):
    # 曼哈顿距离作为启发式函数
    return abs(a[0] - b[0]) + abs(a[1] - b[1])


# 获取邻居节点
# 修改邻居节点函数
# 定义起点和终点

# 修改邻居节点函数
def neighbors(grid, current):
    x, y = current
    results = []
    for dx, dy in [(1, 0), (-1, 0), (0, 1), (0, -1)]:  # 右、左、上、下四个方向
        nx, ny = x + dx, y + dy
        if 1 <= nx <= 5 and 1 <= ny <= 5 and grid[ny-1][nx-1] == 0:  # 注意坐标转换
            results.append((nx, ny))
    return results



# 计算移动成本
def cost(current, next):
    return 1  # 假设所有移动的成本都是1


# 实现A*搜索算法
def a_star_search(grid, start, goal):  # 图,开始,目标
    frontier = PriorityQueue()  # 存在这一轮探测过的所有边界方块,它是第一个优先队列
    frontier.put((0, start)) # 存放一个起点
    came_from = {} # 路径来向
    cost_so_far = {} # 当前代价
    came_from[start] = None   # 起点置空
    cost_so_far[start] = 0  # 起点代价设置为0

    # 当优先队列不为空时,循环执行搜索过程
    while not frontier.empty():
        _, current = frontier.get() # 从优先队列中获取当前代价最小的节点

        if current == goal:   # 如果当前节点就是目标节点,则搜索结束
            break

        # 遍历当前节点的所有邻居节点
        for next in neighbors(grid, current):

            # 计算从起点经当前节点到邻居节点的新代价
            new_cost = cost_so_far[current] + cost(current, next)

            # 如果邻居节点不在代价表中,或者新代价更小,则更新代价表
            if next not in cost_so_far or new_cost < cost_so_far[next]:
                cost_so_far[next] = new_cost

                # 计算邻居节点的优先级,以便将其加入优先队列
                priority = new_cost + heuristic(goal, next)
                frontier.put((priority, next))

                # 更新邻居节点的父节点为当前节点
                came_from[next] = current

    # 返回最终的父节点表和代价表,用于重构最短路径
    return came_from, cost_so_far


# 调用A*算法并获取路径
came_from, cost_so_far = a_star_search(grid, start, goal)

# 从终点回溯找到路径
current = goal
path = []
while current != start:
    path.append(current)
    current = came_from[current]
path.append(start)
path.reverse()

# 打印路径
print("找到的路径:", path)

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
A寻路算法(A*算法)是一种常用于解决路径寻找问题的算法,特别适用于在网格图中寻找最短路径。下面是一个使用PHP实现A*算法的简单示例: ```php <?php class Node { public $x; public $y; public $f; public $g; public $h; public $parent; function __construct($x, $y) { $this->x = $x; $this->y = $y; $this->f = 0; $this->g = 0; $this->h = 0; $this->parent = null; } } function astar($start, $goal, $grid) { $open = array(); $closed = array(); $start->g = 0; $start->h = heuristic($start, $goal); $start->f = $start->g + $start->h; array_push($open, $start); while (!empty($open)) { $current = $open[0]; foreach ($open as $node) { if ($node->f < $current->f || ($node->f == $current->f && $node->h < $current->h)) { $current = $node; } } $key = array_search($current, $open); array_splice($open, $key, 1); array_push($closed, $current); if ($current->x == $goal->x && $current->y == $goal->y) { $path = array(); while ($current->parent) { array_push($path, $current); $current = $current->parent; } return array_reverse($path); } $neighbors = getNeighbors($current, $grid); foreach ($neighbors as $neighbor) { $gScore = $current->g + 1; $hScore = heuristic($neighbor, $goal); $fScore = $gScore + $hScore; if (in_array($neighbor, $closed) && $fScore >= $neighbor->f) { continue; } if (!in_array($neighbor, $open) || $fScore < $neighbor->f) { $neighbor->g = $gScore; $neighbor->h = $hScore; $neighbor->f = $fScore; $neighbor->parent = $current; if (!in_array($neighbor, $open)) { array_push($open, $neighbor); } } } } return null; } function heuristic($node, $goal) { return abs($node->x - $goal->x) + abs($node->y - $goal->y); } function getNeighbors($node, $grid) { $neighbors = array(); $offsets = array(array(-1, -1), array(-1, 0), array(-1, 1), array(0, -1), array(0, 1), array(1, -1), array(1, 0), array(1, 1)); foreach ($offsets as $offset) { $x = $node->x + $offset[0]; $y = $node->y + $offset[1]; if ($x >= 0 && $x < count($grid) && $y >= 0 && $y < count($grid[0]) && $grid[$x][$y] != 1) { array_push($neighbors, new Node($x, $y)); } } return $neighbors; } // 测试 $grid = array( array(0, 0, 0, 0), array(1, 1, 0, 1), array(0, 0, 0, 0), array(0, 0, 0, 0) ); $start = new Node(0, 0); $goal = new Node(3, 3); $path = astar($start, $goal, $grid); if ($path) { foreach ($path as $node) { echo "(" . $node->x . ", " . $node->y . ") "; } } else { echo "No Path Found"; } ?> ``` 上述代码实现了A*寻路算法,其中`astar`函数用于执行算法的主要逻辑,`heuristic`函数用于计算启发式函数的值,`getNeighbors`函数用于获取节点的相邻节点。在给定的网格图中,我们从起点`(0, 0)`到目标点`(3, 3)`寻找最短路径。路径的结果将根据节点坐标依次打印出来。若找不到路径,则输出"No Path Found"。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大虾别跑

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值