解決NP問題 旅行商問題的一點思路之二

2021-05-27 16:34:04 字數 1064 閱讀 9020

常規演算法:

我們排列出來所有的路徑,然後我們在選擇出來所需的路徑,這個我們假設有n個地點,再加上這個圖是乙個完全圖,就代表每個節點都是含有n-1條邊,我們擺列所有的路徑,這個是n!,這個在《計算機程式設計藝術》卷一中有過證明,這個約等於2的根號下n次方!不是多項式時間內可以解決的。

貪心演算法:

我們還是假設我們只是貪最小的路徑,我們有n個地點,每個有n-1條邊,那麼,我們只要執行n*(n-1)步,乍一看,這個問題好像是解決的,但是,我們不能保證我們所選擇的是最優的路徑,我們可以加上乙個限制條件,我們還是在選擇的時候,為每個其他的沒有選擇的路徑記錄下來所走過的路程,但是,這個條件還是和第乙個演算法還是差不多的,我們為所剩下的n-1條邊都加上所有的邊,那麼這個就變成了比常規演算法還要麻煩的了!不知道誰還有更好的約束條件,望賜教。

遺傳演算法:

我們知道我們雜交出來的染色體是有n-1條邊的,那麼,我們知道從售貨員開始的頂點到再回到這個頂點,就是走了n-1條路徑,但是任意兩個城市之間還是有n-1條邊,雜交產生的你所需要的邊的概率是n-1,那麼,我們我們一共有n-1條邊,只要雜交(n-1)(n-1)次,我們就能得到我們想要的路徑,但是,我們假設產生了兩個染色體,每次雜交就是和整個圖的隨機的乙個邊雜交,然後儲存這個染色體,每次雜交都會產生兩個新的染色體,如何直選到了乙個染色體,第一次選擇的概率是1/2,第二次選擇的概率是1/4,第三次選擇二概率是1/6,一次類推,這樣我們可以知道了乙個乘積公式,就是表示這個概率的總和,為1/2*1/4*......*1/(2的n-1次方) = a(n),但是,我們還得保證不會交換已經選擇好的染色體,我們已經產生第乙個染色體的時候,就是有了n-1條邊,那麼只有一條邊符合在我們的染色體裡,我們還是那麼選擇不不到的概率是(n-2)/(n-1),如果已經選擇到第二個符合的邊,那麼就變成了(n-3)/(n-1),一次類推,這個也是相乘的,我們假設這個乘積為c(n),雜交一次所以產生一條符合的染色體是(1/(n-1)(n-1))* a(n)*c(n),那麼,一共需要雜交多少次才能產生乙個符合條件的染色體呢,這個恐怕是前面這個的倒數!

總的來說,這個還不是很理想,我會在下面在定點優化,我還會增加一些限制條件來縮小選擇的範圍,或者是單單只是選擇到了乙個染色體,而不是從眾多染色體中選擇乙個染色體!

解決NP問題 旅行商問題的一點思路之三

關於在第二篇的遺傳演算法中,我是針對雜交出來的多個染色體進行選擇的,其實我經常想,偉大的大自然,選擇了優秀的基因,當然,他會讓每個基因都會經過選擇,不合適的毫不留情的剔除,說點本次文章以外的東西,我們人類很偉大,我們都這麼覺得,我們發明了很多東西,有著先進的醫學,用來 各種病人,其實,這就是人為干預...

暴力法解決旅行商問題

找出一條n個給定的城市間的最短路徑,使得我們在回到出發的城市之前,都經過了每個城市有且僅有一次。下圖表示4個城市及其路徑的一張圖。按照暴力法可以將所有的路線列出來,然後找出最佳的路線。a b c d a distance 2 8 1 7 18 a b d c a distance 2 3 1 5 1...

SCIP求解器解決旅行商問題

tsp旅行商問題是運籌學領域乙個經典問題,乙個旅行商訪問所有的城市,每個城市僅訪問一次,總路程最短。問題的模型如圖 目標函式 總路程最短 決策變數xij 若經過以ij為節點的邊,則xij 1,否則為0 約束2 子迴路約束,對任意乙個v的子集,去掉v子集和空集,邊的數量小於等於點的數量減去1,比如三個...