分享免费的编程资源和教程

网站首页 > 技术教程 正文

智能算法导论 第十八章 A*算法 智能算法设计

goqiw 2024-10-25 13:01:51 技术教程 17 ℃ 0 评论

最短路径搜索是指在一个图中,找到从起点到终点的最短路径。其中,A*算法是一种常用的最短路径搜索算法,它结合了Dijkstra算法和贪心算法的优点,能够在保证最优解的同时,尽可能地减少搜索空间。

A*算法的原理是,在搜索过程中,维护一个open列表和一个closed列表。open列表中存储了待搜索的节点,closed列表中存储了已经搜索过的节点。每次从open列表中取出一个节点进行扩展,然后将其加入closed列表。扩展节点时,需要计算该节点到终点的估价函数值,即f(n) = g(n) + h(n),其中g(n)表示从起点到该节点的实际代价,h(n)表示该节点到终点的估计代价。通过计算f(n)值,可以选择最优的节点进行扩展。

下面是一个简单的A*算法案例,用于在一个迷宫中找到从起点到终点的最短路径:

  1. 将起点加入open列表,并将其f值设为0。
  2. 从open列表中取出f值最小的节点进行扩展。
  3. 对该节点周围的节点进行扩展,计算它们的f值,并加入open列表。
  4. 将该节点加入closed列表。
  5. 重复步骤2~4,直到找到终点或者open列表为空。

A*算法的优势在于它能够在保证最优解的同时,尽可能地减少搜索空间,因此在处理大规模问题时效率较高。缺点在于,它需要预先估计每个节点到终点的代价,如果估计不准确,可能会导致搜索结果不理想。

下面是一个用Python实现A*算法的例子,用于在一个迷宫中找到从起点到终点的最短路径:

import heapq

class Node:
    def __init__(self, x, y, g=0, h=0):
        self.x = x
        self.y = y
        self.g = g
        self.h = h
    
    def __lt__(self, other):
        return self.g + self.h < other.g + other.h

def astar(maze, start, end):
    rows, cols = len(maze), len(maze[0])
    open_list = [Node(start[0], start[1])]
    closed_list = set()
    while open_list:
        curr = heapq.heappop(open_list)
        if (curr.x, curr.y) == end:
            path = [(curr.x, curr.y)]
            while curr.parent:
                curr = curr.parent
                path.append((curr.x, curr.y))
            return path[::-1]
        closed_list.add((curr.x, curr.y))
        for dx, dy in [(0, 1), (0, -1), (1, 0), (-1, 0)]:
            x, y = curr.x + dx, curr.y + dy
            if 0 <= x < rows and 0 <= y < cols and maze[x][y] != 1 and (x, y) not in closed_list:
                g = curr.g + 1
                h = abs(x - end[0]) + abs(y - end[1])
                node = Node(x, y, g, h)
                node.parent = curr
                heapq.heappush(open_list, node)
    return None

maze = [
    [0, 0, 0, 0, 0],
    [0, 1, 1, 0, 0],
    [0, 0, 0, 0, 0],
    [0, 1, 0, 0, 0],
    [0, 0, 0, 1, 0],
]
start = (0, 0)
end = (4, 4)
path = astar(maze, start, end)
print(path)

在上面的例子中,我们定义了一个Node类,用于表示搜索过程中的节点。在搜索过程中,我们使用一个open列表和一个closed列表来维护搜索状态。使用heapq模块来实现open列表,可以保证每次从open列表中取出的节点都是f值最小的节点。在扩展节点时,我们通过计算g和h值来计算f值,并将新节点加入open列表。最后,如果找到终点,我们可以通过遍历节点的parent指针来得到最短路径。

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表