创新实训团队记录:为BR-MTC问题设计一个近似算法
創新實訓團隊記錄 : 為BR-MTC問題設計近似算法
- 閱讀書籍和論文
- 近似算法設計思路變化總結
- 算法框架
- 改變初始頂點集
- 繼續添加路徑,作為新的初始頂點集
- 程序驗證
- 近似解與最優解存在差距&&優化后的近似解比優化前更逼近最優解
- 構建最優解已知的圖
- 比較最優解和近似解(優化前、后)
- 優化效果在什么時候達到最好
閱讀書籍和論文
《computational complexity》
- chapter 1、2 P versus NP(季煒丹)
《approximate algorithms》
- chapter 1 Introduction 近似比、最大匹配和最小點覆蓋(季煒丹)
- chapter 2 Set Cover 分層技術求解頂點覆蓋問題(劉忠航)
- chapter 3 Steiner Tree and TSP 斯坦納樹和旅行商問題(孫凡雯)
- chapter 4 Multiway Cut and k-Cut 最小割和K割問題(黃舒漪)
- chapter 5 k-center k-中心問題(季煒丹)
- chapter 6 Feedback Vertex Set 反饋頂點集問題(劉忠航)
- chapter 7 Shortest Superstring 最短超串問題(孫凡雯)
- chapter 8 Knapsack 背包問題的多項式時間近似解(黃舒漪)
“A 2+ε approximation algorithm for the k-MST problem”
近似算法設計思路變化總結
算法框架
- 1). 輸入:輸入一個給定的加權無向圖 G=(V,E)G=(V,E)G=(V,E) ,在圖的結點中給定一個根結點r∈Vr \in Vr∈V,并且給定一個最大的預算范圍B
- 2). 初始化:Vnew=V_{new}=Vnew?= {rrr}, Enew=E_{new}=Enew?= { }為空;
- 3). 重復下列操作,直到Vnew=VV_{new}=VVnew?=V:
- a. 在集合E中選取權值最小的邊<u,v><u,v><u,v>,其中uuu為集合VnewV_{new}Vnew? 中的元素,而vvv不在集合VnewV_{new}Vnew? 當中,并且v∈Vv \in Vv∈V(如果存在有多條滿足前述條件即具有相同權值的邊,則可任意選取其中之一);
- b.將vvv加入集合VnewV_{new}Vnew?中,將<u,v><u,v><u,v>邊加入集合EnewE_{new}Enew?中;
- c.將集合EnewE_{new}Enew?中的邊權值相加,未超過B則返回步驟a;超過B,則將新加入的邊移出集合EnewE_{new}Enew?中,跳出循環;
- 4). 輸出:使用集合VnewV_{new}Vnew?和EnewE_{new}Enew?來描述所得到的包含根節點r的子樹。
改變初始頂點集
優化步驟2). 初始化:Vnew=V_{new}=Vnew?= {rrr}, Enew=E_{new}={ }Enew?=為空
優化:分成兩步
- 一、計算根節點rrr到其他所有節點的最短路徑,得到n?1n-1n?1條最短路徑,每一條最短路徑的頂點集和邊集用Vshortest,EshortestV_{shortest},E_{shortest}Vshortest?,Eshortest?;
- 二、基于初態頂點集VshortestV_{shortest}Vshortest?、邊集EshortestE_{shortest}Eshortest?找子樹,對比子樹頂點數,選取最優子樹
一、計算根節點rrr到其他所有節點的最短路徑,得到n?1n-1n?1條最短路徑,每一條最短路徑的頂點集和邊集用Vshortest,EshortestV_{shortest},E_{shortest}Vshortest?,Eshortest?;
- 1). 將根節點rrr作為初始點,看作一個集合,其他n?1n-1n?1個點看作一個集合;
- 2). 根據初始點,求出其它點到初始點的距離d[i]d[i]d[i](若相鄰,則d[i]d[i]d[i]為邊權值;若不相鄰,則d[i]d[i]d[i]為∞\infty∞)
- 3). 選取最小的d[i]d[i]d[i]加入EshortestE_{shortest}Eshortest?(記為d[x]d[x]d[x]),并將此d[i]d[i]d[i]邊對應的點(記為xxx)加入集合VshortestV_{shortest}Vshortest?;
- 4). 再根據xxx,更新跟 xxx 相鄰點 yyy的 d[y]d[y]d[y]值:d[y]=mind[y]=mind[y]=min{d[y],d[x]+w[x][y]d[y],d[x]+w[x][y]d[y],d[x]+w[x][y]},即松弛操作;
- 5). 重復3)、4),直到所有頂點都在集合VshortestV_{shortest}Vshortest?內,d[i]d[i]d[i]即為一條最短路徑;
二、基于初始頂點集VshortestV_{shortest}Vshortest?找子樹,對比子樹頂點數,選取最優子樹
- 1). 對于每一條最短路徑得到的初始頂點集VshortestV_{shortest}Vshortest?和初始邊集EshortestE_{shortest}Eshortest?,我們進行之前找子樹的操作,共n?1n-1n?1次循環,得到n?1n-1n?1棵子樹;
- 2). 比較n?1n-1n?1棵子樹的頂點數,選擇最多頂點數的子樹,作為我們的輸出結果
繼續添加路徑,作為新的初始頂點集
我們認為對于步驟2),仍可以繼續優化。
目前我們已經有n?1n-1n?1條最短路徑作為n?1n-1n?1個初始頂點集,基于不同的頂點集得到不同的子樹,得到n?1n-1n?1棵子樹,選擇n?1n-1n?1棵子樹中頂點數最多的作為輸出結果;我們可以添加其他的路徑作為新的初始頂點集,如果基于這種頂點集得到的子樹頂點數更多,我們就達到了優化效果。
至于,選擇添加怎樣的路徑作為新的初始頂點集,我們提供了一種思路。
- 我們選擇某些“具有代表性”的點,構成集合VrepresentV_{represent}Vrepresent?;如何選擇:
- 1). 我們設置參數:大邊值bigdisbigdisbigdis,邊數numnumnum,小邊值smalldissmalldissmalldis;
- 2). 先遍歷所有邊找到weight≥bigdisweight≥bigdisweight≥bigdis的邊;放在集合EbigE_{big}Ebig?;
- 3). 遍歷集合EbigE_{big}Ebig?中所有邊的左右端點,放在集合VbigV_{big}Vbig?;
- 4). 遍歷集合VbigV_{big}Vbig?中所有點的所有“覆蓋”的邊,如果對于集合中的一個點vvv,所有“覆蓋”的邊中weight≤smalldisweight≤smalldisweight≤smalldis的邊數超過numnumnum,那么我們將這個點vvv加入集合VrepresentV_{represent}Vrepresent?;
- 將根節點rrr加入集合VrepresentV_{represent}Vrepresent?,計算集合VrepresentV_{represent}Vrepresent?內所有頂點的steiner tree,形成初始頂點集VrepresentV_{represent}Vrepresent?和初始邊集ErepresentE_{represent}Erepresent?
程序驗證
近似解與最優解存在差距&&優化后的近似解比優化前更逼近最優解
BR-MTC問題,顯然,當 BBB等于圖 GGG 最小生成樹的權重之和時,該最小生成樹是該問題的解。而當預算BBB 是作為問題輸入給定的一個新參數,這使問題具有了 NPNPNP 性。當P≠NPP \neq NPP?=NP 成立時,對于該類問題,不存在多項式時間內求得精確解的算法。
但是我們需要用程序驗證,最優解和近似解的差距,于是我們在這里考慮逆向思維。我們通過構造出最優解已知的圖,基于這樣的圖運行近似算法。
構建最優解已知的圖
- 1). 給定參數V、EV、EV、E,最大權值maxCostmaxCostmaxCost,障礙分支個數hhh;
- 2). 計算出一個障礙分支所需要的點數v1v1v1和邊數e1e1e1,(我們定義下圖為障礙分支),藍色部分為(v2,e2)(v2,e2)(v2,e2);
- 3). 根據剩余的頂點數v’=V?v1v’=V-v1v’=V?v1和e’=E?e1e’=E-e1e’=E?e1,隨機生成圖G=(v’,e’)G=(v’,e’)G=(v’,e’),并求出圖GGG的最小生成樹,最小生成樹的耗費加上障礙分支(藍色部分)的耗費(即e2e2e2)為障礙圖的預算;
- 4). 最小生成樹上加入障礙分支,得到障礙圖G’=(v’+v1?h,e’+e1?h)G’=(v’+v1*h,e’+e1*h)G’=(v’+v1?h,e’+e1?h),輸出障礙圖G’G’G’,預算B’B’B’;
- 5). 此時,最優解就是v’+v2?hv’+v2*hv’+v2?h
比較最優解和近似解(優化前、后)
從下圖可以看出:
- 1). 紅色線與綠、藍色線存在差距,即最優解與近似解存在差距;
- 2). 綠色線是優化后的近似解,永遠在藍色線上方,甚至有時候與紅色線重合;即優化后得到的近似解比優化前得到的近似解更加接近最優解;
以上兩點都符合我們的預期。
以下是舉幾個例子:
優化效果在什么時候達到最好
給定頂點500-1500,間隔100,預算為400,500,600,700;縱坐標是優化前后的頂點數差值,即優化效果的直觀體現
- 1). 當頂點數為800時,預算400的紅色線優化效果較好;
- 2). 當頂點數為1200時,預算600的綠色線優化效果較好;
- 3). 當頂點數為1400時,預算700的黃色線優化效果較好;
可以看出,預算與頂點數的比值在50%左右,優化效果最好
總結
以上是生活随笔為你收集整理的创新实训团队记录:为BR-MTC问题设计一个近似算法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: leetcode-简单题-题序:9+13
- 下一篇: 创新实训个人记录:metric k-ce