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

集装箱多式联运定义

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

模型构建

在这里插入图片描述
在这里插入图片描述在这里插入图片描述

算法设计

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

在这里插入图片描述
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   

在这里插入图片描述

  • 6
    点赞
  • 79
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
多式联运问题是一类涉及多个目标函数和多个约束条件的优化问题。而遗传算法是一种基于模拟生物进化过程的优化方法,在求解多式联运问题时,可以通过遗传算法来获得一组可能的最优解。 首先,需要将多式联运问题转化为适应度函数的形式。适应度函数是遗传算法中评估个体优良程度的标准,它通常由目标函数以及约束条件构成。多式联运问题中,目标函数可以是需要最小化或最大化的指标,如总成本、总时间等;约束条件包括各项任务的时间、货物数量等要求。 接下来,需要确定遗传算法的编码方式。编码方式是将问题转化为遗传算法能够处理的基因型的重要步骤。针对多式联运问题,可以将每个个体编码为一个基因型,每个基因包含一组参数,如任务的顺序、运输车辆的路径等。 然后,需要确定适应度函数的计算方式。在遗传算法中,适应度函数可以根据目标函数和约束条件进行计算。对于多式联运问题,可以根据目标函数的值和是否满足约束条件来确定个体的适应度。 最后,通过遗传算法的选择、交叉和变异操作来进行优化。选择操作是根据个体的适应度值进行筛选,选择适应度较高的个体进入下一代。交叉和变异操作是引入新的遗传信息,通过交叉和变异来产生新的个体,并避免陷入局部最优解。 通过以上步骤,可以使用MATLAB中的遗传算法工具箱来实现对多式联运问题求解。根据问题的具体情况,可以设置最大迭代次数,并利用遗传算法求解得到一组可能的最优解。最后,可以根据实际需求中选择最佳解进行进一步优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值