蟻群算法matlab vrp問題車輛限重,蟻群算法MATLAB解VRP問題

c0db2b7620c4a39923498594eb0fd491.png

Excel? exp12_3_2.xls內容:

93acae6da0bc8c76f72db7d9afb7060e.png

ANT_VRP函數:

function [R_best,L_best,L_ave,Shortest_Route,Shortest_Length]=ANT_VRP(D,Demand,Cap,iter_max,m,Alpha,Beta,Rho,Q)

%% R_best 各代最佳路線

%% L_best 各代最佳路線的長度

%% L_ave 各代平均距離

%% Shortest_Route 最短路徑

%% Shortest_Length 最短路徑長度

%% D 城市間之間的距離矩陣,為對稱矩陣

%% Demand 客戶需求量

%% Cap 車輛最大載重

%% iter_max 最大迭代次數

%% m 螞蟻個數

%% Alpha 表征信息素重要程度的參數

%% Beta 表征啟發式因子重要程度的參數

%% Rho 信息素蒸發系數

%% Q 信息素增加強度系數

n=size(D,1);

T=zeros(m,2*n); %裝載距離

Eta=ones(m,2*n); %啟發因子

Tau=ones(n,n); %信息素

Tabu=zeros(m,n); %禁忌表

Route=zeros(m,2*n); %路徑

L=zeros(m,1); %總路程

L_best=zeros(iter_max,1); %各代最佳路線長度

R_best=zeros(iter_max,2*n); %各代最佳路線

nC=1;

while nC<=iter_max %停止條件

Eta=zeros(m,2*n);

T=zeros(m,2*n);

Tabu=zeros(m,n);

Route=zeros(m,2*n);

L=zeros(m,1);

%%%%%%==============初始化起點城市(禁忌表)====================

for i=1:m

Cap_1=Cap; %最大裝載量

j=1;

j_r=1;

while Tabu(i,n)==0

T=zeros(m,2*n); %裝載量加載矩陣

Tabu(i,1)=1; %禁忌表起點位置為1

Route(i,1)=1; %路徑起點位置為1

visited=find(Tabu(i,:)>0); %已訪問城市

num_v=length(visited); %已訪問城市個數

J=zeros(1,(n-num_v)); %待訪問城市加載表

P=J; %待訪問城市選擇概率分布

Jc=1; %待訪問城市選擇指針

for k=1:n %城市

if length(find(Tabu(i,:)==k))==0 %如果k不是已訪問城市代號,就將k加入矩陣J中

J(Jc)=k;

Jc=Jc+1;

end

end

%%%%%%%=============每只螞蟻按照選擇概率遍歷所有城市==================

for k=1:n-num_v %待訪問城市

if Cap_1-Demand(J(1,k),1)>=0 %如果車輛裝載量大于待訪問城市需求量

if Route(i,j_r)==1 %如果每只螞蟻在起點城市

T(i,k)=D(1,J(1,k));

P(k)=(Tau(1,J(1,k))^Alpha)*((1/T(i,k))^Beta); %概率計算公式中的分子

else %如果每只螞蟻在不在起點城市

T(i,k)=D(Tabu(i,j),J(1,k));

P(k)=(Tau(Tabu(i,visited(end)),J(1,k))^Alpha)*((1/T(i,k))^Beta); %概率計算公式中的分子

end

else %如果車輛裝載量小于待訪問城市需求量

T(i,k)=0;

P(k)=0;

end

end

if length(find(T(i,:)>0))==0 %%%當車輛裝載量小于待訪問城市時,選擇起點為1

Cap_1=Cap;

j_r=j_r+1;

Route(i,j_r)=1;

L(i)=L(i)+D(1,Tabu(i,visited(end)));

else

P=P/(sum(P)); %按照概率原則選取下一個城市

Pcum=cumsum(P); %求累積概率和:cumsum([1 2 3])=1 3 6,目的在于使得Pcum的值總有大于rand的數

Select=find(Pcum>rand); %按概率選取下一個城市:當累積概率和大于給定的隨機數,則選擇求和被加上的最后一個城市作為即將訪問的城市

o_visit=J(1,Select(1)); %待訪問城市

j=j+1;

j_r=j_r+1;

Tabu(i,j)=o_visit; %待訪問城市

Route(i,j_r)=o_visit;

Cap_1=Cap_1-Demand(o_visit,1); %車輛裝載剩余量

L(i)=L(i)+T(i,Select(1)); %路徑長度

end

end

L(i)=L(i)+D(Tabu(i,n),1); %%路徑長度

end

L_best(nC)=min(L); %最優路徑為距離最短的路徑

pos=find(L==min(L)); %找出最優路徑對應的位置:即為哪只螞蟻

R_best(nC,:)=Route(pos(1),:); %確定最優路徑對應的城市順序

L_ave(nC)=mean(L)'; %求第k次迭代的平均距離

Delta_Tau=zeros(n,n); %Delta_Tau(i,j)表示所有螞蟻留在第i個城市到第j個城市路徑上的信息素增量

L_zan=L_best(1:nC,1);

post=find(L_zan==min(L_zan));

Cities=find(R_best(nC,:)>0);

num_R=length(Cities);

for k=1:num_R-1 %建立了完整路徑后在釋放信息素

Delta_Tau(R_best(nC,k),R_best(nC,k+1))=Delta_Tau(R_best(nC,k),R_best(nC,k+1))+Q/L_best(nC);

end

Delta_Tau(R_best(nC,num_R),1)=Delta_Tau(R_best(nC,num_R),1)+Q/L_best(nC);

Tau=Rho*Tau+Delta_Tau;

nC=nC+1;

end

Shortest_Route=zeros(1,2*n); %提取最短路徑

Shortest_Route(1,:)=R_best(iter_max,:);

Shortest_Route=Shortest_Route(Shortest_Route>0);

Shortest_Route=[Shortest_Route Shortest_Route(1,1)];

Shortest_Length=min(L_best); %提取最短路徑長度

%L_ave=mean(L_best);

求解程序:

clc;clear all

%% ==============提取數據==============

[xdata,textdata]=xlsread('exp12_3_2.xls'); %加載20個城市的數據,數據按照表格中位置保存在Excel文件exp12_3_1.xls中

x_label=xdata(:,2); %第二列為橫坐標

y_label=xdata(:,3); %第三列為縱坐標

Demand=xdata(:,4); %第四列為需求量

C=[x_label y_label]; %坐標矩陣

n=size(C,1); %n表示節點(客戶)個數

%% ==============計算距離矩陣==============

D=zeros(n,n); %D表示完全圖的賦權鄰接矩陣,即距離矩陣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)=0; %i=j, 則距離為0;

end

D(j,i)=D(i,j); %距離矩陣為對稱矩陣

end

end

Alpha=1;Beta=5;Rho=0.75;iter_max=100;Q=10;Cap=1;m=20; %Cap為車輛最大載重

[R_best,L_best,L_ave,Shortest_Route,Shortest_Length]=ANT_VRP(D,Demand,Cap,iter_max,m,Alpha,Beta,Rho,Q); %蟻群算法求解VRP問題通用函數,詳見配套光盤

Shortest_Route_1=Shortest_Route-1 %提取最優路線

Shortest_Length %提取最短路徑長度

%% ==============作圖==============

figure(1) %作迭代收斂曲線圖

x=linspace(0,iter_max,iter_max);

y=L_best(:,1);

plot(x,y);

xlabel('迭代次數'); ylabel('最短路徑長度');

figure(2) %作最短路徑圖

plot([C(Shortest_Route,1)],[C(Shortest_Route,2)],'o-');

grid on

for i =1:size(C,1)

text(C(i,1),C(i,2),[' ' num2str(i-1)]);

end

xlabel('客戶所在橫坐標'); ylabel('客戶所在縱坐標');

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/529355.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/529355.shtml
英文地址,請注明出處:http://en.pswp.cn/news/529355.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

java線程6種狀態轉換,Java線程的生命周期和各種狀態轉換詳解

在Java中&#xff0c;任何對象都有生命周期&#xff0c;線程也不例外&#xff0c;它也有自己的生命周期。當Thread對象創建完成時&#xff0c;線程的生命周期便開始了&#xff0c;當線程任務中代碼正常執行完畢或者線程拋出一個未捕獲的異常(Exception)或者錯誤(Error)時&#…

window10怎么卸載php,window_win10怎么卸載程序?win10卸載程序教程,當win10正式版發布以后,不少 - phpStudy...

win10怎么卸載程序&#xff1f;win10卸載程序教程當win10正式版發布以后&#xff0c;不少用戶將電腦升級為Windows10系統后&#xff0c;不知道該如何卸載程序&#xff0c;本篇將為大家帶來win10卸載程序教程&#xff0c;希望能夠幫助到大家。win10怎么卸載程序方法一&#xff1…

matlab里dcgain,制系統的時域分析

一個動態系統的性能常用典型輸入作用下的響應來描述。響應是指零初始值條件下某種典型的輸入函數作用下對象的響應&#xff0c;控制系統常用的輸入函數為單位階躍函數和脈沖激勵函數(即沖激函數)。在MATLAB的控制系統工具箱中提供了求取這兩種輸入下系統響應的函數。一、時域分…

php 添加音樂,PHP網站插入音樂

該樓層疑似違規已被系統折疊 隱藏此樓查看此樓你找對地方了&#xff0c;我是IT之家大神光卡蔣一欣。我把代碼發給你&#xff0c;直接運行即可entrance\01.gif......\........\02.gif......\........\03.jpg......\........\04.jpg......\........\05.jpg......\........\06.jpg…

在oracle數據庫中顯示異常,Oracle數據庫出現ORA-01034錯誤的解決方案

類型&#xff1a;數據庫類大小&#xff1a;42.1M語言&#xff1a;中文 評分&#xff1a;5.0標簽&#xff1a;立即下載使用Oracle數據庫的朋友經常會碰到的錯誤ORA-3113 "end of fileon communication channel" 就是這樣的一個&#xff0c;我們可以簡單的把這個錯誤理…

oracle數據庫內核,深入內核:Oracle數據庫里SELECT操作Hang解析

崔華&#xff0c;網名 dbsnakeOracle ACE Director&#xff0c;ACOUG 核心專家編輯手記&#xff1a;感謝崔華授權我們獨家轉載其精品文章&#xff0c;也歡迎大家向“Oracle”社區投稿。我們都知道在 Oracle 數據庫里是“讀不阻塞寫&#xff0c;寫不阻塞讀”&#xff0c;那么是否…

oracle 如何形成死鎖,Oracle數據表中的死鎖情況解決方法

在進行數據庫管理的過程中,經常會出現數據表被用戶的一些不合理操作而導致表被鎖定的情況,以下主要介紹如何查找哪些表被哪個用戶所鎖定,以及如何解除鎖定:1.查找被鎖定的表:select object_name,session_id,os_user_name,oracle_username,process,locked_mode,statusfrom v$loc…

php 分布式數據庫查詢,分布式數據庫 · Thinkphp5.0完全開發手冊 · 看云

# 分布式數據庫ThinkPHP內置了分布式數據庫的支持&#xff0c;包括主從式數據庫的讀寫分離&#xff0c;但是分布式數據庫必須是相同的數據庫類型。配置database.deploy 為1 可以采用分布式數據庫支持。如果采用分布式數據庫&#xff0c;定義數據庫配置信息的方式如下&#xff1…

matlab 電力系統動態仿真,基于Matlab的電力系統動態仿真分析

本文通過兩個簡單實例介紹了利用 !"#$"% &’(! )*, -./對電力系統進行仿真研究的方法! 包括"熱工自動調節控制系統的仿真分析和電力電器系統的仿真分析# 0 熱工調節控制系統仿真分析 對熱工調節控制系統的性能分析包括靜態特性和動態特性兩個方面# 這里主要…

oracle read by other session,AWR報告中,read by other session ,如何解決?

你看你的top sql里全是動態采樣的sql&#xff0c;默認10g以后optimizer_dynamic_sampling參數為level 2&#xff0c;一般為缺失統計信息會造成每次使用動態采樣&#xff0c;雖然動態采樣會在表頻繁發生大批量改變時&#xff0c;一般可以生成更好的執行計劃&#xff0c;但是也不…

oracle insert into as select,比較create table as select * 與 insert into table select *

實驗環境&#xff1a;SYSaaron> select * from v$version;BANNER--------------------------------------------------------------------------------Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - ProductionPL/SQL Release 11.2.0.1.0 - ProductionCORE …

unix 安裝oracle,linux上安裝Oracle

當前位置:我的異常網 Linux/Unix linux上安裝Oraclelinux上安裝Oraclewww.myexceptions.net 網友分享于&#xff1a;2013-09-03 瀏覽&#xff1a;26次linux下安裝Oracle1.Linux下安裝 jdk(Linux)建議從sun的主頁上下載bin文件,運行后在/usr/會建立好java目錄的Linux下相關命…

linux ftp用戶指定多個目錄,linux ftp服務器下用戶限制目錄的方法

我們使用服務器都要站在安全方面進行考慮&#xff0c;有必要將ftp服務下的用戶限制在適當的范圍內&#xff0c;那么linux ftp服務器下用戶限制目錄的方法有哪些呢?一起跟著愛站技術頻道小編的步伐來了解一下吧!linux ftp服務器下用戶只能在自己目錄下的方法&#xff1a;第一步…

查找空目錄Linux,Linux中find批量刪除空文件及空文件夾腳本

find . -name "*" -type f -size 0c | xargs -n 1 rm -f #linux下批量刪除空文件(大小等于0的文件)刪除指定大小的文件&#xff0c;只要修改對應的 -size 參數就行&#xff1a;find . -name "*" -type f -size 1024c | xargs -n 1 rm -f #刪除1k大小的文件…

linux關閉timewait端口,linux 如何強制關閉 time_wait 連接

匿名用戶1級2016-04-16 回答# netstat -an|awk /tcp/ {print $6}|sort|uniq -c68 CLOSE_WAIT2 CLOSING136 ESTABLISHED38 FIN_WAIT116 FIN_WAIT22 LAST_ACK8 LISTEN71 SYN_RECV2936 TIME_WAIT#狀態&#xff1a;描述CLOSED&#xff1a;無連接是活動的或正在進行LISTEN&#xff1…

memset頭文件 linux,error: ‘memset’ was not declared in this scope

http://blog.sina.com.cn/s/blog_79d599dc0100r2vz.html昨天一同事把代碼準備重新全新布置到新的環境上去的時候&#xff0c;代碼報錯了&#xff0c;先開始報錯如下&#xff1a;error: ‘memset’ was not declared in this scopeerror: ‘strcat’ was not declared in this s…

linux中ls文件內存大小,Linux下用ls和du命令查看文件以及文件夾大小

webdriver零碎知識點#零碎知識點,用于記錄平時遇到的比較雜的知識點 driver.current_url 獲取當前url phantomjs 實現無瀏覽器界面自動化測試(driver webdriver.Phanto ...ORACLE刪除當前用戶下所有的表的方法1.如果有刪除用戶的權限,則可以: drop user user_name cascade; 加…

linux物理內存地址與iomem,一種Linux系統物理內存鏡像文件分析方法_4

模塊信息&#xff0c;如圖7所示&#xff0c;給出了本發明的實施例中 模塊結構關系圖&#xff0c;modules變量指向某一個已加載模塊結構體module地址&#xff0c;所有已加載模 塊其module形成一個雙向鏈表&#xff0c;如圖7所示&#xff0c;據此可以獲取到所有已加載模塊。[0099…

linux設備分層優點,Linux設備驅動的分層設計思想

代碼清單8第2行獲取platform_data&#xff0c;而platform_data實際上是定義GPIO按鍵硬件信息的數組&#xff0c;第31行的for循環工具這些信息申請GPIO并初始化中斷&#xff0c;對于LDD6140電路板而言&#xff0c;這些信息如代碼清單10。代碼清單10 LDD6410開發板GPIO按鍵的plat…

linux 關閉桌面環境,Ubuntu 14.04上的Cinnamon桌面環境PPA被關閉

今天Cinnamon桌面環境的開發者宣布關閉Cinnamon桌面環境的PPA&#xff0c;這意味著以后在Ubuntu上安裝Cinnamon桌面環境將變得很難。關于為什么要關閉PPA&#xff0c;Cinnamon PPA的維護者Gwendal Le Bihan做出了以下解釋&#xff1a;“穩定的Cinnamon PPA將不再提供&#xff0…