Ⅰ 遺傳演算法、粒子群演算法、蟻群演算法,各自優缺點和如何混合請詳細點 謝謝
遺傳演算法適合求解離散問題,具備數學理論支持,但是存在著漢明懸崖等問題。
粒子群演算法適合求解實數問題,演算法簡單,計算方便,求解速度快,但是存在著陷入局部最優等問題。
蟻群演算法適合在圖上搜索路徑問題,計算開銷會大。
要將三種演算法進行混合,就要針對特定問題,然後融合其中的優勢,比如將遺傳演算法中的變異運算元加入粒子群中就可以形成基於變異的粒子群演算法。
Ⅱ 蟻群演算法中轉移概率是怎麼用的.不同的螞蟻為什麼會選擇不同的路徑
因為不同路徑的信息素和啟發信息不同,所以向每條路徑轉移的概率也不同;
具體實現可以運用輪盤賭選擇,轉移概率越大的路徑就會有更多的螞蟻選擇.。
Prime 演算法和 Kruskal 演算法都是用來求加權連通簡單圖中權和最小的支撐樹(即最小樹)的,Prime演算法的時間復雜度為O(n^2) (n 為耐仿慎頂點數),Kruskal 演算法的時間復雜度為 O(eln(e)) (e為邊數),這兩種演算法都昌敬是多項式時間演算法,也就是說,最小樹問題已經有了有效演算法去求解,屬於P問題。
Dijkstra 演算法求解的是加權連通簡單圖中一個頂點到其它每個頂點的具有最小權和的有向路,最簡單版本的時間復雜度是O(n^2),也是多項式時間演算法。
而蟻群演算法是一種近似算大橘法,它不是用來解決已存在精確有效演算法的問題的,而是用來解決至今沒有找到精確的有效演算法的問題的,比如旅行商問題(TSP)。
旅行商問題也可以說是求「最短路徑」,但它是求一個完全圖的最小哈密頓圈,這個問題至今未找到多項式時間演算法,屬於NPC問題,也就是說,當問題規模稍大一點,現有的精確演算法的運算量就會急劇增加。
文中的某些觀點引自知乎大神余幸恩,感謝幫忙!~
Ⅲ 群智能演算法有哪些
群智能演算法主要包括蟻群演算法(Ant Colony Optimization)、粒子群優化演算法(Particle Swarm Optimization)、人工蜂群演算法(Artificial Bee Colony Algorithm)等。
蟻群演算法是一種模擬自然界蟻群覓食行為的優化演算法。它通過模擬螞蟻尋找食物過程中的信息素傳遞和路徑選擇機制,來解決一些優化問題。蟻群演算法常用於解決旅行商問題、車輛路徑問題等典型的組合優化問題。其通過個體間的信息傳遞和協同工作,能夠在復雜的解空間中找到近似最優解。
粒子群優化演算法是一種基於群體智能的優化技術,模擬鳥群、魚群等生物群體行為的一種優化演算法。它通過模擬鳥群飛行的過程,讓粒子在解空間內搜索最優解。粒子群優化演算法具有較強的全局搜索能力,能夠處理復雜的優化問題,特別是在連續函數優化、神經網路訓練等領域有廣泛應用。
人工蜂群演算法是一種模擬蜜蜂采蜜行為的優化演算法。它採用蜜蜂分工合作的機制,通過模擬蜜蜂採集花蜜和傳遞信息的過程來解決優化問題。人工蜂群演算法具有良好的全局搜索能力和並行計算能力,能夠處理多峰問題和動態環境的問題,常用於求解大規模多變數非線性函數的優化問題。此外,它也常被應用於求解多維背包問題等具有約束條件的優化問題。它的求解效率和性能在不同的應用中都有所表現,被認為是一種非常有前途的智能優化演算法。
以上這些群智能演算法在解決復雜的優化問題時都有良好的表現,通過模擬自然界的群體行為來發揮集體智慧的優勢,從而在求解過程中獲得較好的效果。
Ⅳ 蟻群演算法與遺傳演算法的區別
都屬於智能優化演算法
但是蟻群演算法具有一定的記憶性,遺傳演算法沒有
蟻群演算法有幾種原則,比如覓食原則,避障原則等,遺傳演算法沒有
蟻群演算法屬於群智能優化演算法,具有並行性,每個粒子都可以主動尋優,遺傳演算法不行
蟻群演算法基於信息素在環境中的指示,遺傳演算法是基於優勝劣汰的生物進化思想
遺傳演算法有選擇,交叉,變異三種運算元,每種運算元又有各自的不同方法,通過對運算元方法的修改和搭配,可以得到不同的改進遺傳演算法
蟻群演算法則多和其他智能演算法相結合,得到改進的蟻群演算法
Ⅳ 蟻群演算法求解TSP問題的源程序及簡要說明
該程序試圖對具有31個城市的VRP進行求解,已知的最優解為784.1,我用該程序只能優化到810左右,應該是陷入局部最優,但我不知問題出在什麼地方。請用過蟻群演算法的高手指教。
蟻群演算法的matlab源碼,同時請指出為何不能優化到已知的最好解
%
%
% 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);
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);
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;
我現在也在研究它,希望能共同進步.建義可以看一下段海濱的關於蟻群演算法的書.講的不錯,李士勇的也可以,還有一本我在圖書館見過,記不得名字了.
Ⅵ 急求蟻群演算法解決 VRPTW問題的matlab代碼,最好是ACS或者MMAS的!
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=length(C); %n 為市個數
for i=1:n %坐標矩陣轉換為距離矩陣
for j=1:n
D(i,j)=sqrt((x(i,1)-x(j,1))^2+(x(i,2)-x(j,2))^2);
end
end
for i=1:n %Eta為啟發因子,這里設為距離的倒數
for j=1:n %原文作者少考慮的當D=0是MATLAB提示出錯
if i~=j
Eta(i,j)=1./D(i,j);
end
end
end
for i=1:n
Eta(i,i)=0;
end
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));
DrawRoute(C,Shortest_Route) %調用函數繪圖