全路徑搜尋策略

2021-07-05 08:16:05 字數 1284 閱讀 6228

1 為了能重用已有dijkstrasearcher的一些函式,新增乙個類directedgraph繼承自igraph,重寫虛函式。directedgraph中有node類和edge類。node類需要std::vectoraedge_ids欄位,edge類需要unsigned   snode_id;

unsigned   enode_id;

unsigned   direction : 2;

unsigned   weight : 30;

2 傳統dijkstra在reach乙個點時,如果該點是第一次遇到,則將其加入open佇列,如果不是第一次遇到,則看是否能更新最短路徑。

修改後的dijkstra在reach乙個點時,如果是第一次遇到,也是將其加入open佇列:

如果不是第一次遇到,也跟第一次遇到一樣,new乙個reachednode,將其加入open佇列。

傳統dijkstra**裡用乙個hash_map reachednodes來儲存所有reached的點,是為了能快速的通過nodeid得到reachednode結構,作用有兩點:(1)能知道該nodeid現在的路徑是多少,便於在第二次reach該點時判斷是否需要更新路徑長度(2)程式結束時能回溯出最短路徑。

全路徑搜尋裡,對每個node會有多個reachednode,它們裡面儲存的路徑長度,parent資訊不同,因此需要乙個hash_map reachednodes 來儲存。

3為了控制搜尋範圍,用乙個計數器conter來限制每個node被settle的次數。用乙個hashmap來儲存每個點對應的settle次數,如果次數等於counter了,就不再展開該點。

這一點能有效的控制環路。

去掉環路後處理思路。比如到達點a時,發現它的parent是b,如果它已經有是b的記錄了,那麼就只保留乙個就好了。這樣就不會多次從b到a。

這樣是不可行的! 這樣不僅去掉了環路,也去掉了可能需要保留的路徑,比如e到f到b到a和g到h到b到a我們都需要的話,這樣一弄就只有一條了。

4搜尋停止條件

(1)  open隊列為空

(2)      target點settle次數為counter

多方案求路

一種思路:ch碰撞得到的多方案

另一種思路:全搜尋,對所有方案聚類,得出差異度稍大的多方案

如何聚類?

採用kmeans。 定義兩條路徑的距離:1-2*兩條route重複邊長/兩條route長之和

怎麼計算聚類中心呢?簇中心是使其它點到該點的方差和最小的點,由於這裡距離都是正數,因此簡化為距離之和最小。逐個點計算其它點到該點的距離,取和。找出和最小的那個點作為聚類中心。這裡的點就是一條路徑。

1009 安全路徑

題目描述 衛斯理 經常提及外星人,比如藍血人。在土星星球有很多城市,每個城市之間有一條或多條飛行通道,但是並不是所有的路都是很安全的,每一條路有乙個安全係數 s,s 是在 0和1 間的實數 包括0 1 一條從 u 到 v 的通道 p 的安全度為 safe p s e1 s e2 s ek e1,e2...

EPROCESS取程序全路徑

如果檔案被佔坑,使用file read attributes許可權應該能開啟 xp peprocess nt路徑 file handle file object dos路徑 boolean psgetdosname peprocess processobject,punicode string do...

ios 全路徑方法詳解

1 常見的nsfilemanager檔案方法 nsdata contentsatpath path 從乙個檔案讀取資料 bool createfileatpath path contents nsdata data attributes attr 向乙個檔案寫入資料 bool removeitema...