經典問題
u 什麼是旅行商問題
旅行商問題(Traveling Saleman Problem,TSP)又譯爲旅行推銷員問題、貨郎擔問題,簡稱爲TSP問題,是最基本的路線問題,該問題是在尋求單一旅行者由起點出發,通過所有給定的需求點之後,最後再回到原點的最小路徑成本。最早的旅行商問題的數學規劃是由Dantzig(1959)等人提出。
TSP問題在物流中的描述是對應一個物流配送公司,欲將n個客戶的訂貨沿最短路線全部送到。如何確定最短路線。
TSP問題最簡單的求解方法是枚舉法。它的解是多維的、多局部極值的、趨於無窮大的複雜解的空間,搜索空間是n個點的所有排列的集合,大小爲(n-1)。可以形象地把解空間看成是一個無窮大的丘陵地帶,各山峯或山谷的高度即是問題的極值。求解TSP,則是在此不能窮盡的丘陵地帶中攀登以達到山頂或谷底的過程。
旅行商問題的歷史
旅行商問題字面上的理解是:有一個推銷員,要到n個城市推銷商品,他要找出一個包含所有n個城市的具有最短路程的環路。
TSP的歷史很久,最早的描述是1759年歐拉研究的騎士周遊問題,即對於國際象棋棋盤中的64個方格,走訪64個方格一次且僅一次,並且最終返回到起始點。
TSP由美國RAND公司於1948年引入,該公司的聲譽以及線性規劃這一新方法的出現使得TSP成爲一個知名且流行的問題。
旅行商問題的解法
旅行推銷員的問題,我們稱之爲巡行(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的方式改善途程,直到不能改善爲止。
u 揹包問題
簡介
它是在1978年由Merkel和Hellman提出的。它的主要思路是假定某人擁有大量物品,重量各不同。此人通過祕密地選擇一部分物品並將它們放到揹包中來加密消息。揹包中的物品中重量是公開的,所有可能的物品也是公開的,但揹包中的物品是保密的。附加一定的限制條件,給出重量,而要列出可能的物品,在計算上是不可實現的。揹包問題是熟知的不可計算問題,揹包體制以其加密,解密速度快而其人注目。但是,大多數一次揹包體制均被破譯了,因此現在很少有人使用它。
相關題目詳解
揹包問題(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個位置,之前的人都死光了,所以他們也就不知道約琴夫與他的朋友並沒有遵守遊戲規則了。