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...