matlab改进萤火虫算法求解路径优化VRP

Posted 张叔zhangshu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了matlab改进萤火虫算法求解路径优化VRP相关的知识,希望对你有一定的参考价值。

tic
clear
clc
%% 导入订单数据和各个储位物品的重量数据
load orders.mat orders
load item_weight.mat item_weight
%% 仓库参数初始化
depot_leftAisle=1.5;        %仓库与第1条拣选通道的距离,1.5LU
enter_leave_aisle=1;        %从通道进入拣选通道或从拣选通道进入通道需要行走的距离,1LU
adjacent_location=1;        %同一条拣选通道的两个相邻储位之间的距离,1LU
adjacent_aisle=5;           %两个相邻拣选通道的距离,5LUs
aisle_num=10;               %拣选通道数目
side_num=15;                %每条拣选通道一侧的储位数目
capacity=100;               %设备最大装载量,单位kg
%% 订单数据数据初始化
orders_num=20;              %订单数目
batches_maxnum=10;          %允许分批的最大数目
%% 萤火虫算法参数初始化
MAXGEN=100;                         %最大迭代次数
NIND=50;                            %萤火虫数目
N=batches_maxnum+orders_num-1;      %编码长度
alpha=2000;                         %违反设备装载量约束的惩罚因子
gama=0.95;                          %光吸收系数
%% 初始化
Population=init_pop(NIND,N);        %随机初始化
best_firefly=Population(1,:);       %初始全局最优
[batches,batches_num,bestTD,violate_batch,violate_order]=decode(best_firefly,orders,batches_maxnum,orders_num,capacity,item_weight,...
    side_num,depot_leftAisle,enter_leave_aisle,adjacent_location,adjacent_aisle);
disp(['初始订单分批数目:',num2str(batches_num),',总行驶距离:',num2str(bestTD),...
    ',违反约束订单分批数目:',num2str(violate_batch),',违反约束订单数目:',num2str(violate_order)]);
best_cost=cost_function(batches,orders,item_weight,capacity,side_num,depot_leftAisle,...
    enter_leave_aisle,adjacent_location,adjacent_aisle,alpha);   %初始全局最优分批方案的总行驶距离
Best_Cost=zeros(MAXGEN,1);          %记录每一次迭代全局最优总距离
Best_TD=zeros(MAXGEN,1);          %记录每一次迭代全局最优总距离
%% 主循环
gen=1;
while gen<=MAXGEN
    %% 计算种群目标函数值
    Obj=obj_function(Population,orders,batches_maxnum,orders_num,capacity,item_weight,...
        side_num,depot_leftAisle,enter_leave_aisle,adjacent_location,adjacent_aisle,alpha);
    %% 更新萤火虫位置
    for i=1:NIND
        Individual1=Population(i,:);                    %第i个萤火虫
        for j=1:NIND
            Individual2=Population(j,:);            %第j个萤火虫
            %如果第j个萤火虫发光强度更大,则需要将第i个萤火虫向第j个萤火虫靠近
            if Obj(j,1)<Obj(i,1)
                rij=cal_rij(Individual1,Individual2);   %计算两个萤火虫之间的距离
                cross_len=randi([1,ceil(rij*gama^gen)],1,1);    %计算交叉片段长度
                [Individual1,Individual2]=crossover(Individual1,Individual2,cross_len);     %交叉操作,得到新的第i个萤火虫
                newObj1=obj_function(Individual1,orders,batches_maxnum,orders_num,capacity,item_weight,...
                    side_num,depot_leftAisle,enter_leave_aisle,adjacent_location,adjacent_aisle,alpha);%交叉后得到的新萤火虫
                if newObj1<Obj(i,1)
                    Population(i,:)=Individual1;                     %更新新种群第i个萤火虫位置
                    Obj(i,1)=newObj1;
                    %更新新种群中第i个萤火虫的目标函数值
                end
            end
        end
    end
    %% 从更新后的Population中选择目标函数值在前10%的个体
   offspring=select(Population,orders,batches_maxnum,orders_num,capacity,item_weight,...
    side_num,depot_leftAisle,enter_leave_aisle,adjacent_location,adjacent_aisle,alpha);
    %% 局部搜索
    offspring=local_search(offspring,orders,batches_maxnum,orders_num,capacity,item_weight,alpha,...
    side_num,depot_leftAisle,enter_leave_aisle,adjacent_location,adjacent_aisle);
    %% 将局部搜索后的offspring与原来的Population进行合并
    Population=merge(Population,offspring,Obj);
    %% 找到全局最优的萤火虫
    Obj=obj_function(Population,orders,batches_maxnum,orders_num,capacity,item_weight,...
        side_num,depot_leftAisle,enter_leave_aisle,adjacent_location,adjacent_aisle,alpha);
    [min_Obj,min_index]=min(Obj);                              %排在第1位的是最小目标函数值
    if min_Obj<best_cost
        best_firefly=Population(min_index,:);                   %更新全局最优萤火虫
        best_cost=min_Obj;
    end
    Best_Cost(gen,1)=best_cost;                   %记录每次迭代全局最优目标函数值
    %% 打印
    [best_batches,batches_num,bestTD,violate_batch,violate_order]=decode(best_firefly,orders,batches_maxnum,orders_num,capacity,item_weight,...
        side_num,depot_leftAisle,enter_leave_aisle,adjacent_location,adjacent_aisle);
    disp(['第',num2str(gen),'代全局最优萤火虫订单分批数目:',num2str(batches_num),',总行驶距离:',num2str(bestTD),...
        ',违反约束订单分批数目:',num2str(violate_batch),',违反约束订单数目:',num2str(violate_order)]);
    %% 记录全局最优总行走距离
    Best_TD(gen,1)=bestTD;
    %% 计数器加1
    gen=gen+1;
end
%% 输出优化过程图
figure;
plot(Best_TD,'LineWidth',1);
title('优化过程')
xlabel('迭代次数');
ylabel('拣选总行走距离');
%% 将全局最优萤火虫解码为订单分批方案
[best_batches,best_num,bestTD]=decode(best_firefly,orders,batches_maxnum,orders_num,capacity,item_weight,...
    side_num,depot_leftAisle,enter_leave_aisle,adjacent_location,adjacent_aisle);
toc



最优解:
车辆使用数目:3,车辆行驶总距离:173.4115,违反约束路径数目:0,违反约束顾客数目:0

配送路线1:0->10->11->9->6->4->2->1->0
配送路线2:0->13->15->14->12->0
配送路线3:0->5->3->7->8->0
历时 17.533005 秒。

如需帮助请私聊

以上是关于matlab改进萤火虫算法求解路径优化VRP的主要内容,如果未能解决你的问题,请参考以下文章

matlab改进萤火虫算法求解路径优化VRP

matlab改进萤火虫算法求解路径优化VRP

matlab改进(结合聚类)头脑风暴算法求解路径优化问题VRP

matlab改进(结合聚类)头脑风暴算法求解路径优化问题VRP

matlab改进(结合聚类)头脑风暴算法求解路径优化问题VRP

优化求解改进的萤火虫算法matlab源码