利用貪心演算法求解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個城市,他必須選擇所要走的路徑,路徑的限制是每個城市只能拜訪一次,而且最後要回到原來出發的城市