旅行商問題和揹包問題

經典問題

u 什麼是旅行商問題

  旅行商問題(Traveling Saleman ProblemTSP)又譯爲旅行推銷員問題、貨郎擔問題,簡稱爲TSP問題,是最基本路線問題,該問題是在尋求單一旅行者由起點出發,通過所有給定的需求點之後,最後再回到原點的最小路徑成本。最早的旅行商問題的數學規劃是由Dantzig1959)等人提出。

  TSP問題在物流中的描述是對應一個物流配送公司,欲將n個客戶的訂貨沿最短路線全部送到。如何確定最短路線。

  TSP問題最簡單的求解方法是枚舉法。它的解是多維的、多局部極值的、趨於無窮大複雜解的空間,搜索空間是n個點的所有排列的集合,大小爲(n-1)。可以形象地把解空間看成是一個無窮大的丘陵地帶,各山峯或山谷的高度即是問題的極值。求解TSP,則是在此不能窮盡的丘陵地帶中攀登以達到山頂或谷底的過程。

 

旅行商問題的歷史

  旅行商問題字面上的理解是:有一個推銷員,要到n個城市推銷商品,他要找出一個包含所有n個城市的具有最短路程的環路。

  TSP的歷史很久,最早的描述是1759年歐拉研究的騎士周遊問題,即對於國際象棋棋盤中的64個方格,走訪64個方格一次且僅一次,並且最終返回到起始點。

  TSP由美國RAND公司於1948年引入,該公司的聲譽以及線性規劃這一新方法的出現使得TSP成爲一個知名且流行的問題。

 

旅行商問題的解法

  旅行推銷員的問題,我們稱之爲巡行(Tour),此種問題屬於NP-Complete的問題,所以旅行商問題大多集中在啓發式解法Bodin1983)等人將旅行推銷員問題的啓發式解法分成三種:

  1途程建構法Tour Construction Procedures

  從距離矩陣中產生一個近似最佳解的途徑,有以下幾種解法:

  1最近鄰點法Nearest Neighbor Procedure):一開始以尋找離場站最近的需求點爲起始路線的第一個顧客,此後尋找離最後加入路線的顧客最近的需求點,直到最後。

  2節省法Clark and Wright Saving):以服務每一個節點爲起始解,根據三角不等式兩邊之和大於第三邊之性質,其起始狀況爲每服務一個顧客後便回場站,而後計算路線間合併節省量,將節省量以降序排序而依次合併路線,直到最後。

  3插入法Insertion procedures):如最近插入法、最省插入法、隨意插入法、最遠插入法、最大角度插入法等。

  2途程改善法Tour Improvement Procedure

  先給定一個可行途程,然後進行改善,一直到不能改善爲止。有以下幾種解法:

  1K-Opt(2/3 Opt):把尚未加入路徑的K條節線暫時取代目前路徑中K條節線,並計算其成本(或距離),如果成本降低(距離減少),則取代之,直到無法改善爲止,K通常爲23

  2Or-Opt:在相同路徑上相鄰的需求點,將之和本身或其它路徑交換且仍保持路徑方向性,並計算其成本(或距離),如果成本降低(距離減少),則取代之,直到無法改善爲止。

  3合成啓發法Composite Procedure

  先由途程建構法產生起始途程,然後再使用途程改善法去尋求最佳解,又稱爲兩段解法two phase method)。有以下幾種解法:

  1)起始解求解+2-Opt:以途程建構法建立一個起始的解,再用2-Opt的方式改善途程,直到不能改善爲止。

2)起始解求解+3-Opt:以途程建構法建立一個起始的解,再用3-Opt的方式改善途程,直到不能改善爲止。

 

u 揹包問題

簡介

  它是在1978年由MerkelHellman提出的。它的主要思路是假定某人擁有大量物品重量各不同。此人通過祕密地選擇一部分物品並將它們放到揹包中來加密消息。揹包中的物品中重量公開的,所有可能的物品也是公開的,但揹包中的物品是保密的。附加一定的限制條件,給出重量,而要列出可能的物品,在計算上是不可實現的。揹包問題是熟知的不可計算問題,揹包體制以其加密,解密速度快而其人注目。但是,大多數一次揹包體制均被破譯了,因此現在很少有人使用它。

 

相關題目詳解

  揹包問題(Knapsack problem)是一種組合優化NP完全問題。問題可以描述爲:給定一組物品,每種物品都有自己的重量和價格,在限定的總重量內,我們如何選擇,才能使得物品的總價格最高。問題的名稱來源於如何選擇最合適的物品放置於給定揹包中。

  也可以將揹包問題描述爲決定性問題,即在總重量不超過W的前提下,總價值是否能達到V

揹包問題

   題目

  有N件物品和一個容量爲V的揹包。第i件物品的費用是c,價值是w。求解將哪些物品裝入揹包可使這些物品的費用總和不超過揹包容量,且價值總和最大。

  基本思路

  這是最基礎的揹包問題,特點是:每種物品僅有一件,可以選擇放或不放。

  用子問題定義狀態:即f[v]表示前i件物品恰放入一個容量爲v的揹包可以獲得的最大價值。則其狀態轉移方程便是:f[v]=max{f[v],f[v-c]+w}

  這個方程非常重要,基本上所有跟揹包相關的問題的方程都是由它衍生出來的。所以有必要將它詳細解釋一下:將前i件物品放入容量爲v的揹包中這個子問題,若只考慮第i件物品的策略(放或不放),那麼就可以轉化爲一個只牽扯前i-1件物品的問題。如果不放第i件物品,那麼問題就轉化爲i-1件物品放入容量爲v的揹包中;如果放第i件物品,那麼問題就轉化爲i-1件物品放入剩下的容量爲v-c的揹包中,此時能獲得的最大價值就是f [v-c]再加上通過放入第i件物品獲得的價值w

說明

據說著名猶太曆史學家 Josephus有過以下的故事:在羅馬人佔領喬塔帕特後,39 個猶太人與Josephus及他的朋友躲到一個洞中,39個猶太人決定寧願死也不要被敵人到,於是決定了一個自殺方式,41個人排成一個圓圈,由第1個人開始報數,每報數到第3人該人就必須自殺,然後再由下一個重新報數,直到所有人都自殺身亡爲止。

然而Josephus 和他的朋友並不想遵從,Josephus要他的朋友先假裝遵從,他將朋友與自己安排在第16個與第31個位置,於是逃過了這場死亡遊戲。

解法

約瑟夫問題可用代數分析來求解,將這個問題擴大好了,假設現在您與m個朋友不幸參與了這個遊戲,您要如何保護您與您的朋友?只要畫兩個圓圈就可以讓自己與朋友免於死亡遊戲,這兩個圓圈內圈是排列順序,而外圈是自殺順序,如下圖所示:

使用程序來求解的話,只要將數組當作環狀來處理就可以了,在數組中由計數1開始,每找到三個無數據區就填入一個計數,直而計數達41爲止,然後將數組由索引1開始列出,就可以得知每個位置的自殺順序,這就是約瑟夫排列,41個人而報數3的約琴夫排列如下所示:

14 36 1 38 15 2 24 30 3 16 34 4 25 17 5 40 31 6 18 26 7 37 19 8 35 27 9 20 32 10 41 21 11 28 39 12 22 33 13 29 23


由上可知,最後一個自殺的是在第31個位置,而倒數第二個自殺的要排在第16個位置,之前的人都死光了,所以他們也就不知道約琴夫與他的朋友並沒有遵守遊戲規則了。

 

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