
matlab遺傳算法選址(多約束條件)
模型
配送?點包括:
?提柜——提供?提服務
聯(lián)盟?點——提供送貨上門或?提
在?個區(qū)域內有x個備選的?來提供兩種服務的配送?點,已知備選共同配送?點的單?成本和可以提供的最?運營能?。有x個客戶需求點,已知各個需求點的位置和需求量,并且每個需求點都存在【?提】和【送貨上門】兩種末端配送需求,
?點?s表?——數量x個
客戶點?t表?——數量y個
L——?點類型,L={M,N},l=M,聯(lián)盟?點 l=N?提柜
P——客戶需求類型,P={m,n,o}p=m 送貨上門 p=n ?提 p=o 既有送貨?有?提
Csl——l類型?點S固定成本
qtp ——P類型客戶點t的?均訂單量
dl——L類型?點s的最?服務半徑
Dl——L類型?點s的最?服務半徑
dlst——L類型?點s到客戶t的距離
λt——需要送貨上門客戶占?
1-λt——需要?提的客戶占?
決策變量:
Xsl——0-1變量 表?是否選擇l類型?點作為配送?點
Ystlp——0-1變量 表?l類型?點s是否為 p 類型客戶提供服務
主程序展?
clear
clc
clo all
tic
%%?importdata這個函數來讀取?件
% shuju=importdata('');
load('cc101');
shuju=c101;
% bl=importdata('');
bl=3;
cap=60;%車輛最?裝載量
%%提取數據信息
E=shuju(1,5);%配送中?時間窗開始時間
L=shuju(1,6);%配送中?時間窗結束時間
zuobiao=shuju(:,2:3);%所有點的坐標x和y
pszx=zuobiao(1:4,:);
customer=zuobiao(5:end,:);%顧客坐標
cusnum=size(customer,1);%顧客數
v_num=20;%車輛最多使?數?
demands=shuju(5:end,4);%需求量
a=shuju(5:end,5);%顧客時間窗開始時間[a[i],b[i]]
b=shuju(5:end,6);%顧客時間窗結束時間[a[i],b[i]]
s=shuju(5:end,7);%客戶點的服務時間
h=pdist(zuobiao);
dist=squareform(h);
% dist=load('dist.mat');
% dist=struct2cell(dist);
% dist=cell2mat(dist);
dist=dist./1000;%距離矩陣,滿?三?關系,暫?距離表?花費c[i][j]=dist[i][j]
%%遺傳算法參數設置
alpha=100000;%違反的容量約束的懲罰函數系數belta=90;%違反時間窗約束的懲罰函數系數
belta2=60;
chesu=20;
NIND=300;%種群??
MAXGEN=10;%迭代次數
Pc=0.9;%交叉概率
Pm=0.05;%變異概率
GGAP=0.9;%代溝(Generation gap)
N=cusnum+v_num-1;%染?體長度=顧客數?+車輛最多使?數?-1 % N=cusnum;
%%初始化種群
% init_vc=init(cusnum,a,demands,cap);
dpszx =struct('ps',[], 'Chrom',[]);
dpszx.Chrom=InitPopCW(NIND,N,cusnum,a,demands,cap);%構造初始解
ps=pszxxz(dpszx.Chrom,cusnum);
%%輸出隨機解的路線和總距離
%%輸出隨機解的路線和總距離
disp('初始種群中的?個隨機值:')
[VC,NV,TD,violate_num,violate_cus]=decode(dpszx.Chrom(1,:),cusnum,cap,demands,a,b,L,s,dist,chesu,bl);
%[VC,NV]=cls(dpszx.Chrom(1,:),cusnum);
%[~,~,bsv]=violateTW(VC,a,b,s,L,dist,chesu,bl);
%disp(['總距離:',num2str(TD)]);
disp(['車輛使?數?:',num2str(NV),',車輛?駛總距離:',num2str(TD)]);
disp('~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~')
%%優(yōu)化
gen=1;
figure;
hold on;box on
xlim([0,MAXGEN])
title('優(yōu)化過程')
xlabel('代數')
ylabel('最優(yōu)值')
ObjV=calObj(dpszx.Chrom,cusnum,cap,demands,a,b,L,s,dist,alpha,belta,belta2,chesu,bl,ps);%計算種群?標函數值preObjV=min(ObjV);
%%
while gen<=MAXGEN
%%計算適應度
ObjV=calObj(dpszx.Chrom,cusnum,cap,demands,a,b,L,s,dist,alpha,belta,belta2,chesu,bl,ps);%計算種群?標函數值
line([gen-1,gen],[preObjV,min(ObjV)]);pau(0.0001)%畫圖最優(yōu)函數
preObjV=min(ObjV);
FitnV=Fitness(ObjV);
%%選擇
[SelCh,psc]=Select(dpszx.Chrom,FitnV,GGAP,ps);
%% OX交叉操作
[SelCh,psc]=Recombin(SelCh,Pc,psc,cusnum);
%%變異
[SelCh,psc]=Mutate(SelCh,Pm,psc,cusnum);
%%重插??代的新種群
[dpszx.Chrom,ps]=Reins(dpszx.Chrom,SelCh,ObjV,psc,ps);
%%打印當前最優(yōu)解
ObjV=calObj(dpszx.Chrom,cusnum,cap,demands,a,b,L,s,dist,alpha,belta,belta2,chesu,bl,ps);%計算種群?標函數值[minObjV,minInd]=min(ObjV);
disp(['第',num2str(gen),'代最優(yōu)解:'])
[bestVC,bestNV,bestTD,best_vionum,best_viocus]=decode(dpszx.Chrom(minInd(1),:),cusnum,cap,demands,a,b,L,s,dist,chesu,bl); disp(['車輛使?數?:',num2str(bestNV),',車輛?駛總距離:',num2str(bestTD)]);
fprintf('\n')
%%更新迭代次數
gen=gen+1;
end
%%畫出最優(yōu)解的路線圖
ObjV=calObj(dpszx.Chrom,cusnum,cap,demands,a,b,L,s,dist,alpha,belta,belta2,chesu,bl,ps);%計算種群?標函數值[minObjV,minInd]=min(ObjV);
%%輸出最優(yōu)解的路線和總距離
disp('最優(yōu)解:')
bestChrom=dpszx.Chrom(minInd(1),:);
bestps=ps(minInd(1),:);
[bestVC,bestNV,bestTD,best_vionum,best_viocus]=decode(bestChrom,cusnum,cap,demands,a,b,L,s,dist,chesu,bl);
disp(['車輛使?數?:',num2str(bestNV),',車輛?駛總距離:',num2str(bestTD)]);
disp('-------------------------------------------------------------')
%[cost]=costFuction(bestVC,a,b,s,L,dist,demands,cap,alpha,belta,belta2,chesu,bl,);
%%畫出最終路線圖
draw_Best(bestVC,zuobiao,bestps);
% save c101.mat
% toc
選址點1:1->29->28->27->26->25->24->23->22->21->20->1
選址點2:4->33->43->41->40->39->38->37->36->35->34->32->4
選址點3:2->48->62->60->58->56->55->54->53->52->51->50->49->47->76->75->74->73->72->71->70->69->2
選址點4:4->78->90->85->84->83->82->81->80->79->77->4
選址點5:1->92->100->105->108->107->106->104->103->101->2->14->13->12->59->99->86->57->97->96->95->93->9->8->7->5->4->3->1->91->89->88->87->1
選址點6:1->16->11->10->94->1
選址點7:1->19->18->17->15->31->30->46->98->102->6->65->64->63->61->67->68->66->45->44->42->1
最開始的點為選擇的配送中?(代碼中?共四個備選中?)
如需幫助
VX:zhangshu2274