介紹下概念:簡單來說,啟發式搜尋就是對取和不取都做分析,從中選取更優解(或刪去無效解)
所有的啟發式搜尋都會有乙個估價函式。下面是這一題的估價函式。
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 演算法減少了許多計算量,它的效率有了顯著的提高。下面將為你解答上圖中的演算法是如何實現的。正文 搜尋區域介紹 圖中左邊的...