資源簡介
一個用蟻群算法做OCVRP的代碼。不是很復雜,但通用性還可以,里面有實驗用的數據。
代碼片段和文件信息
function?[]=CVRP()
clear?all
close?all
clc
%初始化蟻群
load?data.txt
global?n;????????%點數目
global?m;????????%螞蟻數目
global?Weight_max;???%最大載重
global?Length_max;???%最大距離
global?Weight_all;???%各點的載重
global?Point_all;????%所有點,包括起始點
global?phe_all;??????%每兩個點之間的信息素???
global?Weight_sum;???%貨車當前載重
global?alpha
global?beta
global?rho
global?Q
Nc_max=2000;
alpha=1;
beta=8;
rho=0.9;
Q=100;
n=data(11)+1;%目標點個數
m=n;%螞蟻的數量等于點的數量
Weight_max=data(12);%最大載重
Length_max=data(13);%最大路程
Weight_all=data(2:n+13);%所有點的載重
Point_all=data(2:n+11:2);%起始點加上目標點
[Pop_initeta_all]=PopinitCom(Point_all);%輸出Pop_init為各個點之間的距離
phe_all=ones(nn);%初始化信息素矩陣都為1
Ant_no=0;?????????%螞蟻正在的點的編號
Ant_visited_num=0;%螞蟻已經訪問過的點的數目
Ant_path=zeros(1n);%螞蟻走過的路徑
Ant_remained=zeros(1n);%螞蟻還未走的路徑
Best_length=inf;???????%初始值設最短長度為很大
%Time_start=datenum(clock);
Flag=0;%判斷搜索是否有更優的解0為沒有,1為有
for?i=1:Nc_max
????fprintf(‘開始第%d次搜索,剩余%d次‘iNc_max-i);
????Flag=0;%初始設沒有
????for?j=1:m
%****************************************************
????????Ant_length=0;%螞蟻走過的長度清0
????????Ant_path=Ant_path*0;%螞蟻走過的路徑清0
????????Ant_remained=Ant_remained+1;%所有點設為可去
????????Ant_path(1)=1;%第一個點設為1,也就設為起始點
????????Ant_no=1;%螞蟻現在所在的點為1
????????Ant_visited_num=1;%螞蟻已經去過的點的數目為1
????????Ant_remained(1)=0;%第一個點設為去過
%????????rand(‘state‘?sum(100*clock));
%*******************************************************??
????while?(Ant_visited_num ????????To_visit=-1;%將下一個即將要去的點設為-1
%******************************************************
%概率的確定是最基本的信息素乘以啟發值
????????Pro_sum=0;
????????phe_all_sum=0;
????????eta_all_sum=0;
??????for?jj=1:n
????????if(Ant_remained(jj)==1)
????????????phe_all_sum=phe_all_sum+phe_all(Ant_nojj);
?????????????eta_all_sum=eta_all_sum+eta_all(Ant_nojj);
????????end
??????end
????????for?ii=1:n
????????????if(Ant_remained(ii)==1)%點未訪問過
????????????????Probability(ii)=(phe_all(Ant_noii))^alpha*(eta_all(Ant_noii))^beta;
????????????????Pro_sum=Pro_sum+Probability(ii);
????????????else
????????????????Probability(ii)=0;%如果點去過該點的概率設為0
????????????end
????????end
%******************************************************????????
%這里使用輪盤賭的方法
????????Temp=0;
????????if?Pro_sum>0
????????????Temp=rand*Pro_sum;
????????????for?jj=1:n
????????????????if?Ant_remained(jj)==1
????????????????????Temp=Temp-Probability(jj);
????????????????????if?Temp<0
????????????????????????To_visit=jj;
????????????????????????break;
????????????????????end
????????????????end
????????????end
????????end
????????
????????if?To_visit==-1
????????????for?k=1:n
????????????????if?Ant_remained(k)==1?%該點沒訪問過
????????????????????To_visit=k;
????????????????????break;
????????????????end
????????????end
????????end
????Ant_visited_num=Ant_visited_num+1;%已經訪問過的點的數目+1
????Ant_path(Ant_visited_num)=To_visit;%保存螞蟻走的路徑
????Ant_remained(To_visit)=0;%該點訪問過
????Ant_no=To_visit;???????
????end
?%******************************************************?
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????文件???????6586??2012-12-19?13:02??CVRP\CVRP.asv
?????文件???????7155??2013-01-04?22:40??CVRP\CVRP.m
?????文件????????507??2012-12-15?08:49??CVRP\data.txt
?????文件????????492??2012-12-18?14:49??CVRP\PopinitCom.m
?????文件????????300??2012-12-19?22:31??CVRP\數據實驗\16(1).txt
?????文件??????27805??2012-12-19?22:30??CVRP\數據實驗\16(1).jpg
?????文件??????13854??2012-12-21?20:14??CVRP\新建?Microsoft?Office?Excel?工作表.xlsx
?????文件??????12364??2012-12-21?19:36??CVRP\新建?Microsoft?Office?Word?文檔?(2).docx
?????文件???????6865??2012-12-19?16:26??CVRP\最基本版本,收斂過早\CVRP.m
?????文件????????492??2012-12-18?14:49??CVRP\最基本版本,收斂過早\PopinitCom.m
?????目錄??????????0??2012-12-19?22:31??CVRP\數據實驗
?????目錄??????????0??2012-12-19?16:43??CVRP\最基本版本,收斂過早
?????目錄??????????0??2012-12-21?20:29??CVRP
-----------?---------??----------?-----??----
????????????????76420????????????????????13
評論
共有 條評論