【多式联运】基于matlab改进的遗传算法求解多式联运运输问题(不含碳政策)【含Matlab源码 1994期】

举报
海神之光 发表于 2022/07/21 22:43:17 2022/07/21
【摘要】 一、联运运输简介 1 引言 运输问题(Transportation Problem)[1]是一类特殊的线性规划问题,最早是由Hichcock于1941年提出的,由于它不仅能解决物资的合理调运和车辆的合理...

一、联运运输简介

1 引言
运输问题(Transportation Problem)[1]是一类特殊的线性规划问题,最早是由Hichcock于1941年提出的,由于它不仅能解决物资的合理调运和车辆的合理调度,而且许多实际问题如生产存储问题、工厂选址问题等经过适当变换后可转化为运输问题进行求解,一些理论问题如最小费用流问题也与它息息相关,因此研究运输问题具有相当重要的实际意义。

多式联运(Multimode Transportation)是现代物流系统中竞争协作的最佳方式,研究多式联运的运输方式选择,对于实现运输费用或时间的节约,提高交通运输服务水平以及社会效益具有重要的意义。建立了多城市间选择最优运输方式组合的模型并给出了基于Dijkstra的启发式算法;建立了基于多维权有向图的多式联运运输方式选择模型。

2 多式联运运输问题的数学模型
设有一个多式联运运输问题:某种物资有m个产地,n个销地,从每个产地至每个销地都要经过l段运输区间,任意一段运输区间有g种运输方式可以选择,各运输方式所需的费用c不同,当从一种运输方式转换到另一种运输方式时,需要一定的中转费用d,问如何选择从不同产地到不同销地的运输量以及各自的运输方式使得既满足产销地的供需约束,又使得所需的总费用最少。

模型记号:
ai:各产地的产量,i=1,2,…,m;
bj:各销地的销量,j=1,2,…,n;
cpijk:从产地i运往销地j的物资在第k段运输区间选择第p种运输方式所需的单位运费,p=1,2,…,g,k=1,2,…,l;
dpqijk:从产地i运往销地j的物资在第k段运输区间开始时从第p种运输方式转换至第q种运输方式所需的中转需用,p,q=1,2,…,g,k=2,3,…,l;
xij:从产地i运往销地j的物资运输量;
yijk:从产地i运往销地j的物资在第k运输区间选择的运输方式,取值为1至g的整数;
在这里插入图片描述
上述多式联运运输问题的数学模型如下:
在这里插入图片描述
若是从某个产地i到销地j的分段运输区间小于l段,则可令对应的运输区间选择任何一种运输方式所需的单位费用以及中转费用均为0后扩展为l段;同样若从产地i运往销地j的物资在第k段运输区间的运输方式小于g种,则可令对应的运输方式所需的中转费用为充分大的正数从而扩展为g种。由于不平衡运输问题可以通过设立虚拟产地或是虚拟销地转化

为平衡运输问题,从而下面增加一个平衡假设,即:
在这里插入图片描述

3 求解多式联运运输问题的混合遗传算法
由前面的分析可以看出,多式联运运输问题是一个组合优化问题其中包括运输量的分配以及运输方式的选择两个方面。用遗传算法来进行求解,由于运输问题本身是一个约束优化问题,对于约束的处理一般有两种方法,一种是采用罚函数的方法将解从不可行区域引导至可行区域;另一种是设计可行解的生成方法及保持可行性的遗传算子,使得解始终在可行区域中寻优。采用第二种方法,通过设计满足可行性的混合编码以及两种保持可行性混合遗传算子来实现遗传算法的寻优。

3.1 染色体混合编码
采用两种方式的混合编码,首先对于运输量,采用最自然的矩阵编码方式,即用矩阵[xij]mn表示一个运输方案,其中xij表示从产地i到销地j的运输量;其次对于从产地i到销地j的多式联运运输方式采用长度为l的自然数编码,每个位置的取值为1到g的整数,表示对应运输区间的运输方式。如
在这里插入图片描述
3.2 适应度函数定义
令yijk表示向量yij的第k个分量,其值即表示某种运输方式,则给定一组解([xij]mn,[yij]mn),其适应度函数为式(1)所示。

3.3 初始可行解的生成方法
由于多式联运运输问题是一个约束优化问题,故如何生成初始可行解相当重要。针对前述混合编码方式,设计如下的初始解生成方法:

{repeat
从集合T={1,2,…,mn}中随机取一个整数T®;
将T®转化为相应的行列:i=[(T®-1)/n+1],这里[]表示函数取整;j=(T®-1)mod n+1;
令xij=min{ai,bj};令yij为分量取值在{1,2,…,g}之间长度为l的随机向量;
更新ai:=ai-xij;bj:=bj-xij;T:=T\T®;
Until T=Ø}

3.4 算法流程
步骤1 产生一个初始种群,种群规模为N,计算出种群中个体的适应值,适应度函数即问题式(1)的目标函数值,令t:=1。
步骤2 在父代种群中以轮盘赌方式选择个体形成杂交种群池C(t),设其规模为M。
步骤3 随机选择C(t)中的个体P1和P2进行杂交算子操作以生成新个体C1和C2。
步骤4 重复步骤3直到产生2M个新个体形成杂交子种群。
步骤5 从父代种群及杂交子种群以pm的概率选取个体用变异算子进行变异。
步骤6 从父代种群、杂交子种群以及变异子种群中计算各个体的适应值,取其中适应值最小的N个个体形成子代种群,令t:=t+1。
步骤7 判断终止条件是否满足,如果满足则输出当前种群的最优个体作为问题的最优解,否则转步骤2继续迭代。

二、部分源代码

data = xlsread('data.xlsx','A2:E35');
N = 15;      % 节点数量
C = [0.526  0.497  0.361
    0.392  0.340  0.273
    0.090  0.073  0.051];                %公路、 铁路、水路运输成本
E = [0.071  0.042  0.012];               % 碳排放
V = [80  60  30];    %速度
Ct = [0  8  9; 8  0  10; 9  10  0];      % 转运成本
Et = [0	 0.128	0.117;  0.128	0	0.113;  0.117 	1	0.133];  %转运碳排放系数 
Tt = [0	 50  50;  50	0	50;   50  50	0] / 100;     % 转运时间
q0 = 100;          % 货物量
TW = [150  200];    % 时间窗
Emax = 0; %强制碳排放
P = [15   30]; %时间窗惩罚
D = nan(N, N, 3);     % 距离矩阵
data(:,1) = data(:,1) + 1;
data(:,2) = data(:,2) + 1;
for k = 1 : size(data,1)
    D(data(k,1),data(k,2),1) = data(k,3);    D(data(k,2),data(k,1),1) = data(k,3);
    D(data(k,1),data(k,2),2) = data(k,4);    D(data(k,2),data(k,1),2) = data(k,4);
    D(data(k,1),data(k,2),3) = data(k,5);    D(data(k,2),data(k,1),3) = data(k,5);
end

%% 计算各个体的目标函数值
function f = Fitness(ch, N, q0, D, C, E, V, Ct, Et, Tt, TW, P, Emax, big)
x = ch(1:N);        % 线路编码
y = ch(N+1:end);    % 运输方式编码
K = find(x == N);   % 线路经过K个城市
route = x(1: K);    % 线路
type = y(1: K-1);   % 运输方式
% 先判断是不是可行解,是可行解咱就好好算时间,不是可行解就不搭理他
punish = 0;
for k = 2 : K
    if D(route(k-1),route(k),type(k-1)) == big
        punish = punish + 1;
    end
end
if punish == 0   % 可行解
    C1 = 0;                % 运输成本
    C2 = 0;                % 转运成本
    Esum = 0;              % 碳排放
    % 计算出发时间
    tclock = 0;
    for k = 2 : K
        % 到达时间
        tclock = tclock + D(route(k-1),route(k),type(k-1)) / V(type(k-1));
        % 运输成本
        if D(route(k-1),route(k),type(k-1)) <= 500
            c = C(:,1);
        elseif D(route(k-1),route(k),type(k-1)) <= 500
            c = C(:,2);
        else
            c = C(:,3);
        end
        C1 = C1 + q0 * c(type(k-1)) * D(route(k-1),route(k),type(k-1));
        %        
        Esum = Esum + q0 * E(type(k-1)) * D(route(k-1),route(k),type(k-1));
        if k < K
            if type(k-1) ~= type(k)  % 换乘时考虑
                % 计算转运时间
                tclock = tclock + q0 * Tt(type(k-1),type(k));
                % 转运成本
                C2 = C2 + q0 * Ct(type(k-1),type(k));    % 转运成本
                %
                Esum = Esum + q0 * Et(type(k-1),type(k));
            end
        end
    end
    C3 = P(1) * max(TW(1)-tclock,0) + P(2) * max(tclock-TW(2),0);
    g = 0;
    f = C1 + C2 + C3  + g * 1e9;
else
    f = punish * 1e19;
end

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74

三、运行结果

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

四、matlab版本及参考文献

1 matlab版本
2014a

2 参考文献
[1]俞武扬.多式联运运输问题的混合遗传算法[J].计算机工程与应用. 2009,45(33)

3 备注
简介此部分摘自互联网,仅供参考,若侵权,联系删除

文章来源: qq912100926.blog.csdn.net,作者:海神之光,版权归原作者所有,如需转载,请联系作者。

原文链接:qq912100926.blog.csdn.net/article/details/125880398

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。