啟發式搜尋練習 更新中

2022-01-10 11:00:29 字數 1387 閱讀 4393

介紹下概念:簡單來說,啟發式搜尋就是對取和不取都做分析,從中選取更優解(或刪去無效解)

所有的啟發式搜尋都會有乙個估價函式。下面是這一題的估價函式。

const int n = 105;

struct node node[n];

int f(int t, int v) else

return (int)(tot + v * node[t + i].f);

return tot;

}

那麼估價函式是什麼呢?我們都知道,揹包問題的最基礎的思路是o(2^n)。乙個狀態有兩種決策,分別是取和不取,那麼,我們在取的時候判斷一下是不是超過了體積,在不取的時候判斷一下,如果,我不取這個,那麼,剩下的所有的價值+現有的價值有沒有大於我所找到的目前的最優解,如果沒有,不取是沒有意義的。聽不懂?沒關係。我們先上核心**。

void work(int t, int p, int v)
假設,我現在的最優解是2,如果我不取這個物品,所能得到的估價比這個小,說明不取是沒有意義的,因為就算你剩下的全部取了都不是最優解。那麼,估價有沒有可能估小了呢?不可能。

bool operator <(const node &a,const node &b)

sort(node+1,node+1+n);

上面這段**就保證了不可能估小。以及,我們在估價時,不管它到底可不可以放進去,只有揹包有空間,就放,而放的價值就是單位價值:

node[i].f=1.0 * node[i].b / node[i].a
好的,我們現在就放出完整**。

#include #include // heuristic-search 啟發式搜尋

using namespace std;

const int n = 105;

int m, t, ans;

struct node node[n];

bool operator<(node p, node q) ;

// f 估價函式 time限制下,不取idx,去i[dx+1,m]的剩餘總價值,

int f(int idx, int time) else

return (int) (tot + time * node[idx + i].f);

return tot;

}void dfs(int idx, int time, int v)

int main()

sort(node + 1, node + m + 1);

dfs(1, t, 0);

cout << ans << endl;

return 0;

}

啟發式搜尋

啟發式搜尋 heuristically search 又稱為有資訊搜尋 informed search 它是利用問題擁有的啟發資訊來引導搜尋,達到減少搜尋範圍 降低問題複雜度的目的,這種利用啟發資訊的搜尋過程稱為啟發式搜尋。例題 八數碼問題 運用優先佇列,根據目前已經確定的位置算出目前的價值,並匯入...

啟發式搜尋

啟發式搜尋 啟發式搜尋就是在狀態空間中的搜尋對每乙個搜尋的位置進行評估,得到最好的位置,再從這個位置進行搜尋直到目標。這樣可以省略大量無謂的搜尋路徑,提高了效率。在啟發式搜尋中,對位置的估價是十分重要的。採用了不同的估價可以有不同的效果。在啟發式搜尋中,我們每次找到當前 最有希望是最短路徑 的狀態進...

ACM 啟發式搜尋

開篇 這篇文章介紹找最短路徑的一種演算法,它的字我比較喜歡 啟發式搜尋。這是用一般的搜素方法,類似窮舉的效果 下面的圖是用a 搜素的效果,也就是本文要介紹的演算法。可以看出,用a 演算法減少了許多計算量,它的效率有了顯著的提高。下面將為你解答上圖中的演算法是如何實現的。正文 搜尋區域介紹 圖中左邊的...