路徑規劃常用算法

一、最短路徑算法

最短路徑是指從起點到終點距離最短的路徑。在路徑規劃中,最短路徑算法是最基本的算法之一。最短路徑算法主要分為兩類:單源最短路徑和多源最短路徑。單源最短路徑是指從一個給定的起點到其他所有點的最短路徑。常見的單源最短路徑算法有:

1. Dijkstra算法

function Dijkstra(graph, start, end):
    dist = {start: 0}
    queue = [start]
    while queue:
        vertex = queue.pop(0)
        for neighbor in graph[vertex].keys():
            path = dist[vertex] + graph[vertex][neighbor]
            if neighbor not in dist or path < dist[neighbor]:
                dist[neighbor] = path
                if neighbor == end:
                    return dist[end]
                queue.append(neighbor)
    return -1

Dijkstra算法可以求解從單個源點出發到其他所有節點的最短路徑問題,但該算法要求必須所有邊的權值必須非負,並且求得的最短路徑不一定是全局最優解。

2. Bellman-Ford算法

function BellmanFord(graph, start, end):
    dist = {start: 0}
    for i in range(len(graph) - 1):
        for u in graph.keys():
            for v in graph[u].keys():
                if dist.get(v, float('inf')) > dist[u] + graph[u][v]:
                    dist[v] = dist[u] + graph[u][v]
    for u in graph.keys():
        for v in graph[u].keys():
            if dist.get(v, float('inf')) > dist[u] + graph[u][v]:
                return -1
    return dist[end]

Bellman-Ford算法可處理具有負權邊的圖,並且可以檢測負環。時間複雜度高於Dijkstra算法,通常用於處理邊權為負數的情況。

3. A*算法

function AStar(graph, start, end, heuristic):
    closed = set()
    open = {start: 0}
    came_from = {}
    g_score = {start: 0}
    f_score = {start: heuristic(start, end)}
    while open:
        current = min(open, key=open.get)
        if current == end:
            return reconstruct_path(came_from, end)
        del open[current]
        closed.add(current)
        for neighbor in graph[current].keys():
            if neighbor in closed:
                continue
            tentative_g_score = g_score[current] + graph[current][neighbor]
            if neighbor not in open or tentative_g_score < g_score[neighbor]:
                came_from[neighbor] = current
                g_score[neighbor] = tentative_g_score
                f_score[neighbor] = tentative_g_score + heuristic(neighbor, end)
                if neighbor not in open:
                    open[neighbor] = f_score[neighbor]
    return -1

A*算法是一種啟發式搜索算法,可以快速找到單源最短路徑。該算法使用估價函數來評估節點離目標節點的距離,並將已知最短路徑從起點到此節點的代價視為g(x),並將估計到達目標節點的最短距離視為h(x),利用f(x) = g(x) + h(x)來評價節點x。

二、最小生成樹算法

最小生成樹是指包含了給定的無向圖中所有節點的生成樹,並且樹上所有邊的邊權之和最小。最小生成樹算法主要包括:

1. Kruskal算法

function Kruskal(graph):
    mst = []
    sets = {i: {i} for i in graph.keys()}
    edges = [(i, j, weight) for i in graph.keys() for j, weight in graph[i].items() if i < j]
    edges.sort(key=lambda x: x[2])
    for edge in edges:
        u, v, weight = edge
        if sets[u] != sets[v]:
            mst.append(edge)
            sets[u] |= sets[v]
            sets[v] = sets[u]
    return mst

Kruskal算法是一種基於貪心的算法,每一步都選擇當前能夠加入最小生成樹的邊,直到得到一棵生成樹為止。

2. Prim算法

function Prim(graph):
    mst = []
    closed = set([next(iter(graph.keys()))])
    while len(closed) < len(graph):
        min_edge = (None, None, float('inf'))
        for u in closed:
            for v, weight in graph[u].items():
                if v not in closed and weight < min_edge[2]:
                    min_edge = (u, v, weight)
        mst.append(min_edge)
        closed.add(min_edge[1])
    return mst

Prim算法是一種從定點出發的算法,從當前已經選擇進入最小生成樹的節點出發尋找到未覆蓋節點的最短路徑,並將這條最短路徑的另一個節點加入集合中。

三、最短路搜索算法

最短路搜索算法是在給定的地圖上尋找最短路徑的算法,常用於自動駕駛、路徑規劃等應用場景。最短路搜索算法包括:

1. BFS算法

function BFS(graph, start, end):
    queue = [(start, [start])]
    visited = set()
    while queue:
        (vertex, path) = queue.pop(0)
        if vertex == end:
            return path
        if vertex in visited:
            continue
        visited.add(vertex)
        for neighbor in graph[vertex].keys():
            if neighbor not in visited:
                queue.append((neighbor, path + [neighbor]))
    return -1

BFS算法是一種廣度優先搜索算法,每一次搜索都會先遍歷當前節點的所有相鄰節點,再遍歷相鄰節點的所有相鄰節點,依次擴散,直到找到目標節點為止。

2. DFS算法

function DFS(graph, start, end):
    stack = [(start, [start])]
    visited = set()
    while stack:
        (vertex, path) = stack.pop()
        if vertex == end:
            return path
        if vertex in visited:
            continue
        visited.add(vertex)
        for neighbor in graph[vertex].keys():
            if neighbor not in visited:
                stack.append((neighbor, path + [neighbor]))
    return -1

DFS算法是一種深度優先搜索算法,每次搜索都會儘可能遞歸地深入到當前節點的子節點,直到達到目標節點或者無法逆行的終點為止。

原創文章,作者:XALXB,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/371987.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
XALXB的頭像XALXB
上一篇 2025-04-23 18:08
下一篇 2025-04-23 18:08

相關推薦

  • 如何查看Anaconda中Python路徑

    對Anaconda中Python路徑即conda環境的查看進行詳細的闡述。 一、使用命令行查看 1、在Windows系統中,可以使用命令提示符(cmd)或者Anaconda Pro…

    編程 2025-04-29
  • 蝴蝶優化算法Python版

    蝴蝶優化算法是一種基於仿生學的優化算法,模仿自然界中的蝴蝶進行搜索。它可以應用於多個領域的優化問題,包括數學優化、工程問題、機器學習等。本文將從多個方面對蝴蝶優化算法Python版…

    編程 2025-04-29
  • Python實現爬樓梯算法

    本文介紹使用Python實現爬樓梯算法,該算法用於計算一個人爬n級樓梯有多少種不同的方法。 有一樓梯,小明可以一次走一步、兩步或三步。請問小明爬上第 n 級樓梯有多少種不同的爬樓梯…

    編程 2025-04-29
  • Python 常用數據庫有哪些?

    在Python編程中,數據庫是不可或缺的一部分。隨着互聯網應用的不斷擴大,處理海量數據已成為一種趨勢。Python有許多成熟的數據庫管理系統,接下來我們將從多個方面介紹Python…

    編程 2025-04-29
  • AES加密解密算法的C語言實現

    AES(Advanced Encryption Standard)是一種對稱加密算法,可用於對數據進行加密和解密。在本篇文章中,我們將介紹C語言中如何實現AES算法,並對實現過程進…

    編程 2025-04-29
  • Harris角點檢測算法原理與實現

    本文將從多個方面對Harris角點檢測算法進行詳細的闡述,包括算法原理、實現步驟、代碼實現等。 一、Harris角點檢測算法原理 Harris角點檢測算法是一種經典的計算機視覺算法…

    編程 2025-04-29
  • 數據結構與算法基礎青島大學PPT解析

    本文將從多個方面對數據結構與算法基礎青島大學PPT進行詳細的闡述,包括數據類型、集合類型、排序算法、字符串匹配和動態規劃等內容。通過對這些內容的解析,讀者可以更好地了解數據結構與算…

    編程 2025-04-29
  • 瘦臉算法 Python 原理與實現

    本文將從多個方面詳細闡述瘦臉算法 Python 實現的原理和方法,包括該算法的意義、流程、代碼實現、優化等內容。 一、算法意義 隨着科技的發展,瘦臉算法已經成為了人們修圖中不可缺少…

    編程 2025-04-29
  • 神經網絡BP算法原理

    本文將從多個方面對神經網絡BP算法原理進行詳細闡述,並給出完整的代碼示例。 一、BP算法簡介 BP算法是一種常用的神經網絡訓練算法,其全稱為反向傳播算法。BP算法的基本思想是通過正…

    編程 2025-04-29
  • 粒子群算法Python的介紹和實現

    本文將介紹粒子群算法的原理和Python實現方法,將從以下幾個方面進行詳細闡述。 一、粒子群算法的原理 粒子群算法(Particle Swarm Optimization, PSO…

    編程 2025-04-29

發表回復

登錄後才能評論