問題描述:
-
旅行商問題(Traveling Salesman Problem,TSP)是旅行商要到若干個城市旅行,各城市之間的費用是已知的,為了節省費用,旅行商決定從所在城市出發,到每個城市旅行一次后返回初始城市,問他應選擇什么樣的路線才能使所走的總費用最短?此問題可描述如下:設G=(V,E)是一個具有邊成本cij的有向圖,cij的定義如下,對於所有的i和j,cij>0,若<i,j>不屬於E,則cij=∞。令|V|=n,並假設n>1。 G的一條周游路線是包含V中每個結點的一個有向環,周游路線的成本是此路線上所有邊的成本和。
-
旅行商問題(Traveling Saleman Problem,TSP)又譯為旅行推銷員問題、貨郎擔問題,簡稱為TSP問題,是最基本的路線問題,該問題是在尋求單一旅行者由起點出發,通過所有給定的需求點之后,最后再回到原點的最小路徑成本。最早的旅行商問題的數學規划是由Dantzig(1959)等人提出。
-
TSP問題在物流中的描述是對應一個物流配送公司,欲將n個客戶的訂貨沿最短路線全部送到。如何確定最短路線。
-
TSP問題最簡單的求解方法是枚舉法。它的解是多維的、多局部極值的、趨於無窮大的復雜解的空間,搜索空間是n個點的所有排列的集合,大小為(n-1)。可以形象地把解空間看成是一個無窮大的丘陵地帶,各山峰或山谷的高度即是問題的極值。求解TSP,則是在此不能窮盡的丘陵地帶中攀登以達到山頂或谷底的過程。
問題分析
- 旅行商問題要從圖G的所有周游路線中求取最小成本的周游路線,而從初始點出發的周游路線一共有(n-1)!條,即等於除初始結點外的n-1個結點的排列數,因此旅行商問題是一個排列問題。排列問題比子集合的選擇問題通常要難於求解得多,這是因為n個物體有n!種排列。通過枚舉(n-1)!條周游路線,從中找出一條具有最小成本的周游路線的算法,其計算時間顯然為O(n!)。
旅行商問題的解法
旅行推銷員的問題,我們稱之為巡行(Tour),此種問題屬於NP-Complete的問題,所以旅行商問題大多集中在啟發式解法。Bodin(1983)等人將旅行推銷員問題的啟發式解法分成三種:
1、途程建構法(Tour Construction Procedures)
從距離矩陣中產生一個近似最佳解的途徑,有以下幾種解法:
1)最近鄰點法(Nearest Neighbor Procedure):一開始以尋找離場站最近的需求點為起始路線的第一個顧客,此后尋找離最后加入路線的顧客最近的需求點,直到最后。
2)節省法(Clark and Wright Saving):以服務每一個節點為起始解,根據三角不等式兩邊之和大於第三邊之性質,其起始狀況為每服務一個顧客后便回場站,而后計算路線間合並節省量,將節省量以降序排序而依次合並路線,直到最后。
3)插入法(Insertion procedures):如最近插入法、最省插入法、隨意插入法、最遠插入法、最大角度插入法等。
2、途程改善法(Tour Improvement Procedure)
先給定一個可行途程,然后進行改善,一直到不能改善為止。有以下幾種解法:
1)K-Opt(2/3 Opt):把尚未加入路徑的K條節線暫時取代目前路徑中K條節線,並計算其成本(或距離),如果成本降低(距離減少),則取代之,直到無法改善為止,K通常為2或3。
2)Or-Opt:在相同路徑上相鄰的需求點,將之和本身或其它路徑交換且仍保持路徑方向性,並計算其成本(或距離),如果成本降低(距離減少),則取代之,直到無法改善為止。
3、合成啟發法(Composite Procedure)
先由途程建構法產生起始途程,然后再使用途程改善法去尋求最佳解,又稱為兩段解法(two phase method)。有以下幾種解法:
1)起始解求解+2-Opt:以途程建構法建立一個起始的解,再用2-Opt的方式改善途程,直到不能改善為止。
2)起始解求解+3-Opt:以途程建構法建立一個起始的解,再用3-Opt的方式改善途程,直到不能改善為止。
背包問題
- 背包問題(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。