1 简介

针对城市物流配送和交通运输中广泛存在的带时间窗车辆路径问题,为寻求最佳路径规划,应用惩罚函数,构建了以总运输成本最小为目标的数学模型.在车辆路径优化求解方面,根据问题具体特征设计了1种二维编码方式,并采用近邻初始化方式构建初始解从而提升寻优速率;随后,结合狼群算法觅食行为中的游走、召唤及围攻3种行为,重新定义其智能行为,设计了一种求解带时间窗车辆路径问题的狼群算法.由于原始狼群算法的召唤行为引入距离判定因子来增大种群搜索空间,但也增加了算法复杂性且易陷入局部最优,故本研究舍弃了距离判定因子,采用猛狼1次奔袭便进入围攻状态来降低算法复杂度,并在算法中进一步增强了种群间信息交互.最后,应用该狼群算法求解多个测试算例.结果表明:基于模拟退火赛算法优化狼群算法在求解带时间窗的车辆路径问题时是可行的、有效的。

带时 间 窗 的 车 辆 路 径 问 题 ( vehicle routingproblem with time windows,VRPTW) 是在基本车辆路径问题 ( vehicle routing problem,VRP) 的基础上 增加了客户接受配送服务的时间窗要求,较 VRP 更 贴近实际配送情况。与 VRP 类似,VRPTW 亦属于NP 难问题。由于问题规模较大时,传统精确算法难以求出 VRPTW 的最优解,因此,国内外很多学者利用智能启发式算法来寻找该问题的满意解。常见的 求解 VRPTW 的智能优化算法包括: 蚁群算法、 遗传算法、粒子群算法、禁忌搜索算法 等。但是,由于遗传算法与禁忌搜索算法的早 熟易收敛问题,蚁群算法和粒子群算法的易陷入局 部最优缺陷,故目前仍未找到求解性能具有明显优势的 VRPTW 求解算法。因此,对 VRPTW 求解方法的研究仍属于运筹学、物流配送和交通运输工程等领域的研究重点和热点。 狼群算法 ( Wolf Pack Algorithm,WPA) 作为 一种新型智能启发式算法,是对自然界中狼群分工 协作捕食行为的智能模拟,是一种基于种群的随机 寻优算法。目前,该算法已被成功应用于 TSP 问题、0 - 1 高维背包问题和多维连续优化等多种问题的求 解,并取得了良好的效果。但是,截至目前为止, 尚未有文献将狼群算法应用于 VRPTW 的求解。 基于求解 TSP 的离散狼群算法,结合带时间窗的车辆路径问题的具体特征,提出了求解 VRPTW的狼群算法,并与其他智能算法如蚁群算法、遗 传算 法 等 比 较,不 仅 验 证 了 本 算 法 在 求 解VRPTW 问题上的有效性,而且拓宽了狼群算法的应 用领域。

 【VRP问题】基于模拟退火算法改进狼群算法求解带时间窗的车辆路径VRPTW问题附matlab代码_粒子群算法

 【VRP问题】基于模拟退火算法改进狼群算法求解带时间窗的车辆路径VRPTW问题附matlab代码_优化算法_02

 【VRP问题】基于模拟退火算法改进狼群算法求解带时间窗的车辆路径VRPTW问题附matlab代码_粒子群算法_03

 【VRP问题】基于模拟退火算法改进狼群算法求解带时间窗的车辆路径VRPTW问题附matlab代码_优化算法_04

 【VRP问题】基于模拟退火算法改进狼群算法求解带时间窗的车辆路径VRPTW问题附matlab代码_蚁群算法_05

2 部分代码

clc;clear

Location=[];

Location(:,1)=xlsread('Data.xlsx','sheet13','b2:b23');

Location(:,2)=xlsread('Data.xlsx','sheet13','c2:c23');

TW=xlsread('Data.xlsx','sheet13','e2:f23');

q=xlsread('Data.xlsx','sheet13','d2:d23');

workT=xlsread('Data.xlsx','sheet13','g2:g23');

n=1:size(Location,1)-1;

Q=10;

PAIXU=12;

v_min=35;v_mid=40;

v_max=50;

Ship=300;Fuel_Cost=3;Labor=20;

D=zeros(length(n)+1);

for i=1:length(n)+1

    for j=i:length(n)+1

        D(i,j)=6371.004*acos(sind(90-Location(i,1))*sind(90-Location(j,1))*cosd(Location(i,2)-Location(j,2))+cosd(90-Location(i,1))*cosd(90-Location(j,1)));

    end

end

D=D+D';T=D/v_max;

yuanbao=cell(70,13);

TIME=zeros(1,70);

% for cunchu=1:70

popsize=100;

numWolf=1;

all_chromosome_cell=cell(100,12);

while numWolf<=popsize

    n_n=n;

    vehicle=1;

    chromosome_cell=cell(length(n),4);

    chromosome_cell{vehicle,1}=0;

    chromosome_cell{vehicle,2}=0;

    chromosome_cell{vehicle,3}=0;

    chromosome_cell{vehicle,4}=0;

    ArrivalWait_time=zeros(2,1);chromosome_cell{vehicle,5}=ArrivalWait_time;

    while ~isempty(n_n)

        R=randi(length(n_n));

        customer=n_n(R);

        i=1;

        while i<=vehicle

            if chromosome_cell{i,2}+q(customer+1)>Q

                i=i+1;

                if i>vehicle

                    vehicle=vehicle+1;

                    chromosome_cell{vehicle,1}=0;chromosome_cell{vehicle,2}=0;chromosome_cell{vehicle,3}=0;chromosome_cell{vehicle,4}=0;chromosome_cell{vehicle,5}=ArrivalWait_time;

                end

            elseif sum(chromosome_cell{i,5}(:,end))+workT(chromosome_cell{i,1}(end)+1)+T(chromosome_cell{i,1}(end)+1,customer+1)>TW(customer+1,2)

                i=i+1;

                if i>vehicle

                    vehicle=vehicle+1;

                    chromosome_cell{vehicle,1}=0;chromosome_cell{vehicle,2}=0;chromosome_cell{vehicle,3}=0;chromosome_cell{vehicle,4}=0;chromosome_cell{vehicle,5}=ArrivalWait_time;

                end

            else

                if sum(chromosome_cell{i,5}(:,end))+workT(chromosome_cell{i,1}(end)+1)+T(chromosome_cell{i,1}(end)+1,customer+1)<TW(customer+1,1)

                    chromosome_cell{i,5}(1,end+1)=sum(chromosome_cell{i,5}(:,end))+workT(chromosome_cell{i,1}(end)+1)+T(chromosome_cell{i,1}(end)+1,customer+1);

                    chromosome_cell{i,5}(2,end)=TW(customer+1,1)-chromosome_cell{i,5}(1,end);

                else

                    chromosome_cell{i,5}(1,end+1)=sum(chromosome_cell{i,5}(:,end))+workT(chromosome_cell{i,1}(end)+1)+T(chromosome_cell{i,1}(end)+1,customer+1);

                    chromosome_cell{i,5}(2,end)=0;

                end

                chromosome_cell{i,1}(end+1)=customer;

                chromosome_cell{i,2}=chromosome_cell{i,2}+q(customer+1);

                chromosome_cell{i,4}=chromosome_cell{i,4}+D(chromosome_cell{i,1}(end-1)+1,chromosome_cell{i,1}(end)+1);

                n_n(R)=[];

                break;

            end

        end

    end

    Total_fuel=zeros(1,vehicle);

    for k=1:vehicle

        Single_fuel=0;

        chromosome_cell{k,4}=chromosome_cell{k,4}+D(chromosome_cell{k,1}(end)+1,1);

        chromosome_cell{k,3}=sum(chromosome_cell{k,5}(:,end))+workT(chromosome_cell{k,1}(end)+1)+T(chromosome_cell{k,1}(end)+1,1);

        Singleton_gene=chromosome_cell{k,1};

        Singleton_weight=0;

        for OIL=1:numel(Singleton_gene)-1

            Singleton_weight=Singleton_weight+q(Singleton_gene(OIL)+1);

            Q_Z=(0.8+0.2*(Singleton_weight/Q))*0.174*450*((22/27)^3)*(D(Singleton_gene(OIL)+1,Singleton_gene(OIL+1)+1)/22);

            Q_F=0.174*450*((22/27)^3)*0.4*workT(Singleton_gene(OIL)+1);

            Single_fuel=Single_fuel+Q_Z+Q_F;

        end

        Single_fuel=Single_fuel+(0.8+0.2*((Singleton_weight+q(Singleton_gene(end)+1))/Q))*0.174*450*((22/27)^3)*(D(Singleton_gene(end)+1,1)/22)+0.174*450*((22/27)^3)*0.4*workT(Singleton_gene(end)+1);

        Total_fuel(k)=Single_fuel;

    end

    all_chromosome_cell{numWolf,1}=[chromosome_cell{:,1}];

    all_chromosome_cell{numWolf,1}(end+1)=0;

    all_chromosome_cell{numWolf,2}=[chromosome_cell{:,2}];

    all_chromosome_cell{numWolf,3}=[chromosome_cell{:,4}];

    all_chromosome_cell{numWolf,4}=[chromosome_cell{:,5}];

    all_chromosome_cell{numWolf,5}=[chromosome_cell{:,3}];

    all_chromosome_cell{numWolf,6}=sum(cell2mat(chromosome_cell(:,4)));

    all_chromosome_cell{numWolf,7}=vehicle;

    all_chromosome_cell{numWolf,10}=Total_fuel;

    all_chromosome_cell{numWolf,11}=sum(Total_fuel);

    all_chromosome_cell{numWolf,12}=all_chromosome_cell{numWolf,7}*Ship+sum(all_chromosome_cell{numWolf,5})*Labor+all_chromosome_cell{numWolf,11}*Fuel_Cost;

    numWolf=numWolf+1;

end

for i=1:popsize

    SuDu=zeros(1,length(all_chromosome_cell{i,1})-1);

    SuDu(:)=v_max;

    all_chromosome_cell{i,8}=SuDu;

end

all_chromosome_cell=sortrows(all_chromosome_cell,12);

BEST=all_chromosome_cell(1,:);

TanWolf=all_chromosome_cell(1:popsize/2,:);

D_GL=repmat(1/8,1,8);D_LP=cumsum(D_GL);

R_GL=repmat(0.2,1,5);R_LP=cumsum(R_GL);

DestroyWeight_matrix=[zeros(2,8);D_GL];

InsertWeight_matrix=[zeros(2,5);R_GL];

temperature=500;

beta=0.98;

nnum=1;

tab=1;

while temperature>=0.01

    TanWolf_Copy=TanWolf;

    first_i=1;

    TanWolf_Son={};

    SIMP={};

    SDEG={};

    while first_i<=length(TanWolf)

        a=randperm(size(TanWolf_Copy,1),1);

        TanWolf_Rand=TanWolf_Copy(a,:);

        TanWolf_Copy(a,:)=[];

        second_i=1;

        h=3;

        while second_i<=h

            [c,b,Insert,TWolf_One,DestroyWeight_matrix,InsertWeight_matrix,POHUA,CHARU]=ALNS_VRPTW_main(DestroyWeight_matrix,InsertWeight_matrix,TanWolf_Rand,n,D_LP,R_LP,Q,q,T,TW,workT,D,v_max);

            TWolf_One{12}=TWolf_One{7}*Ship+sum(TWolf_One{5})*Labor+TWolf_One{11}*Fuel_Cost;

            %TanWolf_Son(h*(first_i-1)+second_i,:)=TWolf_One;

            second_i=second_i+1;

            if TWolf_One{12}<TanWolf_Rand{12}

                SIMP(size(SIMP,1)+1,:) = TWolf_One;

                if TWolf_One{12} < BEST{12}

                    tab=0;

                    Bubian=1;

                    BEST = TWolf_One;

                    DestroyWeight_matrix(2,POHUA)=DestroyWeight_matrix(2,POHUA)+6;%加分6

                    InsertWeight_matrix(2,CHARU)=InsertWeight_matrix(2,CHARU)+6;

                else

                    DestroyWeight_matrix(2,POHUA)=DestroyWeight_matrix(2,POHUA)+1;%加分3

                    InsertWeight_matrix(2,CHARU)=InsertWeight_matrix(2,CHARU)+1;

                end

            else %模拟退火判断

                Num_rand=rand();

                if Num_rand < exp(-(TWolf_One{12}-TanWolf_Rand{12})/temperature)

                    TanWolf_Son(size(TanWolf_Son,1)+1,:)=TWolf_One;

                    DestroyWeight_matrix(2,POHUA)=DestroyWeight_matrix(2,POHUA)+2;%加分3

                    InsertWeight_matrix(2,CHARU)=InsertWeight_matrix(2,CHARU)+2;

                end

            end

        end

        %TanWolf_Copy(first_i,:) = TWolf_One;%%%%%%

        if size(SIMP,1)~=0

            SIMP=sortrows(SIMP,12);

            TanWolf(first_i,:)=SIMP(1,:);

            SIMP={};

        end

        if size(TanWolf_Son,1)<=3 && size(TanWolf_Son,1)>0

            SDEG=[SDEG;TanWolf_Son];

        end

        first_i=first_i+1;

        TanWolf_Son={};

        nnum=nnum+1;

        if rem(nnum,500)==0

            [DestroyWeight_matrix,D_LP]=DestroyWeight_update(DestroyWeight_matrix);

            [InsertWeight_matrix,R_LP] = InsertWeight_update( InsertWeight_matrix);

        end

    end

    tab=tab+1;

    if tab>500

        break

    end

    TanWolf_Son_H=[TanWolf;SDEG];

    TanWolf_Son_H=sortrows(TanWolf_Son_H,12);

    if size(TanWolf_Son_H,1)>120

        TanWolf=TanWolf_Son_H(1:100,:);

    end

    temperature=temperature*0.98;

end

R=BEST{1,1};%最优路径

figure(3)

sz=100;

% scatter(Location(:,1),Location(:,2),50);%客户位置

hold on

[n,nn] = size(D);%节点个数

for i=2:n

    plot(Location(i,1),Location(i,2),'ro','MarkerSize',5,'MarkerEdgeColor','k','MarkerFaceColor','b');

    text(Location(i,1)-0.001,Location(i,2)+0.005,[num2str(i-1)],'Fontsize',10);hold on

end

hold on

plot(Location(1,1),Location(1,2),'p','MarkerSize',30,'MarkerEdgeColor','k','MarkerFaceColor','y');hold on%发货中心

ss=0;

cost=zeros(k,1);

for j=1:length(R)-1

    if R(j)==0

        ss=ss+1;

    end

    switch ss

        case 1

            line([Location(R(j)+1,1),Location(R(j+1)+1,1)],[Location(R(j)+1,2),Location(R(j+1)+1,2)]);hold on%%画出车辆1的路程

            cost(ss,1) = cost(ss,1) + D(R(j)+1,R(j+1)+1);%计算车辆1的路程

        case 2

            line([Location(R(j)+1,1),Location(R(j+1)+1,1)],[Location(R(j)+1,2),Location(R(j+1)+1,2)],'Color','r');hold on%%画出车辆2的路程

            cost(ss,1) = cost(ss,1) + D(R(j)+1,R(j+1)+1);%计算车辆2的路程

        case 3

            line([Location(R(j)+1,1),Location(R(j+1)+1,1)],[Location(R(j)+1,2),Location(R(j+1)+1,2)],'Color','g');hold on %%画出车辆3的路程

            cost(ss,1) = cost(ss,1) + D(R(j)+1,R(j+1)+1);%计算车辆3的路程

        case 4

            line([Location(R(j)+1,1),Location(R(j+1)+1,1)],[Location(R(j)+1,2),Location(R(j+1)+1,2)],'Color','k');hold on %%画出车辆3的路程

            cost(ss,1) = cost(ss,1) + D(R(j)+1,R(j+1)+1);%计算车辆3的路程

        case 5

            line([Location(R(j)+1,1),Location(R(j+1)+1,1)],[Location(R(j)+1,2),Location(R(j+1)+1,2)],'Color','y');hold on %%画出车辆3的路程

            cost(ss,1) = cost(ss,1) + D(R(j)+1,R(j+1)+1);%计算车辆3的路程

        case 6

            line([Location(R(j)+1,1),Location(R(j+1)+1,1)],[Location(R(j)+1,2),Location(R(j+1)+1,2)],'Color','m');hold on %%画出车辆3的路程

            cost(ss,1) = cost(ss,1) + D(R(j)+1,R(j+1)+1);%计算车辆3的路程

        case 7

            line([Location(R(j)+1,1),Location(R(j+1)+1,1)],[Location(R(j)+1,2),Location(R(j+1)+1,2)],'Color',[1 0.6 0.3]);hold on %%画出车辆3的路程

            cost(ss,1) = cost(ss,1) + D(R(j)+1,R(j+1)+1);%计算车辆3的路程

        case 8

            line([Location(R(j)+1,1),Location(R(j+1)+1,1)],[Location(R(j)+1,2),Location(R(j+1)+1,2)],'Color',[0.5 0.5 0.5]);hold on %%画出车辆3的路程

            cost(ss,1) = cost(ss,1) + D(R(j)+1,R(j+1)+1);%计算车辆3的路程

        case 9

            line([Location(R(j)+1,1),Location(R(j+1)+1,1)],[Location(R(j)+1,2),Location(R(j+1)+1,2)],'Color',[0.6 0.4 0.7]);hold on %%画出车辆3的路程

            cost(ss,1) = cost(ss,1) + D(R(j)+1,R(j+1)+1);%计算车辆3的路程

        case 10

            line([Location(R(j)+1,1),Location(R(j+1)+1,1)],[Location(R(j)+1,2),Location(R(j+1)+1,2)],'Color',[0.8 0.4 0.7]);hold on %%画出车辆3的路程

            cost(ss,1) = cost(ss,1) + D(R(j)+1,R(j+1)+1);%计算车辆3的路程

        case 11

            line([Location(R(j)+1,1),Location(R(j+1)+1,1)],[Location(R(j)+1,2),Location(R(j+1)+1,2)],'Color',[0.6 0.6 0.7]);hold on %%画出车辆3的路程

            cost(ss,1) = cost(ss,1) + D(R(j)+1,R(j+1)+1);%计算车辆3的路程

        case 12

            line([Location(R(j)+1,1),Location(R(j+1)+1,1)],[Location(R(j)+1,2),Location(R(j+1)+1,2)],'Color',[0.6 0.4 0.7]);hold on %%画出车辆3的路程

            cost(ss,1) = cost(ss,1) + D(R(j)+1,R(j+1)+1);%计算车辆3的路程

        otherwise

            line([Location(R(j)+1,1),Location(R(j+1)+1,1)],[Location(R(j)+1,2),Location(R(j+1)+1,2)],'Color','c');hold on %%画出车辆4的路程

            cost(ss,1) = cost(ss,1) + D(R(j)+1,R(j+1)+1);%计算车辆4的路程

    end

end

minvalue1=sum(cost);

xlabel('横坐标');

ylabel('纵坐标')

3 仿真结果

 【VRP问题】基于模拟退火算法改进狼群算法求解带时间窗的车辆路径VRPTW问题附matlab代码_粒子群算法_06

4 参考文献

[1]叶勇, and 张惠珍. "求解带时间窗车辆路径问题的狼群算法." 公路交通科技 34.10(2017):8.

博主简介:擅长智能优化算法、神经网络预测、信号处理、元胞自动机、图像处理、路径规划、无人机等多种领域的Matlab仿真,相关matlab代码问题可私信交流。

部分理论引用网络文献,若有侵权联系博主删除。

 【VRP问题】基于模拟退火算法改进狼群算法求解带时间窗的车辆路径VRPTW问题附matlab代码_优化算法_07