国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

啟發(fā)式搜索 :A*算法詳解

這篇具有很好參考價(jià)值的文章主要介紹了啟發(fā)式搜索 :A*算法詳解。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

A*算法

A*算法,(A-Star)算法是一種靜態(tài)路網(wǎng)中求解最短路徑最有效的直接搜索方法,也是解決許多搜索問題的有效算法。

算法中的距離估算值與實(shí)際值越接近,最終搜索速度越快。

回顧:BFS、Dijkstra

對(duì)于求兩個(gè)點(diǎn)之間的最短路

普通的BFS是按層遍歷的過程,以起點(diǎn)為中心,以到終點(diǎn)的最短路為半徑的整個(gè)圓內(nèi)的所有點(diǎn)都會(huì)被遍歷到

Dijkstra是通過優(yōu)先隊(duì)列進(jìn)行的優(yōu)化,相當(dāng)于一種貪心,正因?yàn)槠浔举|(zhì)是一種貪心,所以選擇的永遠(yuǎn)是局部最優(yōu),也就是選擇的是從起點(diǎn)到當(dāng)前位置的距離的最小值的點(diǎn)來繼續(xù)更新。如果開始的搜索中起始點(diǎn)到該點(diǎn)的代價(jià)很小,但在未來的搜索中,從該目標(biāo)到終點(diǎn)的代價(jià)很大,就可能會(huì)花費(fèi)很大的代價(jià)。也就是說優(yōu)先隊(duì)列優(yōu)化的bfs缺乏對(duì)未來的估計(jì)。

A*算法-估價(jià)函數(shù)

A* 算法是一種啟發(fā)式搜索,根據(jù)估價(jià)函數(shù)+當(dāng)前代價(jià)作為優(yōu)先隊(duì)列的排序標(biāo)準(zhǔn),相當(dāng)于縱觀歷史與預(yù)見未來同時(shí)作用

估價(jià)函數(shù)指的是從當(dāng)前點(diǎn)到終點(diǎn)的代價(jià)的一個(gè)估計(jì)值

估價(jià)函數(shù)的設(shè)計(jì)原則:估值必須比實(shí)際更優(yōu)(估計(jì)代價(jià)<=實(shí)際代價(jià))

  • 如果把好的狀態(tài)估差了,那本來在最優(yōu)解搜索路徑上的狀態(tài)被錯(cuò)誤地估計(jì)了較大的代價(jià),被壓在堆中無法及時(shí)取出,從而導(dǎo)致非最優(yōu)解搜索路徑上的狀態(tài)不斷擴(kuò)展,直至在目標(biāo)狀態(tài)上產(chǎn)生錯(cuò)誤的答案把

  • 如果把壞的狀態(tài)估好了,只要估價(jià)不大于未來實(shí)際代價(jià),這個(gè)值總會(huì)比最優(yōu)解更早地被取出,從而得到修正。最壞后果無非就是算的狀態(tài)多了,跑得慢一些。

所以我們要選擇一個(gè)好的估價(jià)函數(shù),選擇良好的估計(jì)函數(shù)可以使得A*算法的時(shí)間得到縮減,估價(jià)函數(shù)越接近真實(shí)代價(jià),速度越快

當(dāng)估價(jià)函數(shù)等于0,則退化成普通的優(yōu)先隊(duì)列版的bfs

例題:第K短路

思路:

it的最短路作為估價(jià)函數(shù)f(i)

優(yōu)先隊(duì)列就按照當(dāng)前走過的路徑的長(zhǎng)度 + 估計(jì)函數(shù)最小的狀態(tài)去擴(kuò)展

#include <bits/stdc++.h>
using namespace std;

#define endl '\n'
#define inf 0x3f3f3f3f
#define mod7 1000000007
#define mod9 998244353
#define m_p(a,b) make_pair(a, b)
#define mem(a,b) memset((a),(b),sizeof(a))
#define io ios::sync_with_stdio(false)
#define debug(a) cout << "Debuging...|" << #a << ": " << a << "\n";
typedef long long ll;
typedef pair <int,int> pii;
typedef pair<int, pii> piii;

#define MAX 300000 + 50
int n, m, k, x, y, z;
int s, t;

int tot;
int head[MAX];
int rhead[MAX];
struct ran{
    int to, nex, val;
}tr[MAX];
inline void add(int he[], int u, int v, int c){
    tr[++tot].to = v;
    tr[tot].val = c;
    tr[tot].nex = he[u];
    he[u] = tot;
}

int dis[MAX];
bool vis[MAX];
void dijkstra(int s){
    priority_queue<pii, vector<pii>, greater<pii>>q;
    mem(dis, inf);
    q.push(m_p(0, s));dis[s] = 0;
    while (!q.empty()) {
        int u = q.top().second;q.pop();
        if(vis[u])continue;
        vis[u] = 1;
        for(int i = rhead[u]; i; i = tr[i].nex){
            int v = tr[i].to;
            if(dis[v] > dis[u] + tr[i].val){
                dis[v] = dis[u] + tr[i].val;
                q.push(m_p(dis[v], v));
            }
        }
    }
}

int num[MAX];
void Astar(){
    priority_queue<piii, vector<piii>, greater<piii> >q;
    q.push(m_p(dis[s], m_p(0, s)));
    while (!q.empty()) {
        auto [d, u] = q.top().second;q.pop();
        ++num[u];
        if(num[t] == k){
            cout << d << endl;
            return;
        }
        if(num[u] > k)continue;
        for(int i = head[u]; i; i = tr[i].nex){
            int v = tr[i].to;
            q.push(m_p(dis[v] + d + tr[i].val, m_p(d + tr[i].val, v)));
        }
    }
    cout << -1 << endl;
}

void work(){
    cin >> n >> m;
    for(int i = 1; i <= m; ++i){
        cin >> x >> y >> z;
        add(head, x, y, z);
        add(rhead, y, x, z);
    }
    cin >> s >> t >> k;
    if(s == t)++k;
    dijkstra(t);
    Astar();
}


int main(){
    io;
    work();
    return 0;
}

經(jīng)驗(yàn)之談

對(duì)于有向圖,則建反圖求以終點(diǎn)為起點(diǎn)的最短路為估價(jià)函數(shù)

對(duì)于網(wǎng)格形式的圖,有以下這些啟發(fā)函數(shù)可以使用:文章來源地址http://www.zghlxwxcb.cn/news/detail-403678.html

  • 如果圖形中只允許朝上下左右四個(gè)方向移動(dòng),則可以使用曼哈頓距離。
    • 曼哈頓距離: ∣ x 1 ? x 2 ∣ + ∣ y 1 ? y 2 ∣ |x_1-x_2|+|y_1-y_2| x1??x2?+y1??y2?
  • 如果圖形中允許朝八個(gè)方向移動(dòng),則可以使用對(duì)角距離。
    • 對(duì)角距離: 2 ? m i n ( ∣ x 1 ? x 2 ∣ , ∣ y 1 ? y 2 ∣ ) + ∣ x 1 ? x 2 ∣ + ∣ y 1 ? y 2 ∣ \sqrt{2}*min(|x_1-x_2|,|y_1-y_2|)+|x_1-x_2|+|y_1-y_2| 2 ??min(x1??x2?,y1??y2?)+x1??x2?+y1??y2?
  • 如果圖形中允許朝任何方向移動(dòng),則可以使用歐幾里得距離。
    • 歐幾里得距離: ( x 1 ? x 2 ) 2 + ( y 1 ? y 2 ) 2 \sqrt{(x_1-x_2)^2+(y_1-y_2)^2} (x1??x2?)2+(y1??y2?)2 ?

到了這里,關(guān)于啟發(fā)式搜索 :A*算法詳解的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 啟發(fā)式算法之灰狼優(yōu)化算法

    啟發(fā)式算法之灰狼優(yōu)化算法

    蟻群算法?禿鷹算法?布谷鳥算法?魚群算法?猴群算法?這都是些啥? 這些算法聽起來都很接地氣,實(shí)際上也確實(shí)很接地氣。它們都是學(xué)者通過觀察動(dòng)物們的行為得到的靈感,從而設(shè)計(jì)出來的精彩的算法。以動(dòng)物命名的算法可遠(yuǎn)不止這些,比如還有蜂群算法、狼群算法、蝙

    2024年02月13日
    瀏覽(19)
  • 【啟發(fā)式算法】灰狼優(yōu)化算法【附python實(shí)現(xiàn)代碼】

    【啟發(fā)式算法】灰狼優(yōu)化算法【附python實(shí)現(xiàn)代碼】

    寫在前面: 首先感謝兄弟們的訂閱,讓我有創(chuàng)作的動(dòng)力,在創(chuàng)作過程我會(huì)盡最大能力,保證作品的質(zhì)量,如果有問題,可以私信我,讓我們攜手共進(jìn),共創(chuàng)輝煌。 路雖遠(yuǎn),行則將至;事雖難,做則必成。只要有愚公移山的志氣、滴水穿石的毅力,腳踏實(shí)地,埋頭苦干,積跬

    2024年02月16日
    瀏覽(25)
  • 元啟發(fā)式算法庫 MEALPY 初體驗(yàn)-遺傳算法為例

    元啟發(fā)式算法庫 MEALPY 初體驗(yàn)-遺傳算法為例

    官網(wǎng): MealPY官網(wǎng) 開源許可: (GPL) V3 MEALPY (MEta-heuristic ALgorithms in PYthon) 是一個(gè)提供最新自然啟發(fā)式元啟發(fā)算法的Python模塊,它是最大的此類Python模塊之一。這些算法模仿自然界中的成功過程,包括生物系統(tǒng)以及物理和化學(xué)過程。mealPy 的目標(biāo)是免費(fèi)向所有人分享元啟發(fā)領(lǐng)域的知識(shí)

    2024年04月11日
    瀏覽(20)
  • 數(shù)學(xué)啟發(fā)式

    優(yōu)化求解器 | Gurobi 數(shù)學(xué)啟發(fā)式算法:參數(shù)類型與案例實(shí)現(xiàn) 數(shù)學(xué)啟發(fā)式算法 | 可行性泵 (Feasibility Pump)算法精講:一份讓您滿意的【理論介紹+編程實(shí)現(xiàn)+數(shù)值實(shí)驗(yàn)】學(xué)習(xí)筆記(Python+Gurobi實(shí)現(xiàn)) 大佬到底是大佬!這些資料太適合我這種沒基礎(chǔ)的人了! 數(shù)學(xué)啟發(fā)式(Mathematical Heurist

    2024年02月04日
    瀏覽(20)
  • 【圖論】樹上啟發(fā)式合并

    【圖論】樹上啟發(fā)式合并

    本篇博客參考: Oi Wiki 樹上啟發(fā)式合并 算法學(xué)習(xí)筆記(86): 樹上啟發(fā)式合并 首先,什么是 啟發(fā)式合并 ? 有人將其稱為“優(yōu)雅的暴力”,啟發(fā)式合并就是在合并兩個(gè)部分的時(shí)候,將內(nèi)容少的部分合并至內(nèi)容多的部分,減少合并的操作時(shí)間 樹上啟發(fā)式合并(dsu on tree) 可以被用

    2024年04月15日
    瀏覽(22)
  • 樹上啟發(fā)式合并(dsu on tree)

    dsu on tree dsu text{dsu} dsu 一般指 disjoint?set?union text{disjoint set union} disjoint?set?union ,即并查集。 dsu?on?tree text{dsu on tree} dsu?on?tree 指樹上合并與查詢操作,但它的實(shí)現(xiàn)和普通的并查集并無關(guān)聯(lián),兩者的共同點(diǎn)僅僅在于都能合并集合和查詢而已。 dsu?on?tree text{dsu on tree} d

    2024年02月16日
    瀏覽(20)
  • 【論文閱讀】聚集多個(gè)啟發(fā)式信號(hào)作為監(jiān)督用于無監(jiān)督作文自動(dòng)評(píng)分

    【論文閱讀】聚集多個(gè)啟發(fā)式信號(hào)作為監(jiān)督用于無監(jiān)督作文自動(dòng)評(píng)分

    本文提出一個(gè)新的無監(jiān)督的AES方法ULRA,它不需要真實(shí)的作文分?jǐn)?shù)標(biāo)簽進(jìn)行訓(xùn)練; ULRA的核心思想是使用多個(gè)啟發(fā)式的質(zhì)量信號(hào)作為偽標(biāo)準(zhǔn)答案,然后通過學(xué)習(xí)這些質(zhì)量信號(hào)的聚合來訓(xùn)練神經(jīng)自動(dòng)評(píng)分模型。 為了將這些不一致的質(zhì)量信號(hào)聚合為一個(gè)統(tǒng)一的監(jiān)督信號(hào),我們將自動(dòng)

    2024年02月16日
    瀏覽(28)
  • 如何進(jìn)行測(cè)試分析與設(shè)計(jì)-HTSM啟發(fā)式測(cè)試策略模型 | 京東云技術(shù)團(tuán)隊(duì)

    如何進(jìn)行測(cè)試分析與設(shè)計(jì)-HTSM啟發(fā)式測(cè)試策略模型 | 京東云技術(shù)團(tuán)隊(duì)

    測(cè)試,沒有分析與設(shè)計(jì)就失去了靈魂; 測(cè)試人員在編寫用例之前,該如何進(jìn)行測(cè)試分析與設(shè)計(jì)呢?上次在《測(cè)試的底層邏輯》中講到了【輸入輸出測(cè)試模型】,還講到了【2W+1H測(cè)試分析法】,但2W1H分析法是初步的分析方法,具體在測(cè)試中如何落地,還需要更細(xì)的設(shè)計(jì)。 今天

    2024年02月05日
    瀏覽(23)
  • 【無碼專區(qū)1】簡(jiǎn)單路徑的第二大邊權(quán)(啟發(fā)式合并+最小生成樹)

    只有std,沒有自我實(shí)現(xiàn),所以叫做無碼專區(qū) description 給一張無向圖,多次詢問,每次詢問兩個(gè)點(diǎn)之間所有簡(jiǎn)單路徑(不重復(fù)經(jīng)過點(diǎn))中邊權(quán)第二大(不是嚴(yán)格第二大)的權(quán)值的最小值。 數(shù)據(jù)范圍: 1 0 5 10^5 1 0 5 級(jí)別 我的想法 前 50 % 50% 5 0 % 的數(shù)據(jù) q , n ≤ 1 0 3 , m ≤ 2 × 1 0

    2024年02月08日
    瀏覽(24)
  • Codeforces Round 890 (Div. 2) D. More Wrong(交互題 貪心/啟發(fā)式 補(bǔ)寫法)

    Codeforces Round 890 (Div. 2) D. More Wrong(交互題 貪心/啟發(fā)式 補(bǔ)寫法)

    題目 t(t=100)組樣例,長(zhǎng)為n(n=2000)的序列 交互題,每次你可以詢問一個(gè)區(qū)間[l,r]的逆序?qū)?shù),代價(jià)是 要在的代價(jià)內(nèi)問出最大元素的位置,輸出其位置 思路來源 neal Codeforces Round 890 (Div. 2) supported by Constructor Institute D (交互+分治) 附加強(qiáng) - 知乎 題解 賽中開題順序大失敗沒看這個(gè)

    2024年02月14日
    瀏覽(15)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包