集装箱多式联运作为一种新型多式联运方式,将多式联运和集装箱运输高效地结合在一起,集两者的优势于 一身,与传统的运输方式相比具有更高效、更灵活、更低成本、更高安全性诸多优势。正是由于多式联运的这些 特点,使得集装箱多式联运在近几十年中迅速发展,成为国际贸易中的一种主要运输方式。同时如何改进集装箱多式联运,有效地协调各种运输方式,提高运输效率,降低运输成本,提高客户满意度也成为了集装箱多式联运 研究方向中一项非常具有研究价值的课题。
本文采用遗传算法进行设计求解
1、染色体编码
一条染色体分成两个部分,第一部分表示运输方式(用1~4表示),第二部分表示所有城市是否经过的0-1编码(0表示不经过,1表示经过),如此就可以表示从起点到终点的任意一种多式联运运输方案。例如,5个点,去掉已知的起点和终点,途径的点有3个位置未知和4段路径的运输方式位置,按照这种方式生成的染色体代码和图解如下所示。
function [onepop]=popcreat(Ub,Dim)
onepop=[randi(Ub,1,Dim+1),randi(1,1,Dim)];%前面是运输方式,后面是站点
end
2、目标函数求解
2.1 解码
将染色体两部分解码转化成(城市1——城市2-——运输方式)的矩阵,分别计算不同运输方式下的旅行成本和旅行时间,再计算中转费用和中转时间,最好计算两部分的总成本。
例如:
%路线分配
%起点站+终点站+运输方式
IX=find(indv(Dim+2:end));
routs=zeros(length(IX)+1,3);
if(isempty(IX))
routs(1,1:2)=[1,Dim+1];
routs(1,3)=indv(1);
else
routs(:,1)=[1;1+IX'];%起点站
routs(:,2)=[IX';Dim+1];%终点站
routs(:,3)=[indv(1);(indv([1+IX]))']; % 运输方式
end
% 运输成本 Rcost
rcost=0;%路程x单位路程成本产生的运输成本
time = 0;% 起点的出发时刻
% time=[]; % 不考虑铁路及水路发版时刻的 离开 每个站点的时刻
% ZHtime = 0.8;
% CO2Num=0; % 碳排放量
for i=1:size(routs,1)
if routs(i,3)==1
rcost=rcost+ Modd.unicost.road * Modd.distan.road(routs(i,1),routs(i,2))* Modd.W ;%公路
time=time+Modd.delivery.road(routs(i,1),routs(i,2));
elseif routs(i,3)==2
rcost=rcost+ Modd.unicost.road * Modd.distan.rail(routs(i,1),routs(i,2)) * Modd.W ;%铁路
time=time+Modd.delivery.rail(routs(i,1),routs(i,2));
else
rcost=rcost + Modd.unicost.water * Modd.distan.water(routs(i,1),routs(i,2)) * Modd.W ;%航空
time=time+Modd.delivery.water(routs(i,1),routs(i,2));
end
% time=time(i);
end
(2)中转换装费用
bcost=0;btime = 0;
if(size(routs,1)==1)
bcost=0;
btime=0;
else
for i=1:size(routs,1)-1
bcost=bcost + Modd.loadupcost(routs(i,3),routs(i+1,3));
btime = btime + Modd.loaduptime(routs(i,3),routs(i+1,3)) * Modd.TEU;
end
end
(3)运输总时间
%% 总时间
TotalTime = time + btime;
(4)总成本及目标函数
Objfit= rcost +bcost + max(TotalTime-Modd.TW,0) * Modd.TIMEchengfa;
Objcost=[rcost ,bcost,max(TotalTime-Modd.TW,0) * Modd.TIMEchengfa];
3、选择算子
%% 选择操作(轮盘赌机制)
IX=find( Objfit~=inf );
prob =1./ Objfit(IX)/sum(1./ Objfit(IX )); % 选择概率
cuLprob= cumsum(prob);
selectionpop=zeros(size(pop));
%轮盘赌选择
for i=1:GA.popsize
indx=find( rand<cuLprob ,1);
j=IX(indx);
selectionpop(i,: )=pop( j, :);
end
3、交叉算子
%% 交叉操作
crosspop=zeros(size(pop));%分两半,1和51,2和52配对交叉
for i=1:GA.popsize/2
fir=selectionpop(i,:);
sec=selectionpop(i+ GA.popsize/2 ,:);
if rand< GA.pc
% 单点交叉
k= unidrnd(GA.Dim+1);%随机寻找1-37的 编号
kk=unidrnd(GA.Dim)+ GA.Dim+1 ; %运输方式序列随机找一个交叉点
temp= fir( k);
fir( k)=sec(k) ;
sec(k)=temp;
temp=fir( kk);
fir( kk)=sec(kk) ;
sec(kk)=temp;
crosspop(i,: )= fir;
crosspop(i+ GA.popsize/2 , : ) =sec;
else
crosspop(i,: )= fir;
crosspop(i+ GA.popsize/2 , : ) =sec;
end
4、变异算子
%% 变异操作
mupop=zeros(size(pop));
for i=1:GA.popsize
indv=crosspop(i,: );
if rand< GA.pm
k= unidrnd(GA.Dim+1 );
kk=unidrnd(GA.Dim )+GA.Dim +1 ;
% 单点变异
indv(k)= unidrnd(GA.Ub) ;%Ub=3;
indv(kk)=unidrnd(2) -1 ;%0,1
mupop(i,:)=indv;
else
mupop(i,:)=indv;
end
end
重庆 经 公路 到 宜昌
宜昌 经 公路 到 武汉
武汉 经 铁路 到 南京
南京 经 铁路 到 上海
最低总成本为 242345.500
运输成本 242340.000 中转成本 5.500 时间窗惩罚成本 0.000
总运输时间为 21.400