導航:首頁 > 源碼編譯 > tsp演算法c語言

tsp演算法c語言

發布時間:2022-07-30 02:02:13

① Ubuntu系統下由gcc編譯的C語言利用蟻群演算法計算tsp(旅行商問題)的詳解和注釋

買本書看看去。

你這個只是所有代碼里的一個開頭,我只能解釋這兩句話,解釋了你又不滿意。
我只能叫你去買本書看。

② 有人能給一個TSP的 C語言 源代碼嗎 要求1:可以運算10000個城市的。。。

上個學期用人工智慧搜索的方法做過,效果很不錯的說,哈哈。

③ 最短連接策略求解tsp問題的c語言

#include<stdlib.h>
#include<stdio.h>
#include<math.h>
#include<stdafx.h>
#include <time.h>
#define PopSize 50 /*種群類DNA個數 */
#define MaxGens 200 /* 最大代數 */
#define N 10 /* 問題規模 */
#define PC 0.8 /* 交叉概率 */
#define PM 0.01 /* 突變概率 */
#define RAND_MAX 10
int city[N];
int begin_city=0; /*出發城市*/
double r[N][N]={
0, 1, 4, 6, 8, 1, 3, 7, 2, 9,
1, 0, 7, 5, 3, 8, 3, 4, 2, 4,
4, 7, 0, 3, 8, 3, 7, 9, 1, 2,
6, 5, 3, 0, 3, 1, 5, 2, 9, 1,
8, 3, 8, 3, 0, 2, 3, 1, 4, 6,
1, 8, 3, 1, 2, 0, 3, 3, 9, 5,
3, 3, 7, 5, 3, 3, 0, 7, 5, 9,
7, 4, 9, 2, 1, 3, 7, 0, 1, 3,
2, 2, 1, 9, 4, 9, 5, 1, 0, 1,
9, 4, 2, 1, 6, 5, 9, 3, 1, 0
} ;
int generation; /*當前代數 */
int CurBest; /*最優個體 */
struct GenoType
{
int gene[N]; /* 城市序列 */
double fitness; /* 當前城市序列對應的適應值 */
double rfitness; /* 適應率 */
double cfitness; /* 輪盤對應的起始區間值 */
};
struct ResultType
{
double best_val; /*最佳適應度 */
double avg; /*平均適應度 */
double stddev; /*標准差 */
};
GenoType population[PopSize+1]; /* 種群 */
GenoType newpopulation[PopSize+1]; /*新種群 */
ResultType result[MaxGens];/*種群換代記錄 */
/*函數聲明 */
void initialize();/*初始化 */
void evaluate();/*評價函數 */
void Find_the_best();/*找出最優 */
void elitist();/*擇優函數*/
void select();/*選擇 */
void crossover();/*交叉 */
void mutate();/*變異 */
void report();/*報告輸出 */
int IntGenerate();/*產生一個城市節點 */
void swap(int *,int *);/*交換兩值 */
void swap(int *a,int *b)
{
int temp;
temp=*a;
*a=*b;
*b=temp;
}
/* 產生一個0到10的數,作為城市編號*/
int IntGenerate()
{
int RANGE_MIN = 0;
int RANGE_MAX = N;
int rand_10;
rand_10=(((double)rand()/(double) RAND_MAX) * RANGE_MAX + RANGE_MIN);
return rand_10;
}
/*初始化種群*/
void initialize()
{
int matrix[N];
int x1,x2;
int i,j;
/*生成一個定值序列 ,0點為開始點 */
for(i=1; i<N; i++)
matrix[i]=i;
for(j=0;j<PopSize;j++)
{
population[i].gene[0]=begin_city; /*gene[0]表示出發城市,i表示城市次序 */
for( i=0;i<N;i++) /*N次交換足以產生各種結果了 */
{
x1=0; x2=0;
while(x1==0)
x1=IntGenerate();
while(x2==0)
x2=IntGenerate();
swap(&matrix[x1],&matrix[x2]);
}
for(int i=1;i<N;i++)
population[j].gene[i]=matrix[i];
}

④ C語言遺傳演算法在求解TSP問題 畢業論文+源代碼



摘要
I
Abstract
II


1
第一章
基本遺傳演算法
2
1.1
遺傳演算法的產生及發展
3
1.2
基本原理
3
1.3
遺傳演算法的特點
3
1.4
基本遺傳演算法描述
5
1.5
遺傳演算法構造流程
6
第二章
遺傳演算法的實現技術
6
2.1
編碼方法
7
2.1.1
二進制編碼
7
2.1.2
格雷碼編碼
7
2.1.3
符點數編碼
8
2.1.4
參數編碼
8
2.2
適應度函數
10
2.3
選擇運算元
10
2.4
交叉運算元
10
2.4.1
單點交叉運算元
10
2.4.2
雙點交叉運算元
11
2.4.3
均勻交叉運算元
11
2.4.4
部分映射交叉
11
2.4.5
順序交叉
12
2.5
變異運算元
12
2.6
運行參數
12
2.7
約束條件的處理方法
13
2.8
遺傳演算法流程圖
14
第三章
遺傳演算法在TSP上的應用
15
3.1
TSP問題的建模與描述
15
3.2
對TSP的遺傳基因編碼方法
16
3.3
針對TSP的遺傳操作運算元
17
3.3.1
選擇運算元
17
3.3.1.1
輪盤賭選擇
17
3.3.1.2
最優保存策略選擇
17
3.3.2
交叉運算元
20
3.3.2.1
單點交叉
20
3.3.2.2
部分映射交叉
21
3.3.3
變異運算元
23
3.4
TSP的混和遺傳演算法
26
第四章
實例分析
27
4.1
測試數據
27
4.2
測試結果
27
4.3
結果分析
27


TSP
(Traveling
Salesman
Problem)旅行商問題是一類典型的NP完全問題,遺傳演算法是解決NP問題的一種較理想的方法。文章首先介紹了基本遺傳演算法的基本原理、特點及其基本實現技術;接著針對TSP
問題,論述了遺傳演算法在編碼表示和遺傳運算元(包括選擇運算元、交叉運算元變異運算元這三種運算元)等方面的應用情況,分別指出幾種常用的編碼方法的優點和缺點,並且結合TSP的運行實例詳細分析了基本遺傳演算法的4個運行參數群體大小、遺傳演算法的終止進化代數、交叉概率、變異概率,對遺傳演算法的求解結果和求解效率的影響,經過多次的測試設定出了它們一組比較合理的取值。最後,簡單說明了混合遺傳演算法在求解TSP問題中的應用並對遺傳演算法解決TSP問題的前景提出了展望。
關鍵詞:TSP
遺傳演算法
遺傳運算元
編碼
@@@需要的話按我的名字找我吧

⑤ 基於遺傳演算法,解決TSP問題中雙點交叉C語言程序怎麼編寫

解決TSP問題的交叉方法不像其他的那麼簡單,跟它的編碼方法有關系。如果是順序編碼,那麼交叉時要考慮到子代個體是否是合法的。一般用順序交叉方法的比較多。參考資料中為單點交叉方法的代碼,兩點交叉與之類似,不過是多了一點交叉點而已。

⑥ C語言中退火模擬

模擬退火法 模擬退火演算法來源於固體退火原理,將固體加溫至充分高,再讓其徐徐冷卻,加溫時,固體內部粒子隨溫升變為無序狀,內能增大,而徐徐冷卻時粒子漸趨有序,在每個溫度都達到平衡態,最後在常溫時達到基態,內能減為最小。根據Metropolis准則,粒子在溫度T時趨於平衡的概率為e-ΔE/(kT),其中E為溫度T時的內能,ΔE為其改變數,k為Boltzmann常數。用固體退火模擬組合優化問題,將內能E模擬為目標函數值f,溫度T演化成控制參數t,即得到解組合優化問題的模擬退火演算法:由初始解i和控制參數初值t開始,對當前解重復「產生新解→計算目標函數差→ 接受或舍棄」的迭代,並逐步衰減t值,演算法終止時的當前解即為所得近似最優解,這是基於蒙特卡羅迭代求解法的一種啟發式隨機搜索過程。退火過程由冷卻進度表(Cooling Schele)控制,包括控制參數的初值t及其衰減因子Δt、每個t值時的迭代次數L和停止條件S。

退火演算法
Simulate Anneal Arithmetic (SAA,模擬退火演算法) 模擬退火演算法 模擬退火演算法來源於固體退火原理,將固體加溫至充分高,再讓其徐徐冷卻,加溫時,固體內部粒子隨溫升變為無序狀,內能增大,而徐徐冷卻時粒子漸趨有序,在每個溫度都達到平衡態,最後在常溫時達到基態,內能減為最小。根據Metropolis准則,粒子在溫度T時趨於平衡的概率為e-ΔE/(kT),其中E為溫度T時的內能,ΔE為其改變數,k為Boltzmann常數。用固體退火模擬組合優化問題,將內能E模擬為目標函數值f,溫度T演化成控制參數t,即得到解組合優化問題的模擬退火演算法:由初始解i和控制參數初值t開始,對當前解重復「產生新解→計算目標函數差→接受或舍棄」的迭代,並逐步衰減t值,演算法終止時的當前解即為所得近似最優解,這是基於蒙特卡羅迭代求解法的一種啟發式隨機搜索過程。退火過程由冷卻進度表(Cooling Schele)控制,包括控制參數的初值t及其衰減因子Δt、每個t值時的迭代次數L和停止條件S。 模擬退火演算法起源於物理退火。 􀂄物理退火過程: (1) 加溫過程 (2) 等溫過程 (3) 冷卻過程 1 . 模擬退火演算法的模型 模擬退火演算法可以分解為解空間、目標函數和初始解三部分。 模擬退火的基本思想: (1) 初始化:初始溫度T(充分大),初始解狀態S(是演算法迭代的起點), 每個T值的迭代次數L (2) 對k=1,……,L做第(3)至第6步: (3) 產生新解S′ (4) 計算增量Δt′=C(S′)-C(S),其中C(S)為評價函數 (5) 若Δt′<0則接受S′作為新的當前解,否則以概率exp(-Δt′/T)接受S′作為新的當前解. (6) 如果滿足終止條件則輸出當前解作為最優解,結束程序。 終止條件通常取為連續若干個新解都沒有被接受時終止演算法。 (7) T逐漸減少,且T->0,然後轉第2步。 演算法對應動態演示圖: 模擬退火演算法新解的產生和接受可分為如下四個步驟: 第一步是由一個產生函數從當前解產生一個位於解空間的新解;為便於後續的計算和接受,減少演算法耗時,通常選擇由當前新解經過簡單地變換即可產生新解的方法,如對構成新解的全部或部分元素進行置換、互換等,注意到產生新解的變換方法決定了當前新解的鄰域結構,因而對冷卻進度表的選取有一定的影響。 第二步是計算與新解所對應的目標函數差。因為目標函數差僅由變換部分產生,所以目標函數差的計算最好按增量計算。事實表明,對大多數應用而言,這是計算目標函數差的最快方法。 第三步是判斷新解是否被接受,判斷的依據是一個接受准則,最常用的接受准則是Metropo1is准則: 若Δt′<0則接受S′作為新的當前解S,否則以概率exp(-Δt′/T)接受S′作為新的當前解S。 第四步是當新解被確定接受時,用新解代替當前解,這只需將當前解中對應於產生新解時的變換部分予以實現,同時修正目標函數值即可。此時,當前解實現了一次迭代。可在此基礎上開始下一輪試驗。而當新解被判定為舍棄時,則在原當前解的基礎上繼續下一輪試驗。 模擬退火演算法與初始值無關,演算法求得的解與初始解狀態S(是演算法迭代的起點)無關;模擬退火演算法具有漸近收斂性,已在理論上被證明是一種以概率l 收斂於全局最優解的全局優化演算法;模擬退火演算法具有並行性。 2 模擬退火演算法的簡單應用 作為模擬退火演算法應用,討論貨郎擔問題(Travelling Salesman Problem,簡記為TSP):設有n個城市,用數碼1,…,n代表。城市i和城市j之間的距離為d(i,j) i, j=1,…,n.TSP問題是要找遍訪每個域市恰好一次的一條迴路,且其路徑總長度為最短.。 求解TSP的模擬退火演算法模型可描述如下: 解空間 解空間S是遍訪每個城市恰好一次的所有迴路,是{1,……,n}的所有循環排列的集合,S中的成員記為(w1,w2 ,……,wn),並記wn+1= w1。初始解可選為(1,……,n) 目標函數 此時的目標函數即為訪問所有城市的路徑總長度或稱為代價函數: 我們要求此代價函數的最小值。 新解的產生 隨機產生1和n之間的兩相異數k和m,若k (w1, w2 ,…,wk , wk+1 ,…,wm ,…,wn) 變為: (w1, w2 ,…,wm , wm-1 ,…,wk+1 , wk ,…,wn). 如果是k>m,則將 (w1, w2 ,…,wk , wk+1 ,…,wm ,…,wn) 變為: (wm, wm-1 ,…,w1 , wm+1 ,…,wk-1 ,wn , wn-1 ,…,wk). 上述變換方法可簡單說成是「逆轉中間或者逆轉兩端」。 也可以採用其他的變換方法,有些變換有獨特的優越性,有時也將它們交替使用,得到一種更好方法。 代價函數差 設將(w1, w2 ,……,wn)變換為(u1, u2 ,……,un), 則代價函數差為: 根據上述分析,可寫出用模擬退火演算法求解TSP問題的偽程序: Procere TSPSA: begin init-of-T; { T為初始溫度} S={1,……,n}; {S為初始值} termination=false; while termination=false begin for i=1 to L do begin generate(S′form S); { 從當前迴路S產生新迴路S′} Δt:=f(S′))-f(S);{f(S)為路徑總長} IF(Δt<0) OR (EXP(-Δt/T)>Random-of-[0,1]) S=S′; IF the-halt-condition-is-TRUE THEN termination=true; End; T_lower; End; End 模擬退火演算法的應用很廣泛,可以較高的效率求解最大截問題(Max Cut Problem)、0-1背包問題(Zero One Knapsack Problem)、圖著色問題(Graph Colouring Problem)、調度問題(Scheling Problem)等等。 3 模擬退火演算法的參數控制問題 模擬退火演算法的應用很廣泛,可以求解NP完全問題,但其參數難以控制,其主要問題有以下三點: (1) 溫度T的初始值設置問題。 溫度T的初始值設置是影響模擬退火演算法全局搜索性能的重要因素之一、初始溫度高,則搜索到全局最優解的可能性大,但因此要花費大量的計算時間;反之,則可節約計算時間,但全局搜索性能可能受到影響。實際應用過程中,初始溫度一般需要依據實驗結果進行若干次調整。 (2) 退火速度問題。 模擬退火演算法的全局搜索性能也與退火速度密切相關。一般來說,同一溫度下的「充分」搜索(退火)是相當必要的,但這需要計算時間。實際應用中,要針對具體問題的性質和特徵設置合理的退火平衡條件。 (3) 溫度管理問題。 溫度管理問題也是模擬退火演算法難以處理的問題之一。實際應用中,由於必須考慮計算復雜度的切實可行性等問題,常採用如下所示的降溫方式: T(t+1)=k×T(t) 式中k為正的略小於1.00的常數,t為降溫的次數 4、模擬退火演算法的優缺點 優點:計算過程簡單,通用,魯棒性強,適用於並行處理,可用於求解復雜的非線性優化問題。 缺點:收斂速度慢,執行時間長,演算法性能與初始值有關及參數敏感等缺點。 經典模擬退火演算法的缺點: (1)如果降溫過程足夠緩慢,多得到的解的性能會比較好,但與此相對的是收斂速度太慢; (2)如果降溫過程過快,很可能得不到全局最優解。 􀂄 模擬退火演算法的改進 (1) 設計合適的狀態產生函數,使其根據搜索進程的需要 表現出狀態的全空間分散性或局部區域性。 (2) 設計高效的退火策略。 (3) 避免狀態的迂迴搜索。 (4) 採用並行搜索結構。 (5) 為避免陷入局部極小,改進對溫度的控制方式 (6) 選擇合適的初始狀態。 (7) 設計合適的演算法終止准則。 也可通過增加某些環節而實現對模擬退火演算法的改進。 主要的改進方式包括: (1) 增加升溫或重升溫過程。在演算法進程的適當時機,將溫度適當提高,從而可激活各狀態的接受概率,以調整搜索進程中的當前狀態,避免演算法在局部極小解處停滯不前。 (2) 增加記憶功能。為避免搜索過程中由於執行概率接受環節而遺失當前遇到的最優解,可通過增加存儲環節,將一些在這之前好的態記憶下來。 (3) 增加補充搜索過程。即在退火過程結束後,以搜索到的最優解為初始狀態,再次執行模擬退火過程或局部性搜索。 (4) 對每一當前狀態,採用多次搜索策略,以概率接受區域內的最優狀態,而非標准SA的單次比較方式。 (5) 結合其他搜索機制的演算法,如遺傳演算法、混沌搜索等。 (6)上述各方法的綜合應用。

⑦ C++演算法,動態規劃法實現TSP問題

c++listmatrixiteratoriostream演算法
[cpp] view plainprint?

#include
#include
using namespace std ;
typedef list<</SPAN>int> LISTINT;
LISTINT listAnother;
LISTINT list_result;
int d[4][4]={{-1,3,6,7},{2,-1,8,6},{7,3,-1,5,},{7,3,7,-1}}; //路徑權值
int matrix_length=4;
int getPath(int n,LISTINT list_org)
{
LISTINT::iterator i;
int minValue;
if(n==1)
{
i=list_org.begin();
minValue= d[*i-1][0];
if(list_org.size()==matrix_length-1)
{
list_result=list_org;
}
}
else
{
int temp;
i=list_org.begin();
temp=*i;
list_org.erase(i);
i=list_org.begin();
minValue=d[temp-1][*(i)-1]+getPath(n-1,list_org);
if(list_org.size()==matrix_length-1)
{
list_result=list_org;
}
for(int j=2;j
{
i=list_org.begin();
for(int k=1;k
{
i++;
}
int tempvalue=*i;
list_org.erase(i);
list_org.push_front(tempvalue);
i=list_org.begin();
tempvalue=d[temp-1][*(i)-1]+getPath(n-1,list_org);
if(tempvalue
{
if(list_org.size()==matrix_length-1)
{
list_result=list_org;
}
minValue=tempvalue;
}
}
}
return minValue;
}
int main(int argc, char* argv[])
{
LISTINT list_org;
LISTINT::iterator h;
list_org.push_front(4);
list_org.push_front(3);
list_org.push_front(2);
list_org.push_front(1);
cout<<"旅行商問題動態規劃演算法"<<endl;
cout<<"路線長度的矩陣表示如下 (-1表示無限大)"<<endl;
for(int j=0;j
cout<<endl;
for(int k=0;k
cout<<" "<<d[j][k];
}
}
cout<<endl;
cout<<"計算結果:"<<getPath(4,list_org)<<endl;
list_result.push_front(1);
list_result.push_back(1);
cout<<"要走的路徑:---->:";
for (h = list_result.begin(); h != list_result.end(); ++h)
cout << *h << " ";
cout << endl;
int i;
cin>>i;
return 0;
}

⑧ c語言數據結構的大作業,TSP問題

這個其實沒有太惡心,用數據結構中圖論的知識解決,不過你的題意不是很清楚,你需不需要遍歷所有城市,還是只是離開A到B,然後再到A就可以了
如果是後者,那很簡單,直接找出距離A最近的一個城市距離就可以了,如果是前者,那會麻煩很多

閱讀全文

與tsp演算法c語言相關的資料

熱點內容
雲南社保局app叫什麼 瀏覽:693
美女程序員吃大餐 瀏覽:208
項目二級文件夾建立規則 瀏覽:558
dns使用加密措施嗎 瀏覽:172
php獨立運行 瀏覽:530
手機sh執行命令 瀏覽:729
雲伺服器的角色 瀏覽:735
單片機頻率比例 瀏覽:842
我的世界伺服器如何關閉正版驗證 瀏覽:506
如何查roid伺服器上的 瀏覽:132
安卓手機主板如何撬晶元不掉電 瀏覽:251
php各個框架的優缺點 瀏覽:103
php1100生成數組 瀏覽:361
以後做平面設計好還是程序員好 瀏覽:554
雲伺服器應用管理 瀏覽:440
飢荒雲伺服器搭建過程 瀏覽:188
可編程式控制制器優點 瀏覽:101
壓縮垃圾車說明書 瀏覽:30
五輪書pdf 瀏覽:804
單片機定時流水中斷系統流水燈 瀏覽:701