集装箱多式联运定义
集装箱多式联运作为一种新型多式联运方式,将多式联运和集装箱运输高效地结合在一起,集两者的优势于 一身,与传统的运输方式相比具有更高效、更灵活、更低成本、更高安全性诸多优势。正是由于多式联运的这些 特点,使得集装箱多式联运在近几十年中迅速发展,成为国际贸易中的一种主要运输方式。同时如何改进集装箱多式联运,有效地协调各种运输方式,提高运输效率,降低运输成本,提高客户满意度也成为了集装箱多式联运 研究方向中一项非常具有研究价值的课题。
模型构建
算法设计
本文采用遗传算法进行设计求解
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);elserouts(:,1)=[1;1+IX'];%起点站routs(:,2)=[IX';Dim+1];%终点站routs(:,3)=[indv(1);(indv([1+IX]))']; % 运输方式end
2.2 目标函数计算
(1)运输成本
% 运输成本 Rcostrcost=0;%路程x单位路程成本产生的运输成本time = 0;% 起点的出发时刻% time=[]; % 不考虑铁路及水路发版时刻的 离开 每个站点的时刻% ZHtime = 0.8;% CO2Num=0; % 碳排放量for i=1:size(routs,1)if routs(i,3)==1rcost=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)==2rcost=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)); elsercost=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;elsefor i=1:size(routs,1)-1bcost=bcost + Modd.loadupcost(routs(i,3),routs(i+1,3));btime = btime + Modd.loaduptime(routs(i,3),routs(i+1,3)) * Modd.TEU;endend
(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.popsizeindx=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;elsecrosspop(i,: )= fir;crosspop(i+ GA.popsize/2 , : ) =sec;end
4、变异算子
%% 变异操作 mupop=zeros(size(pop));for i=1:GA.popsizeindv=crosspop(i,: );if rand< GA.pmk= unidrnd(GA.Dim+1 );kk=unidrnd(GA.Dim )+GA.Dim +1 ;% 单点变异indv(k)= unidrnd(GA.Ub) ;%Ub=3;indv(kk)=unidrnd(2) -1 ;%0,1mupop(i,:)=indv;elsemupop(i,:)=indv;endend
结果展示
重庆 经 公路到 宜昌宜昌 经 公路到 武汉武汉 经 铁路到 南京南京 经 铁路到 上海最低总成本为 242345.500 运输成本 242340.000 中转成本5.500 时间窗惩罚成本0.000 总运输时间为 21.400