蟻群演算法matlab程序
⑴ MATLAB建模方法有哪些
首先,Matlab是一個工具,它不是一個方法。
其次,我給你推薦一本書
《MATLAB 在數學建模中的應用(第2版)》
然後它的目錄可以回答你的問題:
第1章 數學建模常規方法及其MATLAB實現
1.1 MATLAB與數據文件的交互
1.1.1 MATLAB與Excel的交互
1.1.2 MATLAB與TXT交互
1.1.3 MATLAB界面導入數據的方法
1.2 數據擬合方法
1.2.1 多項式擬合
1.2.2 指定函數擬合
1.2.3 曲線擬合工具箱
1.3 數據擬合應用實例
1.3.1 人口預測模型
1.3.2 薄膜滲透率的測定
1.4 數據的可視化
1.4.1 地形地貌圖形的繪制
1.4.2 車燈光源投影區域的繪制(CUMCM2002A)
1.5 層次分析法(AHP)
1.5.1 層次分析法的應用場景
1.5.2 AHPMATLAB程序設計
第2章 規劃問題的MATLAB求解
2.1 線性規劃
2.1.1 線性規劃的實例與定義
2.1.2 線性規劃的MATLAB標准形式
2.1.3 線性規劃問題解的概念
2.1.4 求解線性規劃的MATLAB解法
2.2 非線性規劃
2.2.1 非線性規劃的實例與定義
2.2.2 非線性規劃的MATLAB解法
2.2.3 二次規劃
2.3 整數規劃
2.3.1 整數規劃的定義
2.3.2 01整數規劃
2.3.3 隨機取樣計演算法
第3章 數據建模及MATLAB實現
3.1 雲模型
3.1.1 雲模型基礎知識
3.1.2 雲模型的MATLAB程序設計
3.2 Logistic回歸
3.2.1 Logistic模型
3.2.2 Logistic回歸MATLAB程序設計
3.3 主成分分析
3.3.1 PCA基本思想
3.3.2 PCA步驟
3.3.3 主成分分析MATLAB程序設計
3.4 支持向量機(SVM)
3.4.1 SVM基本思想
3.4.2 理論基礎
3.4.3 支持向量機MATLAB程序設計
3.5 K均值(KMeans)
3.5.1 KMeans原理、步驟和特點
3.5.2 KMeans聚類MATLAB程序設計
3.6 樸素貝葉斯判別法
3.6.1 樸素貝葉斯判別模型
3.6.2 樸素貝葉斯判別法MATLAB設計
3.7 數據建模綜合應用
參考文獻
第4章 灰色預測及其MATLAB實現
4.1 灰色系統基本理論
4.1.1 灰色關聯度矩陣
4.1.2 經典灰色模型GM(1,1)
4.1.3 灰色Verhulst模型
4.2 灰色系統的程序設計
4.2.1 灰色關聯度矩陣的程序設計
4.2.2 GM(1,1)的程序設計
4.2.3 灰色Verhulst模型的程序設計
4.3 灰色預測的MATLAB程序
4.3.1 典型程序結構
4.3.2 灰色預測程序說明
4.4 灰色預測應用實例
4.4.1 實例一長江水質的預測(CUMCM2005A)
4.4.2 實例二預測與會代表人數(CUMCM2009D)
4.5 小結
參考文獻
第5章 遺傳演算法及其MATLAB實現
5.1 遺傳演算法基本原理
5.1.1 人工智慧演算法概述
5.1.2 遺傳演算法生物學基礎
5.1.3 遺傳演算法的實現步驟
5.1.4 遺傳演算法的拓展
5.2 遺傳演算法的MATLAB程序設計
5.2.1 程序設計流程及參數選取
5.2.2 MATLAB遺傳演算法工具箱
5.3 遺傳演算法應用案例
5.3.1 案例一:無約束目標函數最大值遺傳演算法求解策略
5.3.2 案例二:CUMCM中多約束非線性規劃問題的求解
5.3.3 案例三:BEATbx遺傳演算法工具箱的應用——電子商務中轉化率影響因素研究
參考文獻
第6章 模擬退火演算法及其MATLAB實現
6.1 演算法的基本理論
6.1.1 演算法概述
6.1.2 基本思想
6.1.3 其他一些參數的說明
6.1.4 演算法基本步驟
6.1.5 幾點說明
6.2 演算法的MATLAB實現
6.2.1 演算法設計步驟
6.2.2 典型程序結構
6.3 應用實例:背包問題的求解
6.3.1 問題的描述
6.3.2 問題的求解
6.4 模擬退火程序包ASA簡介
6.4.1 ASA的優化實例
6.4.2 ASA的編譯
6.4.3 MATLAB版ASA的安裝與使用
6.5 小結
6.6 延伸閱讀
參考文獻
第7章 人工神經網路及其MATLAB實現
7.1 人工神經網路基本理論
7.1.1 人工神經網路模型拓撲結構
7.1.2 常用激勵函數
7.1.3 常見神經網路理論
7.2 BP神經網路的結構設計
7.2.1 鯊魚嗅聞血腥味與BP神經網路訓練
7.2.2 透視神經網路的學習步驟
7.2.3 BP神經網路的動態擬合過程
7.3 RBF神經網路的結構設計
7.3.1 梯度訓練法RBF神經網路的結構設計
7.3.2 RBF神經網路的性能
7.4 應用實例
7.4.1 基於MATLAB源程序公路運量預測
7.4.2 基於MATLAB工具箱公路運量預測
7.4.3 艾滋病治療最佳停葯時間的確定(CUMCM2006B)
7.4.4 RBF神經網路預測新客戶流失概率
7.5 延伸閱讀
7.5.1 從金融分析中的小數定理談神經網路的訓練樣本遴選規則
7.5.2 小議BP神經網路的衍生機理
參考文獻
第8章粒子群演算法及其MATLAB實現
8.1 PSO演算法相關知識
8.1.1 初識PSO演算法
8.1.2 PSO演算法的基本理論
8.1.3 PSO演算法的約束優化
8.1.4 PSO演算法的優缺點
8.2 PSO演算法程序設計
8.2.1 程序設計流程
8.2.2 PSO演算法的參數選取
8.2.3 PSO演算法MATLAB源程序範例
8.3 應用案例:基於PSO演算法和BP演算法訓練神經網路
8.3.1 如何評價網路的性能
8.3.2 BP演算法能夠搜索到極值的原理
8.3.3 PSOBP神經網路的設計指導原則
8.3.4 PSO演算法優化神經網路結構
8.3.5 PSOBP神經網路的實現
參考文獻
第9章 蟻群演算法及其MATLAB實現
9.1 蟻群演算法原理
9.1.1 蟻群演算法基本思想
9.1.2 蟻群演算法數學模型
9.1.3 蟻群演算法流程
9.2 蟻群演算法的MATLAB實現
9.2.1 實例背景
9.2.2 演算法設計步驟
9.2.3 MATLAB程序實現
9.2.4 程序執行結果與分析
9.3 演算法關鍵參數的設定
9.3.1 參數設定的准則
9.3.2 螞蟻數量
9.3.3 信息素因子
9.3.4 啟發函數因子
9.3.5 信息素揮發因子
9.3.6 信息素常數
9.3.7 最大迭代次數
9.3.8 組合參數設計策略
9.4 應用實例:最佳旅遊方案(蘇北賽2011B)
9.4.1 問題描述
9.4.2 問題的求解和結果
9.5 本章小結
參考文獻
第10章 小波分析及其MATLAB實現
10.1 小波分析基本理論
10.1.1 傅里葉變換的局限性
10.1.2 伸縮平移和小波變換
10.1.3 小波變換入門和多尺度分析
10.1.4 小波窗函數自適應分析
10.2 小波分析MATLAB程序設計
10.2.1 小波分析工具箱函數指令
10.2.2 小波分析程序設計綜合案例
10.3 小波分析應用案例
10.3.1 案例一:融合拓撲結構的小波神經網路
10.3.2 案例二:血管重建引出的圖像數字水印
參考文獻
第11章 計算機虛擬及其MATLAB實現
11.1 計算機虛擬基本知識
11.1.1 從3G移動互聯網協議WCDMA談MATLAB虛擬
11.1.2 計算機虛擬與數學建模
11.1.3 數值模擬與經濟效益博弈
11.2 數值模擬MATLAB程序設計
11.2.1 微分方程組模擬
11.2.2 服從概率分布的隨機模擬
11.2.3 蒙特卡羅模擬
11.3 動態模擬MATLAB程序設計
11.3.1 MATLAB音頻處理
11.3.2 MATLAB常規動畫實現
11.4 應用案例:四維水質模型
11.4.1 問題的提出
11.4.2 問題的分析
11.4.3 四維水質模型准備
11.4.4 條件假設與符號約定
11.4.5 四維水質模型的組建
11.4.6 模型求解
11.4.7 計算機模擬情境
參考文獻
下篇 真題演習
第12章 彩票中的數學(CUMCM2002B)
12.1 問題的提出
12.2 模型的建立
12.2.1 模型假設與符號說明
12.2.2 模型的准備
12.2.3 模型的建立
12.3 模型的求解
12.3.1 求解的思路
12.3.2 MATLAB程序
12.3.3 程序結果
12.4 技巧點評
參考文獻
第13章 露天礦卡車調度問題(CUMCM2003B)
13.1 問題的提出
13.2 基本假設與符號說明
13.2.1 基本假設
13.2.2 符號說明
13.3 問題分析及模型准備
13.4 原則①:數學模型(模型1)的建立與求解
13.4.1 模型的建立
13.4.2 模型求解
13.5 原則②:數學模型(模型2)的建立與求解
13.6 技巧點評
參考文獻
第14章 奧運會商圈規劃問題(CUMCM2004A)
14.1 問題的描述
14.2 基本假設、名詞約定及符號說明
14.2.1 基本假設
14.2.2 符號說明
14.2.3 名詞約定
14.3 問題分析與模型准備
14.3.1 基本思路
14.3.2 基本數學表達式的構建
14.4 設置MS網點數學模型的建立與求解
14.4.1 模型建立
14.4.2 模型求解
14.5 設置MS網點理論體系的建立
14.6 商區布局規劃的數學模型
14.6.1 模型建立
14.6.2 模型求解
14.7 模型的評價及使用說明
14.7.1 模型的優點
14.7.2 模型的缺點
14.8 技巧點評
參考文獻
第15章 交巡警服務平台的設置與調度(CUMCM2011B)
15.1 問題的提出
15.2 問題的分析
15.3 基本假設
15.4 問題1模型的建立與求解
15.4.1 交巡警服務平台管轄范圍分配
15.4.2 交巡警的調度
15.4.3 最佳新增服務平台設置
15.5 問題2模型的建立和求解
15.5.1 全市服務平台的合理性分析問題的模型與求解
15.5.2 搜捕嫌疑犯實例的模型與求解
15.6 模型的評價與改進
15.6.1 模型優點
15.6.2 模型缺點
15.7 技巧點評
參考文獻
第16章 葡萄酒的評價(CUMCM2012A)
16.1 問題的提出
16.2 基本假設
16.3 問題①模型的建立和求解
16.3.1 問題①的分析
16.3.2 模型的建立和求解
16.4 問題②模型的建立和求解
16.4.1 問題②的基本假設和分析
16.4.2 模型的建立和求解
16.5 問題③模型的建立和求解
16.5.1 問題③的分析
16.5.2 模型的建立和求解
16.6 問題④模型的建立和求解
16.6.1 問題④的分析
16.6.2 模型的建立和求解
16.7 論文點評
參考文獻
附件數學建模參賽經驗
一、如何准備數學建模競賽
二、數學建模隊員應該如何學習MATLAB
三、如何在數學建模競賽中取得好成績
四、數學建模競賽中的項目管理和時間管理
五、一種非常實用的數學建模方法——目標建模法
⑵ 多旅行商問題matlab程序
[code]function [R_best,L_best,L_ave,Shortest_Route,Shortest_Length]=ACATSP(C,NC_max,m,Alpha,Beta,Rho,Q)
%%=========================================================================
%% ACATSP.m
%% Ant Colony Algorithm for Traveling Salesman Problem
%% ChengAihua,PLA Information Engineering University,ZhengZhou,China
%% Email:[email protected]
%% All rights reserved
%%-------------------------------------------------------------------------
%% 主要符號說明
%% C n個城市的坐標,n×2的矩陣
%% NC_max 最大迭代次數
%% m 螞蟻個數
%% Alpha 表徵信息素重要程度的參數
%% Beta 表徵啟發式因子重要程度的參數
%% Rho 信息素蒸發系數
%% Q 信息素增加強度系數
%% R_best 各代最佳路線
%% L_best 各代最佳路線的長度
%%=========================================================================
%%第一步:變數初始化
n=size(C,1);%n表示問題的規模(城市個數)
D=zeros(n,n);%D表示完全圖的賦權鄰接矩陣
for i=1:n
for j=1:n
if i~=j
D(i,j)=((C(i,1)-C(j,1))^2+(C(i,2)-C(j,2))^2)^0.5;
else
D(i,j)=eps;
end
D(j,i)=D(i,j);
end
end
Eta=1./D;%Eta為啟發因子,這里設為距離的倒數
Tau=ones(n,n);%Tau為信息素矩陣
Tabu=zeros(m,n);%存儲並記錄路徑的生成
NC=1;%迭代計數器
R_best=zeros(NC_max,n);%各代最佳路線
L_best=inf.*ones(NC_max,1);%各代最佳路線的長度
L_ave=zeros(NC_max,1);%各代路線的平均長度
while NC<=NC_max%停止條件之一:達到最大迭代次數
%%第二步:將m只螞蟻放到n個城市上
Randpos=[];
for i=1:(ceil(m/n))
Randpos=[Randpos,randperm(n)];
end
Tabu(:,1)=(Randpos(1,1:m))';
%%第三步:m只螞蟻按概率函數選擇下一座城市,完成各自的周遊
for j=2:n
for i=1:m
visited=Tabu(i,1:(j-1));%已訪問的城市
J=zeros(1,(n-j+1));%待訪問的城市
P=J;%待訪問城市的選擇概率分布
Jc=1;
for k=1:n
if length(find(visited==k))==0
J(Jc)=k;
Jc=Jc+1;
end
end
%下面計算待選城市的概率分布
for k=1:length(J)
P(k)=(Tau(visited(end),J(k))^Alpha)*(Eta(visited(end),J(k))^Beta);
end
P=P/(sum(P));
%按概率原則選取下一個城市
Pcum=cumsum(P);
Select=find(Pcum>=rand);
to_visit=J(Select(1));
Tabu(i,j)=to_visit;
end
end
if NC>=2
Tabu(1,:)=R_best(NC-1,:);
end
%%第四步:記錄本次迭代最佳路線
L=zeros(m,1);
for i=1:m
R=Tabu(i,:);
for j=1:(n-1)
L(i)=L(i)+D(R(j),R(j+1));
end
L(i)=L(i)+D(R(1),R(n));
end
L_best(NC)=min(L);
pos=find(L==L_best(NC));
R_best(NC,:)=Tabu(pos(1),:);
L_ave(NC)=mean(L);
NC=NC+1
%%第五步:更新信息素
Delta_Tau=zeros(n,n);
for i=1:m
for j=1:(n-1)
Delta_Tau(Tabu(i,j),Tabu(i,j+1))=Delta_Tau(Tabu(i,j),Tabu(i,j+1))+Q/L(i);
end
Delta_Tau(Tabu(i,n),Tabu(i,1))=Delta_Tau(Tabu(i,n),Tabu(i,1))+Q/L(i);
end
Tau=(1-Rho).*Tau+Delta_Tau;
%%第六步:禁忌表清零
Tabu=zeros(m,n);
end
%%第七步:輸出結果
Pos=find(L_best==min(L_best));
Shortest_Route=R_best(Pos(1),:)
Shortest_Length=L_best(Pos(1))
subplot(1,2,1)
DrawRoute(C,Shortest_Route)
subplot(1,2,2)
plot(L_best)
hold on
plot(L_ave)
function DrawRoute(C,R)
%%=========================================================================
%% DrawRoute.m
%% 畫路線圖的子函數
%%-------------------------------------------------------------------------
%% C Coordinate 節點坐標,由一個N×2的矩陣存儲
%% R Route 路線
%%=========================================================================
N=length(R);
scatter(C(:,1),C(:,2));
hold on
plot([C(R(1),1),C(R(N),1)],[C(R(1),2),C(R(N),2)])
hold on
for ii=2:N
plot([C(R(ii-1),1),C(R(ii),1)],[C(R(ii-1),2),C(R(ii),2)])
hold on
end
設置初始參數如下:
m=31;Alpha=1;Beta=5;Rho=0.1;NC_max=200;Q=100;
31城市坐標為:
1304 2312
3639 1315
4177 2244
3712 1399
3488 1535
3326 1556
3238 1229
4196 1004
4312 790
4386 570
3007 1970
2562 1756
2788 1491
2381 1676
1332 695
3715 1678
3918 2179
4061 2370
3780 2212
3676 2578
4029 2838
4263 2931
3429 1908
3507 2367
3394 2643
3439 3201
2935 3240
3140 3550
2545 2357
2778 2826
2370 2975[/code]
運行後得到15602的巡遊路徑,路線圖和收斂曲線如下:
⑶ 在MATLAB中用蟻群演算法求解TSP問題,在經典的代碼中有Tabu(1,:)=R_best(NC-1,:)。不明白代碼的目的。
正在做。我是這樣理解的:
if NC >= 2
Tabu(1,:) = R_best(NC-1,:);
%把上一次迭代中最佳路線經歷的城市放到本次Tabu的第一行
%相當是加了一個約束條件,如果本次迭代的情況不好,至少不會按照不好的最優解去更新信息素,讓下次的情況更差
end
⑷ matlab中蟻群演算法的個體適應度函數指的是什麼意思
蟻群演算法求最小距離航路,個體適應度函數指個體完成一條路線的距離值, 圖上看到最優值是在不斷進化減小的.
⑸ 用VB或者MATLAB在一個矩形內生成一個固定點和幾個隨機點,再求出從固定點經過所有隨機點回來後的最短路徑
這個並非一般的最短路徑問題,而是旅行商問題(Traveling Saleman Problem,TSP)。旅行商問題屬於NP完全問題,如果問題規模比較大,至今沒有太有效的演算法。
這里提供一個蟻群演算法的程序,參考:
http://..com/question/175608123.html
根據你的問題做了少量改動,具體代碼如下:
functionTSP
%TSP旅行商問題
%設置初始參數如下:
m=10;Alpha=1;Beta=5;Rho=0.1;NC_max=200;Q=100;
%生成隨機點,第一個點視為固定點
C=[0.50.5];
C(2:10,:)=rand(9,2);
%調用蟻群演算法求解
[R_best,L_best,L_ave,Shortest_Route,Shortest_Length]=ACATSP(C,NC_max,m,Alpha,Beta,Rho,Q);
function[R_best,L_best,L_ave,Shortest_Route,Shortest_Length]=ACATSP(C,NC_max,m,Alpha,Beta,Rho,Q)
%%=========================================================================
%%ACATSP.m
%%
%%ChengAihua,,ZhengZhou,China
%%Email:[email protected]
%%Allrightsreserved
%%-------------------------------------------------------------------------
%%主要符號說明
%%Cn個城市的坐標,n×2的矩陣
%%NC_max最大迭代次數
%%m螞蟻個數
%%Alpha表徵信息素重要程度的參數
%%Beta表徵啟發式因子重要程度的參數
%%Rho信息素蒸發系數
%%Q信息素增加強度系數
%%R_best各代最佳路線
%%L_best各代最佳路線的長度
%%=========================================================================
%%第一步:變數初始化
n=size(C,1);%n表示問題的規模(城市個數)
D=zeros(n,n);%D表示完全圖的賦權鄰接矩陣
fori=1:n
forj=1:n
ifi~=j
D(i,j)=((C(i,1)-C(j,1))^2+(C(i,2)-C(j,2))^2)^0.5;
else
D(i,j)=eps;
end
D(j,i)=D(i,j);
end
end
Eta=1./D;%Eta為啟發因子,這里設為距離的倒數
Tau=ones(n,n);%Tau為信息素矩陣
Tabu=zeros(m,n);%存儲並記錄路徑的生成
NC=1;%迭代計數器
R_best=zeros(NC_max,n);%各代最佳路線
L_best=inf.*ones(NC_max,1);%各代最佳路線的長度
L_ave=zeros(NC_max,1);%各代路線的平均長度
whileNC<=NC_max%停止條件之一:達到最大迭代次數
%%第二步:將m只螞蟻放到n個城市上
Randpos=[];
fori=1:(ceil(m/n))
Randpos=[Randpos,randperm(n)];
end
Tabu(:,1)=(Randpos(1,1:m))';
%%第三步:m只螞蟻按概率函數選擇下一座城市,完成各自的周遊
forj=2:n
fori=1:m
visited=Tabu(i,1:(j-1));%已訪問的城市
J=zeros(1,(n-j+1));%待訪問的城市
P=J;%待訪問城市的選擇概率分布
Jc=1;
fork=1:n
iflength(find(visited==k))==0
J(Jc)=k;
Jc=Jc+1;
end
end
%下面計算待選城市的概率分布
fork=1:length(J)
P(k)=(Tau(visited(end),J(k))^Alpha)*(Eta(visited(end),J(k))^Beta);
end
P=P/(sum(P));
%按概率原則選取下一個城市
Pcum=cumsum(P);
Select=find(Pcum>=rand);
to_visit=J(Select(1));
Tabu(i,j)=to_visit;
end
end
ifNC>=2
Tabu(1,:)=R_best(NC-1,:);
end
%%第四步:記錄本次迭代最佳路線
L=zeros(m,1);
fori=1:m
R=Tabu(i,:);
forj=1:(n-1)
L(i)=L(i)+D(R(j),R(j+1));
end
L(i)=L(i)+D(R(1),R(n));
end
L_best(NC)=min(L);
pos=find(L==L_best(NC));
R_best(NC,:)=Tabu(pos(1),:);
L_ave(NC)=mean(L);
NC=NC+1
%%第五步:更新信息素
Delta_Tau=zeros(n,n);
fori=1:m
forj=1:(n-1)
Delta_Tau(Tabu(i,j),Tabu(i,j+1))=Delta_Tau(Tabu(i,j),Tabu(i,j+1))+Q/L(i);
end
Delta_Tau(Tabu(i,n),Tabu(i,1))=Delta_Tau(Tabu(i,n),Tabu(i,1))+Q/L(i);
end
Tau=(1-Rho).*Tau+Delta_Tau;
%%第六步:禁忌表清零
Tabu=zeros(m,n);
end
%%第七步:輸出結果
Pos=find(L_best==min(L_best));
Shortest_Route=R_best(Pos(1),:)
Shortest_Length=L_best(Pos(1))
%繪圖顯示結果
clf
subplot(1,2,1)
DrawRoute(C,Shortest_Route)
subplot(1,2,2)
plot(L_best)
holdon
plot(L_ave)
functionDrawRoute(C,R)
%%=========================================================================
%%DrawRoute.m
%%畫路線圖的子函數
%%-------------------------------------------------------------------------
%%CCoordinate節點坐標,由一個N×2的矩陣存儲
%%RRoute路線
%%=========================================================================
%原來的繪圖語句太繁瑣,改用這一句就可以了
plot(C([RR(1)],1),C([RR(1)],2),'o-')
%標明固定點
holdon
plot(C(1,1),C(1,2),'ro')
由於點是隨機生成的,每次運行的結果都不同,下面是某次運行的結果(紅點為固定點)。
⑹ 《蟻群演算法在MATLAB中的實現》
語法結構和c差不多,你可以在矩陣操作上多下一下功夫。
⑺ 急求蟻群演算法matlab工具箱,多謝了。
直接在命令窗口裡邊輸入gatool就行了,用遺傳演算法還可以使用ga函數,具體使用格式可以在help系統里看ga,你還可以按照如下步驟打開遺傳演算法工具箱:1,打開MATLAB,2點擊左下方的START按鈕 3,點toolboxes,打開後選擇Genetic Algorithm and Direct Search 然後就可以進入gatool了,然後就會彈出ga工具箱(註:我的版本是7.7的,不同版本可能不同),希望對你有用哈!
⑻ 蟻群演算法求解TSP問題的源程序及簡要說明
簡單蟻群演算法求解TSP的源程序(我幫你找的)
蟻群演算法是新興的仿生演算法,最初是由義大利學者Dorigo M於1991年首次提出,由於具有較強的魯棒性,優良的分布式計算機制和易於與其它方法結合等優點,成為人工智慧領域的一個研究熱點。本程序是實現簡單的蟻群演算法,TSP問題取的是att48,可從http://www.iwr.uni-heidelberg.de/groups/comopt/software/TSPLIB95獲取,程序運行時間可能會比較長,在我的這台CPU 1.6G+內存256M的機器上運行時間大概是13分鍾左右。我用的語言是MATLAB 7.1。此程序僅供學習所用,如有問題請反饋。謝謝。(註:程序沒有計算最後一個城市回來起點城市的距離)
function [y,val]=QACS
tic
load att48 att48;
MAXIT=300; % 最大循環次數
NC=48; % 城市個數
tao=ones(48,48);% 初始時刻各邊上的信息最為1
rho=0.2; % 揮發系數
alpha=1;
beta=2;
Q=100;
mant=20; % 螞蟻數量
iter=0; % 記錄迭代次數
for i=1:NC % 計算各城市間的距離
for j=1:NC
distance(i,j)=sqrt((att48(i,2)-att48(j,2))^2+(att48(i,3)-att48(j,3))^2);
end
end
bestroute=zeros(1,48); % 用來記錄最優路徑
routelength=inf; % 用來記錄當前找到的最優路徑長度
% for i=1:mant % 確定各螞蟻初始的位置
% end
for ite=1:MAXIT
for ka=1:mant %考查第K只螞蟻
deltatao=zeros(48,48); % 第K只螞蟻移動前各邊上的信息增量為零
[routek,lengthk]=travel(distance,tao,alpha,beta);
if lengthk<routelength % 找到一條更好的路徑
routelength=lengthk;
bestroute=routek;
end
for i=1:NC-1 % 第K只螞蟻在路徑上釋放的信息量
deltatao(routek(i),routek(i+1))=deltatao(routek(i),routek(i+1))+Q/lengthk;
end
deltatao(routek(48),1)=deltatao(routek(48),1)+Q/lengthk;
end
for i=1:NC-1
for j=i+1:NC
if deltatao(i,j)==0
deltatao(i,j)=deltatao(j,i);
end
end
end
tao=(1-rho).*tao+deltatao;
end
y=bestroute;
val=routelength;
toc
function [y,val]=travel(distance,tao,alpha,beta) % 某隻螞蟻找到的某條路徑
[m,n]=size(distance);
p=fix(m*rand)+1;
val=0; % 初始路徑長度設為 0
tabuk=[p]; % 假設該螞蟻都是從第 p 個城市出發的
for i=1:m-1
np=tabuk(length(tabuk)); % 螞蟻當前所在的城市號
p_sum=0;
for j=1:m
if isin(j,tabuk)
continue;
else
ada=1/distance(np,j);
p_sum=p_sum+tao(np,j)^alpha*ada^beta;
end
end
cp=zeros(1,m); % 轉移概率
for j=1:m
if isin(j,tabuk)
continue;
else
ada=1/distance(np,j);
cp(j)=tao(np,j)^alpha*ada^beta/p_sum;
end
end
NextCity=pchoice(cp);
tabuk=[tabuk,NextCity];
val=val+distance(np,NextCity);
end
y=tabuk;
function y=isin(x,A) % 判斷數 x 是否在向量 A 中,如在返回 1 ,否則返回 0
y=0;
for i=1:length(A)
if A(i)==x
y=1;
break;
end
end
function y=pchoice(A)
a=rand;
tempA=zeros(1,length(A)+1);
for i=1:length(A)
tempA(i+1)=tempA(i)+A(i);
end
for i=2:length(tempA)
if a<=tempA(i)
y=i-1;
break;
end
end
⑼ 求MATLAB程序80以上,有中文注釋!!
蟻群演算法解決vrp問題
%
the
procere
of
ant
colony
algorithm
for
VRP
%
%
%
%
%
%
%
%
%
%
%
%
%initialize
the
parameters
of
ant
colony
algorithms
%
load
data.txt;
%
d=data(:,2:3);
%
g=data(:,4);
g=1:32;d=2:33;
m=31;
%
螞蟻數
alpha=1;
belta=4;%
決定tao和miu重要性的參數
lmda=0;
rou=0.9;%衰減系數
q0=0.95;
%
概率
tao0=1/(31*841.04);%初始信息素
Q=1;%
螞蟻循環一周所釋放的信息素
defined_phrm=15.0;
%
initial
pheromone
level
value
QV=100;
%
車輛容量
vehicle_best=round(sum(g)/QV)+1;%所完成任務所需的最少車數
V=40;
%
計算兩點的距離
for
i=1:32;
for
j=1:32;
%
dist(i,j)=sqrt((d(i,1)-d(j,1))^2+(d(i,2)-d(j,2))^2);
dist(i,j)=i+j+2;
end;
end;
%給tao
miu賦初值
for
i=1:32;
for
j=1:32;
if
i~=j;
%s(i,j)=dist(i,1)+dist(1,j)-dist(i,j);
tao(i,j)=defined_phrm;
miu(i,j)=1/dist(i,j);
end;
end;
end;
for
k=1:32;
for
k=1:32;
deltao(i,j)=0;
end;
end;
best_cost=10000;
for
n_gen=1:50;
print_head(n_gen);
for
i=1:m;
%best_solution=[];
print_head2(i);
sumload=0;
cur_pos(i)=1;
rn=randperm(32);
n=1;
nn=1;
part_sol(nn)=1;
%cost(n_gen,i)=0.0;
n_sol=0;
%
由螞蟻產生的路徑數量
M_vehicle=500;
t=0;
%最佳路徑數組的元素數為0
while
sumload<=QV;
for
k=1:length(rn);
if
sumload+g(rn(k))<=QV;
gama(cur_pos(i),rn(k))=(sumload+g(rn(k)))/QV;
A(n)=rn(k);
n=n+1;
end;
end;
fid=fopen('out_customer.txt','a+');
fprintf(fid,'%s
%i\t','the
current
position
is:',cur_pos(i));
fprintf(fid,'\n%s','the
possible
customer
set
is:')
fprintf(fid,'\t%i\n',A);
fprintf(fid,'------------------------------\n');
fclose(fid);
p=compute_prob(A,cur_pos(i),tao,miu,alpha,belta,gama,lmda,i);
maxp=1e-8;
na=length(A);
for
j=1:na;
if
p(j)>maxp
maxp=p(j);
index_max=j;
end;
end;
old_pos=cur_pos(i);
if
rand(1)<q0
cur_pos(i)=A(index_max);
else
krnd=randperm(na);
cur_pos(i)=A(krnd(1));
bbb=[old_pos
cur_pos(i)];
ccc=[1
1];
if
bbb==ccc;
cur_pos(i)=A(krnd(2));
end;
end;
tao(old_pos,cur_pos(i))=taolocalupdate(tao(old_pos,cur_pos(i)),rou,tao0);%對所經弧進行局部更新
sumload=sumload+g(cur_pos(i));
nn=nn+1;
part_sol(nn)=cur_pos(i);
temp_load=sumload;
if
cur_pos(i)~=1;
rn=setdiff(rn,cur_pos(i));
n=1;
A=[];
end;
if
cur_pos(i)==1;
%
如果當前點為車場,將當前路徑中的已訪問用戶去掉後,開始產生新路徑
if
setdiff(part_sol,1)~=[];
n_sol=n_sol+1;
%
表示產生的路徑數,n_sol=1,2,3,..5,6...,超過5條對其費用加上車輛的派遣費用
fid=fopen('out_solution.txt','a+');
fprintf(fid,'%s%i%s','NO.',n_sol,'條路徑是:');
fprintf(fid,'%i
',part_sol);
fprintf(fid,'\n');
fprintf(fid,'%s','當前的用戶需求量是:');
fprintf(fid,'%i\n',temp_load);
fprintf(fid,'------------------------------\n');
fclose(fid);
%
對所得路徑進行路徑內3-opt優化
final_sol=exchange(part_sol);
for
nt=1:length(final_sol);
%
將所有產生的路徑傳給一個數組
temp(t+nt)=final_sol(nt);
end;
t=t+length(final_sol)-1;
sumload=0;
final_sol=setdiff(final_sol,1);
rn=setdiff(rn,final_sol);
part_sol=[];
final_sol=[];
nn=1;
part_sol(nn)=cur_pos(i);
A=[];
n=1;
end;
end;
if
setdiff(rn,1)==[];%
產生最後一條終點不為1的路徑
n_sol=n_sol+1;
nl=length(part_sol);
part_sol(nl+1)=1;%將路徑的最後1位補1
%
對所得路徑進行路徑內3-opt優化
final_sol=exchange(part_sol);
for
nt=1:length(final_sol);
%
將所有產生的路徑傳給一個數組
temp(t+nt)=final_sol(nt);
end;
cost(n_gen,i)=cost_sol(temp,dist)+M_vehicle*(n_sol-vehicle_best);
%計算由螞蟻i產生的路徑總長度
for
ki=1:length(temp)-1;
deltao(temp(ki),temp(ki+1))=deltao(temp(ki),temp(ki+1))+Q/cost(n_gen,i);
end;
if
cost(n_gen,i)<best_cost;
best_cost=cost(n_gen,i);
old_cost=best_cost;
best_gen=n_gen;
%
產生最小費用的代數
best_ant=i;
%產生最小費用的螞蟻
best_solution=temp;
end;
if
i==m;%如果所有螞蟻均完成一次循環,,則用最佳費用所對應的路徑對弧進行整體更新
for
ii=1:32;
for
jj=1:32;
tao(ii,jj)=(1-rou)*tao(ii,jj);
end;
end;
for
kk=1:length(best_solution)-1;
tao(best_solution(kk),best_solution(kk+1))=tao(best_solution(kk),best_solution(kk+1))+deltao(best_solution(kk),best_solution(kk+1));
end;
end;
fid=fopen('out_solution.txt','a+');
fprintf(fid,'%s%i%s','NO.',n_sol,'路徑是:');
fprintf(fid,'%i
',part_sol);
fprintf(fid,'\n');
fprintf(fid,'%s
%i\n','當前的用戶需求量是:',temp_load);
fprintf(fid,'%s
%f\n','總費用是:',cost(n_gen,i));
fprintf(fid,'------------------------------\n');
fprintf(fid,'%s\n','最終路徑是:');
fprintf(fid,'%i-',temp);
fprintf(fid,'\n');
fclose(fid);
temp=[];
break;
end;
end;
end;
end;
⑽ 求助Matlab蟻群演算法求一般函數極值的演算法
function [ROUTES,PL,Tau]=ACASP(G,Tau,K,M,S,E,Alpha,Beta,Rho,Q)
%% ---------------------------------------------------------------
% ACASP.m
% 蟻群演算法動態尋路演算法
% ChengAihua,PLA Information Engineering University,ZhengZhou,China
% Email:[email protected]
% All rights reserved
%% ---------------------------------------------------------------
% 輸入參數列表
% G 地形圖為01矩陣,如果為1表示障礙物
% Tau 初始信息素矩陣(認為前面的覓食活動中有殘留的信息素)
% K 迭代次數(指螞蟻出動多少波)
% M 螞蟻個數(每一波螞蟻有多少個)
% S 起始點(最短路徑的起始點)
% E 終止點(最短路徑的目的點)
% Alpha 表徵信息素重要程度的參數
% Beta 表徵啟發式因子重要程度的參數
% Rho 信息素蒸發系數
% Q 信息素增加強度系數
%
% 輸出參數列表
% ROUTES 每一代的每一隻螞蟻的爬行路線
% PL 每一代的每一隻螞蟻的爬行路線長度
% Tau 輸出動態修正過的信息素
%% --------------------變數初始化----------------------------------
%load
D=G2D(G);
N=size(D,1);%N表示問題的規模(象素個數)
MM=size(G,1);
a=1;%小方格象素的邊長
Ex=a*(mod(E,MM)-0.5);%終止點橫坐標
if Ex==-0.5
Ex=MM-0.5;
end
Ey=a*(MM+0.5-ceil(E/MM));%終止點縱坐標
Eta=zeros(1,N);%啟發式信息,取為至目標點的直線距離的倒數
%下面構造啟發式信息矩陣
for i=1:N
if ix==-0.5
ix=MM-0.5;
end
iy=a*(MM+0.5-ceil(i/MM));
if i~=E
Eta(1,i)=1/((ix-Ex)^2+(iy-Ey)^2)^0.5;
else
Eta(1,i)=100;
end
end
ROUTES=cell(K,M);%用細胞結構存儲每一代的每一隻螞蟻的爬行路線
PL=zeros(K,M);%用矩陣存儲每一代的每一隻螞蟻的爬行路線長度
%% -----------啟動K輪螞蟻覓食活動,每輪派出M只螞蟻--------------------
for k=1:K
disp(k);
for m=1:M
%% 第一步:狀態初始化
W=S;%當前節點初始化為起始點
Path=S;%爬行路線初始化
PLkm=0;%爬行路線長度初始化
TABUkm=ones(1,N);%禁忌表初始化
TABUkm(S)=0;%已經在初始點了,因此要排除
DD=D;%鄰接矩陣初始化
%% 第二步:下一步可以前往的節點
DW=DD(W,:);
DW1=find(DW
for j=1:length(DW1)
if TABUkm(DW1(j))==0
DW(j)=inf;
end
end
LJD=find(DW
Len_LJD=length(LJD);%可選節點的個數
%% 覓食停止條件:螞蟻未遇到食物或者陷入死胡同
while W~=E&&Len_LJD>=1
%% 第三步:轉輪賭法選擇下一步怎麼走
PP=zeros(1,Len_LJD);
for i=1:Len_LJD
PP(i)=(Tau(W,LJD(i))^Alpha)*(Eta(LJD(i))^Beta);
end
PP=PP/(sum(PP));%建立概率分布
Pcum=cumsum(PP);
Select=find(Pcum>=rand);
%% 第四步:狀態更新和記錄
Path=[Path,to_visit];%路徑增加
PLkm=PLkm+DD(W,to_visit);%路徑長度增加
W=to_visit;%螞蟻移到下一個節點
for kk=1:N
if TABUkm(kk)==0
DD(W,kk)=inf;
DD(kk,W)=inf;
end
end
TABUkm(W)=0;%已訪問過的節點從禁忌表中刪除
for j=1:length(DW1)
if TABUkm(DW1(j))==0
DW(j)=inf;
end
end
LJD=find(DW
Len_LJD=length(LJD);%可選節點的個數
end
%% 第五步:記下每一代每一隻螞蟻的覓食路線和路線長度
ROUTES{k,m}=Path;
if Path(end)==E
PL(k,m)=PLkm;
else
PL(k,m)=inf;
end
end
%% 第六步:更新信息素
Delta_Tau=zeros(N,N);%更新量初始化
for m=1:M
if PL(k,m) ROUT=ROUTES{k,m};
TS=length(ROUT)-1;%跳數
PL_km=PL(k,m);
for s=1:TS
x=ROUT(s);
Delta_Tau(y,x)=Delta_Tau(y,x)+Q/PL_km;
end
end
end
Tau=(1-Rho).