遗传算法求解含时间窗的车辆路径(VRPTW)问题,含matlab代码

题目描述 :

        现有16个客户点,1个配送中心。客户点有不同数量的货物需求、期望收货时间以及所能接受的收货时间。有7辆运送货物的车,每辆车有不同的承载量。现需要指派n(n<=7)辆货车携带货物送往客户点,在不超载的情况下,保证每个客户收到货物并且由一辆货车满足配送要求,还要保证客户在可接受收货时间内收到货物(在客户所能接受的收货时间之外收到货物不满足配送要求),目标函数为满足配送要求的条件下成本最小,并给出具体配送方案。      

 目标函数:

        其中,f1代表车辆行驶距离造成的费用,α为单位路程的行驶费用。f2代表早到或者晚到的惩罚成本,D为惩罚系数。

约束函数:

        其中,第一个约束为配送中心发出的车辆不许超过配送中心车辆的最大值,第二个约束为配送客户的货物之和不得超过车辆的容量,第三个约束为车辆到达时间不得超过客户能接受的到货时间。

求解:

采用遗传算法,算法框图如下:

        算法编程难点在于对解集的建立和变换,对于这种复杂的解集,本文采用matlab的元胞数组建立解集,如下图所示。每一行代表一个个体,也就是一个解。

        对于每一行来说,第一个数组表示选择车的数量

        第二个数组表示选择车的编号,例如populationMat{1,2}=[2,3,7,6],代表的含义为选择第2,3,7,6号车。

        第三列数组表示车所对应的配送客户数目。例如populationMat{1,3}=[5,6,2,3]代表第2号车配送5个客户,第3号车配送6个客户,第7号车配送2个客户,第6号车配送3个客户。

        第四列数组代表客户的编号,populationMat{1,3}=[1 3 15 11 4 16 2 5 12 13 14 10 9 6 7 8],代表2号车需要配送5个客户,这5个客户分别是第1 3 15 11 4号客户,3号车需要配送6个客户,这6个客户分别是16 2 5 12 13 14,以此类推。

        以下是主函数部分,函数总体是按照遗传算法步骤来写的,初始化种群,计算适应度,选择,交叉,变异...

%% 清空变量
clear
clc

%% 导入参数
[expectTime,acceptTime,serviceTime,customerPosition,customerRequirement,distriCenterPosition,speed,truckVolume] = DataFunction;

%% 定义变量
populationNumber = 50;                                    %种群数量
probabilityMat = [0.01,0.1,0.3,0.3,0.1,0.1,0.09];         %概率矩阵
N = length(customerRequirement);                          %客户的数目
M = length(probabilityMat);                               %车辆的最大数目
alpha = 1;                                                %单位距离运输费用
D = 1;                                                    %过早或者过晚到达时时间成本
pro = 0.1;                                                %变异概率
populationMat = cell(populationNumber,4);                 %种群数据矩阵
iter = 1;                                                 %当前迭代次数
iterMax = 500;                                            %最大迭代次数
bestValueNow = inf;
bestValueMat = zeros(populationNumber,1);
bestSolveNow = cell(1,4);
bestValue = inf;
bestSolve = cell(1,4);

%% 初始化种群
populationMat = InitializeIndividuality(populationMat,populationNumber,M,N,probabilityMat,distriCenterPosition,customerPosition,truckVolume,customerRequirement,speed,acceptTime,serviceTime);

while iter<iterMax
   %% 计算适应度
   p = CalcuFitCapacity(populationMat,distriCenterPosition,customerPosition,populationNumber,alpha,speed,expectTime,D,serviceTime);
   
   %% 选择
   populationMat = SelectionFunction(populationMat,populationNumber,p);
   
   %% 交叉
   populationMat = CrossFunction(populationMat,populationNumber,distriCenterPosition,customerRequirement,truckVolume,customerPosition,speed,acceptTime,serviceTime,N);
   
   %% 变异
   populationMat = HeteromorphosisFunction(populationMat,probabilityMat,pro,populationNumber,M,N,customerRequirement,distriCenterPosition,customerPosition,truckVolume,speed,acceptTime,serviceTime);
    
   %% 寻找最优解
   [bestValueNow,bestSolveNow] = CalcuBestIndividuiality(populationMat,populationNumber,distriCenterPosition,customerPosition,alpha,speed,expectTime,D,serviceTime);
   
   if bestValueNow<bestValue
        bestValueMat(iter) = bestValueNow;
        bestValue = bestValueNow;
        bestSolve = bestSolveNow;
    else
        bestValueMat(iter) = bestValue;
    end
   
   
   iter = iter+1;
end
%% 可视化最优解
DrawPicture(bestSolve,distriCenterPosition,customerPosition,bestValueMat,N,speed,expectTime,serviceTime);

%% 输出结果
disp(['选取的车辆编号为:',num2str(bestSolve{1,2}),',总费用为:',num2str(bestValue),'万元']);
numberMat = cumsum(bestSolve{1,3});
for k1 = 1:bestSolve{1,1}
    if k1 == 1
        disp(['第',num2str(bestSolve{1,2}(k1)),'号车辆服务的客户为:',num2str(bestSolve{1,4}(1:numberMat(k1)))]);
    else
        disp(['第',num2str(bestSolve{1,2}(k1)),'号车辆服务的客户为:',num2str(bestSolve{1,4}(numberMat(k1-1)+1:numberMat(k1)))]);
    end
end

以下是运行结果:

获取代码方式:遗传算法求解VRPTW问题

        自己手写遗传算法求解配送车辆路径问题(含时间窗VRPTW),代码逻辑清晰,内含详细注释,代码可直接运行,而且含视频教程!!!
        代码均为本人手写,创作不易。
        代码可作为日常学习使用,不得用于商业和私自摆卖,违者追究法律责任,望重视!!!

  • 5
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
matlab遗传算法可以用于求解时间的单配送中心车辆调度与路径优化问题(Vehicle Routing Problem with Time Windows, VRPTW)。VRPTW是指在一定时间限制下,将多个顾客的需求分配给一个配送中心的多辆车辆进行配送的问题。 首先,我们需要定义问题的数学模型,包括顾客的需求、车辆的容量、时间等限制条件。然后,使用matlab编写遗传算法代码,构建适应度函数、选择、交叉和变异操作等遗传算法的基本元素。 接下来,根据问题具体要求,设计合适的编码方案,将问题转化为遗传算法的基因表示形式。常用的编码方案包括顺序编码、位编码和区域编码等。 在遗传算法的迭代过程中,通过选择、交叉和变异等操作,不断更新种群的基因组合,寻找最优的调度方案和路径。选择操作通过计算适应度函数来确定优秀个体,交叉操作通过基因交换来产生新的个体,变异操作用于保持种群的多样性。 最后,运行matlab遗传算法代码,通过不断迭代得到优化的车辆调度和路径方案,满足时间的要求,并且最小化总配送成本或路径长度等目标函数。 总结起来,使用matlab遗传算法求解VRPTW问题需要定义数学模型、设计编码方案,编写适应度函数和遗传算法代码,并使用迭代优化方法进行求解。可以通过不断交叉和变异操作,逐步优化车辆调度和路径,得到最佳解。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值