雙調旅程問題算法描述

一、問題介紹:

歐幾里得旅行商問題是指:對於給定平面上的n個點,確定一條連接各點的、閉合的最短曲線這個問題是NP完全問題。Bitonic旅行路線問題是歐幾里得旅行商問題的簡化,這種旅行路線從最左邊開始,嚴格地由左至右到最右邊的點,然後再嚴格的由右至左回到開始點,求最短的路徑長度。設計一個確定最優Bitonic旅行路線的O(n2 )時間算法。假設不存在x座標相同的點。

 

二、算法分析:

 

根據題意,首先將給定的n個點{p1 ,p2 ,…,pn }按x座標的升序排列。在這裏,我採用了快速排序算法,時間複雜度爲O(nlogn)。對排好序的n個點進行分析很容易知道p1 是最左側的點,pn 是最右側的點。

下面刻畫最優解的結構:首先定義路徑Pi,j (i<=j),對於路徑Pi,j 來說,它包含的點爲p1 ,p2 ,..pj 。其中pi 點爲起始點,pi,j 表示從pi 點開始走,一直向左走到p1 然後從p1 點沿不同的路徑向右走直到pj 。其次,定義數組d[i,j]表示pi,j 路徑上的最小Bitonic路線。很容易看出,題目所求的即是d[n,n]。題目的最優解爲d[n,n],此時,分析當pn 點未連通的情況。因爲點是排好序的,而且根據題意中的嚴格方向的要求,可以知道pn 點必有一側是跟pn-1 點相連的,那麼此時d[n-1,n]應該爲pn-1,n 的最優解。採用反證法,如果存在d’[n-1,n]<d[n-1,n],那麼用d’[n-1,n]來替換d[n-1,n]就可以得到一個更小的d[n,n],與已知d[n,n]爲最優解矛盾,因此假設不成立。

刻畫好了最優解的結構,下面遞歸定義求解最優解的值:當只有一個點時,d[1,1]無意義。分析大於等於兩個點的情況:當只有兩個點時,很容易得到:d[1,2]=|p1 p2 |。對於路徑Pi,j 來說,如果pi 不是pj 的相鄰點(i=j-1),d[i,j]=d[i,j-1]+|pj-1 pj |;當i=j-1時,對於pj 點來說,有一側必與pi 點相連,此時要判斷pj 點的另一側與哪個點相連。根據最優解的結構,此時,定義整數k(1<=k<j-1),計算每個d[k,j-1]+|pk pj |的值,選擇其中最小的一個作爲d[i,j]的值,並且記錄k值,將pj 與pk 相連。

根據以上分析,可以得到d[n,n]的計算方法如下所示:

d[1,2]=|p1 p2 |

d[i,j]=d[i,j-1]+|pj-1 pj |(i<j-1)

d[i,j]=min1<=k<j-1 {d[k,j-1]+|pk pj |}

d[n,n]=d[n-1,n]+|pn-1 pn |

接下來計算最優解的值,採用自底向上方法,在計算過程中,需要保存兩個值,第一個是數組d[i,j]的值,第二個是要記錄pi,j 中pj 點的相鄰連接點的下標,用數組pre[i,j]表示。算法如下所示:

Bitonic-tour(p)

Quicksort{p1 ,p2 ,…pn } in order of increasing x-coordinate

d[1,2]←|p1 p2 |

for j←3 to n

do for i←1 to j-2

         do d[i,j] ← d[i,j-1]+|pj-1 pj |

            pre[i,j]=j-1

     d[j-1,j] ← ∞

     for k←1 to j-2

         do a←b[k,j-1]+|pk pj |

            if a<d[j-1,j]

               then d[j-1,j] ←a

                    pre[j-1,j] ←k

d[n,n]=d[n-1,n]+|pn-1 pn |

return d and pre

最後,構造問題的最優解:根據題意,題目應該輸出一個關於點集p的序列,這個序列即是題目中所求的旅遊路線。在這裏,我定義了輸出的方式爲從最右側的點pn 開始輸出,依次輸出左行方向的點直到p1 ,然後輸出右行方向的點直到和pn 相連的那個點爲止。我們已知兩個表d[i,j]和pre[i,j],輸出的算法描述如下所示:

Output-tour(p)

print pn

print pn-1

k←pre[n-1,n]

Print-tour(pre,k,n-1)

print pk

Print-tour(pre,i,j)

if i<j

then k←pre[i,j]

     print pk

     if k>1

        then Print-tour(pre,i,k)

else k←pre[j,i]

     if k>1

        then Print-tour(pre,k,j)

             print pk

 

有感:

    關鍵點的理解:就是排序後p1,...,pn-1,pn 這n個點,組成的最優解中,由於要求是雙調,所以pn一

定與pn-1這個點向連。所以就可以把一個求環的問題歸約成一個求簡單路徑的問題。

    這個簡單路徑就是pn-1嚴格遞減向左走到p1,然後p1在嚴格遞增向右走到pn.這個路徑恰好用到p1到pn這n個 點。求解思想就是動態規劃。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章