【路径规划】Matlab 遗传算法求解多式联运问题(带时间窗、配送成本,中转成本总成本最低)

集装箱多式联运定义

集装箱多式联运作为一种新型多式联运方式,将多式联运和集装箱运输高效地结合在一起,集两者的优势于 一身,与传统的运输方式相比具有更高效、更灵活、更低成本、更高安全性诸多优势。正是由于多式联运的这些 特点,使得集装箱多式联运在近几十年中迅速发展,成为国际贸易中的一种主要运输方式。同时如何改进集装箱多式联运,有效地协调各种运输方式,提高运输效率,降低运输成本,提高客户满意度也成为了集装箱多式联运 研究方向中一项非常具有研究价值的课题。

模型构建

【路径规划】Matlab 遗传算法求解多式联运问题(带时间窗、配送成本,中转成本总成本最低)_第1张图片
【路径规划】Matlab 遗传算法求解多式联运问题(带时间窗、配送成本,中转成本总成本最低)_第2张图片【路径规划】Matlab 遗传算法求解多式联运问题(带时间窗、配送成本,中转成本总成本最低)_第3张图片

算法设计

本文采用遗传算法进行设计求解
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

【路径规划】Matlab 遗传算法求解多式联运问题(带时间窗、配送成本,中转成本总成本最低)_第4张图片
2.2 目标函数计算
(1)运输成本

% 运输成本 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));%分两半,151252配对交叉 
    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=3indv(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   

【路径规划】Matlab 遗传算法求解多式联运问题(带时间窗、配送成本,中转成本总成本最低)_第5张图片

你可能感兴趣的:(代码事宜私信博主,多式联运,遗传算法,matlab)