200字范文,内容丰富有趣,生活中的好帮手!
200字范文 > 【路径规划】Matlab 遗传算法求解多式联运问题(带时间窗 配送成本 中转成本总成本最低)

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

时间:2023-03-14 23:55:35

相关推荐

【路径规划】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);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

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。