1. 程式人生 > >利用貪心演算法求解tsp問題

利用貪心演算法求解tsp問題

一、TSP問題

TSP問題(Travelling Salesman Problem)即旅行商問題,又譯為旅行推銷員問題、貨郎擔問題。假設有一個旅行商人要拜訪n個城市,他必須選擇所要走的路徑,路徑的限制是每個城市只能拜訪一次,而且最後要回到原來出發的城市。路徑的選擇目標是要求得的路徑路程為所有路徑之中的最小值。

二、貪心演算法

貪心演算法,總是做出在當前看來最好的選擇,它所做的每一個在當前狀態下某種意義上是最好的選擇即貪心選擇,並希望通過每次所作的貪心選擇導致最終得到問題最優解。必須注意的是,貪心演算法不是對所有問題都能得到整體最優解,選擇的貪心策略必須具備無後效性,即某個狀態以後的過程不會影響以前的狀態,只與當前狀態有關。

1、貪心演算法的基本思路

從問題的某一個初始解觸發逐步逼近給定的目標,以儘可能快地求得更好的解。當達到某演算法中的某一步不能再繼續前進時,演算法停止。大致步驟如下:

1)建立數學模型來描述問題;
2)把求解的問題分成若干個子問題
3)對每一個子問題求解,得到子問題的區域性最優解
4)把子問題的區域性最優解合成原問題的一個解

2、貪心演算法的實現框架

貪心演算法沒有固定的演算法框架,演算法設計的關鍵是貪心策略的選擇,而貪心策略適用的前提是:區域性最優策略能導致產生全域性最優解。

    從問題的某一初始解出發;
    while (能朝給定總目標前進一步)
    {
          利用可行的決策,求出可行解的一個解元素;
    }
    由所有解元素組合成問題的一個可行解;

3、貪心演算法存在的問題

1)不能保證求得的最後解是最佳的;
2)不能用來求最大最小解問題;

馬踏棋盤、揹包、裝箱等

三、貪心演算法求解TSP問題

貪心策略:在當前節點下遍歷所有能到達的下一節點,選擇距離最近的節點作為下一節點。基本思路是,從一節點出發遍歷所有能到達的下一節點,選擇距離最近的節點作為下一節點,然後把當前節點標記已走過,下一節點作為當前節點,重複貪心策略,以此類推直至所有節點都標記為已走節點結束

package com.tsp;

public class Tsp {
       private int cityNum=4;
       private int[][] distance={ //每個城市的距離矩陣
                  {999,2,6,5},  
                  {2,999,5,4},  
                  {6,5,999,2},  
                  {5,4,2,999}   
                };
       private boolean[] col=new boolean[4];//標記陣列,用於標記列是否被訪問
       private boolean[] row=new boolean[4];//標記陣列,用於標記行是否被訪問
       
       private void getTsp(){
           for(int i=0;i<cityNum;i++){//初始化標記陣列
               col[i]=false;
               row[i]=false;//預設都沒有被訪問
           }
           col[0]=true;//從標號為0的節點開始
           int current=0;//當前節點 (在矩陣中也表示當前行)
           int next=0;//下一個節點
           int[] temp=new int[cityNum];//用於儲存當前節點到其他節點的距離
           String path="0";//用於儲存路徑
           int sum=0;
           int count=0;//用於計數
           while(row[current]==false){//終點是回到第一個節點,已經被標記已經訪問過
               count++;
               if(count>=cityNum){
                   path+="-->0";
                   sum+=temp[0];
                   System.out.println("path:"+path);
                   System.out.println("sum:"+sum);
                   
               }
               for(int j=0;j<cityNum;j++)
                   temp[j]=distance[current][j];
               int index=0;
               int min=Integer.MAX_VALUE;
               for(int k=0;k<cityNum;k++){//尋找當前節點相連的最小的節點
                   if(temp[k]<min&&col[k]==false){
                       min=temp[k];
                       index=k;
                   }
               }
               sum+=min;
               path=path+"-->"+index;
               row[current]=true;
               col[next]=true;
               next=index;
               current=next;
           }
       }
       public static void main(String[] args) {
         new Tsp().getTsp();
    }
}

相關推薦

利用貪心演算法求解tsp問題

一、TSP問題 TSP問題(Travelling Salesman Problem)即旅行商問題,又譯為旅行推銷員問題、貨郎擔問題。假設有一個旅行商人要拜訪n個城市,他必須選擇所要走的路徑,路徑的限制是每個城市只能拜訪一次,而且最後要回到原來出發的城市。路徑的選擇目標是要求

利用遺傳演算法求解TSP問題

轉載地址 https://blog.csdn.net/greedystar/article/details/80343841 目錄 一、問題描述 二、演算法描述 三、求解說明 四、參考資料 五、原始碼

基於貪心演算法求解TSP問題(JAVA)

前段時間在搞貪心演算法,為了舉例,故拿TSP來開刀,寫了段求解演算法程式碼以便有需之人,注意程式碼考慮可讀性從最容易理解角度寫,沒有優化,有需要可以自行優化!一、TSP問題TSP問題(Travelling Salesman Problem)即旅行商問題,又譯為旅行推銷員問題、

python 利用模擬退火演算法求解TSP最短路徑

    ​    ​而迪傑斯特拉演算法演算法強調的是從全域性的解當中,每次選擇最短路徑的節點作為最優解,因而它的路徑無疑是全域性最優的。但是,當資料量很大的時候,它的效能消耗也是非常嚇人的。對於本例來說,如果採用迪傑斯特拉演算法,它的時間複雜度是O(N!).

ML之PLiR之LARS:利用LARS演算法求解ElasticNet迴歸型別問題—評分預測

ML之PLiR之LARS:利用LARS演算法求解ElasticNet迴歸型別問題—評分預測 設計思路       輸出結果 ['"alcohol"', '"volatile acidity"', '"sulphates"', '"total

ML之PLiR之Glmnet:利用Glmnet演算法求解ElasticNet迴歸型別問題(實數值評分預測)

ML之PLiR之Glmnet演算法:利用Glmnet演算法求解ElasticNet迴歸型別問題(實數值評分預測) 設計思路       輸出結果   0 2 1 2 2 2 3 3 4 3 5 3 6 3 7 3 8 3 9 2

貪心演算法解決tsp問題

簡介完了,說下思路. 就是不考慮遠方,只考慮下一步,  "今朝有酒今朝醉" , 只有保證下一步是最近的距離即可 .   要找到最近的下一步,首先需要把已經出現過的城市排除 , s[]記錄了訪問過的城市列表,遍歷這個列表,訪問過返回YES,沒訪問返回NO. // 這個城市k是否出現過了 bool isSho

人工蜂群演算法求解TSP問題

人工蜂群演算法求解TSP問題 【標籤】 ABC TSP Matlab data:2018-10-19 author:怡寶2號 【總起】利用人工蜂群演算法(Artificial Bee Colony Algorithm, 簡稱ABC演算法)求解TSP問題,語言:mat

ML之PLiR之LARS:利用LARS演算法求解ElasticNet迴歸型別(包括類別編碼+屬性重要程度排序)問題(實數值年齡預測)

ML之PLiR之LARS:利用LARS演算法求解ElasticNet迴歸型別(包括類別編碼+屬性重要程度排序)問題(實數值年齡預測)   輸出結果   設計思路   核心程式碼 xCoded = [] for row i

C++版遺傳演算法求解TSP Java版GA_TSP(我的第一個Java程式)

  嗯哼,時隔半年,再次有時間整理關於組合優化問題——旅行商問題(Traveling Salesman Problem, TSP),這次採用的是經典遺傳演算法(Genetic Algorithm, GA)進行求解,利用C++語言進行程式設計實現。關於TSP問題以及GA的簡單介紹,可參見我的另一篇文章:Java

C++版遺傳演算法求解TSP

隔半年,再次有時間整理關於組合優化問題——旅行商問題(Traveling Salesman Problem, TSP),這次採用的是經典遺傳演算法(Genetic Algorithm, GA)進行求解,利用C++語言進行程式設計實現。 各種啟發式演算法的整體框架大致都由以下幾個操作組成:(1)初始解的產生;

Matlab 遺傳演算法求解TSP問題

function varargout = tsp_ga(xy,dmat,pop_size,num_iter,show_prog,show_res) %TSP_GA Traveling Salesman Problem (TSP) Genetic Algorithm (GA)

遺傳演算法求解TSP問題

遺傳演算法是一種啟發式搜尋,屬於進化演算法的一種。它最初是人們根據自然界對物種的自然選擇和遺傳規律而設計的。它模擬自然界物種的自然選擇、遺傳和變異等,對一個種群的基因進行改良。 遺傳演算法需要設定交叉概率、變異概率和迭代次數等引數,且演算法的收斂性受其引數設定影響較大。 遺

用c++程式碼實現貪心演算法求解最短路徑問題

貪心演算法求解最短路徑問題: 假設演算法要處理下圖,需要把圖資料組織存放到相應的資料結構中。  這個是標頭檔案stdafx.h中的內容#pragma once #include <stdio.h> #include &

用C++遺傳演算法求解TSP

隔半年,再次有時間整理關於組合優化問題——旅行商問題(Traveling Salesman Problem, TSP),這次採用的是經典遺傳演算法(Genetic Algorithm, GA)進行求解,利用C++語言進行程式設計實現。 各種啟發式演算法的整體框架大致都由以下幾個操作組成:

貪心演算法求解揹包問題

問題:給定n個物品和一個容量為C的揹包,物品i的重量為w 其價值為v。揹包問題就是如何如何選擇揹包的物品,使裝入揹包中的物品的總價值是最大的,注意和0/1揹包問題的區別,在揹包問題中可以將某種物品的一部分裝入揹包,不可以重複裝入。但是在0/1揹包問題中,只有裝入或者不裝入兩

.用貪心演算法解決TSP問題

旅行商問題,即TSP問題(Traveling Salesman Problem)又譯為旅行推銷員問題、貨郎擔問題,是數學領域中著名問題之一。假設有一個旅行商人要拜訪n個城市,他必須選擇所要走的路徑,路徑

演算法設計的揹包問題-------------用貪心演算法求解

•public static float knapsack(float c,float [] w, float [] v,float [] x) •   { •      int n=v.leng

基於遺傳演算法求解TSP問題(Java介面)

最近為做展示,改寫了一個遺傳演算法求TSP的Java介面版,思路程式碼和 http://blog.csdn.net/wangqiuyun/article/details/12838903 這篇文章思路是一樣的,追加了Java用Graphics畫點及畫線做路徑展示,展示部分

基於MATLAB的模擬退火演算法求解TSP問題

旅行商問題,即TSP問題(Travelling Salesman Problem)又譯為旅行推銷員問題、貨郎擔問題,是數學領域中著名問題之一。假設有一個旅行商人要拜訪n個城市,他必須選擇所要走的路徑,路徑的限制是每個城市只能拜訪一次,而且最後要回到原來出發的城市