一、問題介紹:
歐幾里得旅行商問題是指:對於給定平面上的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個 點。求解思想就是動態規劃。