CVRP基于matlab人工鱼群算法求解带容量的车辆路径规划问题含Matlab源码 1486期

Posted 紫极神光

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CVRP基于matlab人工鱼群算法求解带容量的车辆路径规划问题含Matlab源码 1486期相关的知识,希望对你有一定的参考价值。

一、获取代码方式

获取代码方式1:
通过订阅紫极神光博客付费专栏,凭支付凭证,私信博主,可获得此代码。

获取代码方式2:
通过紫极神光博客主页开通CSDN会员,凭支付凭证,私信博主,可获得此代码。

获取代码方式3:
完整代码已上传我的资源:【CVRP】基于matlab人工鱼群算法求解带容量的车辆路径规划问题【含Matlab源码 1486期】

备注:开通CSDN会员,仅只能免费获得1份代码(有效期为开通日起,三天内有效);
订阅紫极神光博客付费专栏,可免费获得1份代码(有效期为订阅日起,三天内有效);

二、VRP简介

1 VRP基本原理
车辆路径规划问题(Vehicle Routing Problem,VRP)是运筹学里重要的研究问题之一。VRP关注有一个供货商与K个销售点的路径规划的情况,可以简述为:对一系列发货点和收货点,组织调用一定的车辆,安排适当的行车路线,使车辆有序地通过它们,在满足指定的约束条件下(例如:货物的需求量与发货量,交发货时间,车辆容量限制,行驶里程限制,行驶时间限制等),力争实现一定的目标(如车辆空驶总里程最短,运输总费用最低,车辆按一定时间到达,使用的车辆数最小等)。
VRP的图例如下所示:

2 问题属性与常见问题
车辆路径问题的特性比较复杂,总的来说包含四个方面的属性:
(1)地址特性包括:车场数目、需求类型、作业要求。
(2)车辆特性包括:车辆数量、载重量约束、可运载品种约束、运行路线约束、工作时间约束。
(3)问题的其他特性。
(4)目标函数可能是总成本极小化,或者极小化最大作业成本,或者最大化准时作业。

3 常见问题有以下几类:
(1)旅行商问题
(2)带容量约束的车辆路线问题(CVRP)



该模型很难拓展到VRP的其他场景,并且不知道具体车辆的执行路径,因此对其模型继续改进。



(3)带时间窗的车辆路线问题
由于VRP问题的持续发展,考虑需求点对于车辆到达的时间有所要求之下,在车辆途程问题之中加入时窗的限制,便成为带时间窗车辆路径问题(VRP with Time Windows, VRPTW)。带时间窗车辆路径问题(VRPTW)是在VRP上加上了客户的被访问的时间窗约束。在VRPTW问题中,除了行驶成本之外, 成本函数还要包括由于早到某个客户而引起的等待时间和客户需要的服务时间。在VRPTW中,车辆除了要满足VRP问题的限制之外,还必须要满足需求点的时窗限制,而需求点的时窗限制可以分为两种,一种是硬时窗(Hard Time Window),硬时窗要求车辆必须要在时窗内到达,早到必须等待,而迟到则拒收;另一种是软时窗(Soft Time Window),不一定要在时窗内到达,但是在时窗之外到达必须要处罚,以处罚替代等待与拒收是软时窗与硬时窗最大的不同。


模型2(参考2017 A generalized formulation for vehicle routing problems):
该模型为2维决策变量



(4)收集和分发问题
(5)多车场车辆路线问题
参考(2005 lim,多车场车辆路径问题的遗传算法_邹彤, 1996 renaud)

由于车辆是同质的,这里的建模在变量中没有加入车辆的维度。


(6)优先约束车辆路线问题
(7)相容性约束车辆路线问题
(8)随机需求车辆路线问题

4 解决方案
(1)数学解析法
(2)人机交互法
(3)先分组再排路线法
(4)先排路线再分组法
(5)节省或插入法
(6)改善或交换法
(7)数学规划近似法
(8)启发式算法

5 VRP与VRPTW对比

三、人工鱼群算法简介

1 觅食行为
  指鱼循着食物多的方向游动的一种行为,人工鱼X i X_iXi​在其视野内随机选择一个状态X j X_jXj​,分别计算它们的目标函数值进行比较,如果发现Y j Y_jYj​比Y i Y_iYi​优(Y j Y_jYj​和Y i Y_iYi​分别为X j X_jXj​和X i X_iXi​的适应度值),则Xi向Xj的方向移动一步;否则,X i X_iXi​继续在其视野内选择状态X j X_jXj​,判断是否满足前进条件,反复尝试t r y n u m b e r trynumbertrynumber次后,仍没有满足前进条件,则随机移动一步使X i X_iXi​到达一个新的状态。表达式如下:
X j = X i + r a n d ( ) ∗ v i s u a l (1) X_j=X_i+rand()*visual \\tag{1}Xj​=Xi​+rand()∗visual(1)                
X n e x t = X i + r a n d ( ) ∗ s t e p ∗ X j − X i ∣ ∣ X j − X i ∣ ∣ (2) X_{next}=X_i+rand()step\\frac{X_j-X_i}{\\left | \\left | X_j-X_i \\right | \\right |}\\tag{2}Xnext​=Xi​+rand()∗step∗∣∣Xj​−Xi​∣∣Xj​−Xi​​(2)
X n e x t = X i + r a n d ( ) ∗ s t e p (3) X_{next}=X_i+rand()*step \\tag{3}Xnext​=Xi​+rand()∗step(3)                
  其中rand()是介于0和1之间的随机数。

人 工 鱼 的 视 觉 描 述 人工鱼的视觉描述人工鱼的视觉描述
  框架图如下所示:

伪代码段如下:

for i = 1:N
	for j = 1:Try_number
        Xj=x(i)+Visual.*rand();%人工鱼Xi按式(1)在其视野内随机选择一个状态Xj
        if f(Xj)<f(x(i))	   %比较Xj和Xi的适应度
            X_next= x(i)+rand()*step*(Xj-x(i))/norm(Xj-x(i)); %人工鱼Xi按式(2)朝着Xj方向移动一步,norm()函数表示二范数 
            break;
        else
        	X_next=x(i)+step*rand();
        end
    end
end

2 聚群行为

鱼在游动过程中为了保证自身的生存和躲避危害会自然地聚集成群 。人工鱼X i X_iXi​搜索其视野内(d i j < v i s u a l d_{ij}<visualdij​<visual)的伙伴数目n f n_fnf​及中心位置X c X_cXc​,若Y c / n f < δ Y i Y_c/n_f< δY_iYc​/nf​<δYi​(求极小值时使用小于号,在求极大值时则相反;Y c Y_cYc​和Y i Y_iYi​分别为X c X_cXc​和X i X_iXi​的适应度值),表明伙伴中心位置状态较优且不太拥挤,则X i X_iXi​朝伙伴的中心位置移动一步,否则执行觅食行为;
  框架图如下所示:

伪代码段如下:

nf=0;X_inside=0;
for i = 1:N
    for j = 1:N   
        if norm(x(j)-x(i))<Visual 		% 求人工鱼Xi与其他人工鱼之间的距离
            nf = nf+1;                  %统计在视野范围内的鱼数量   
            X_inside= X_inside+x(j);    %将视野范围内的鱼进行累加
        end
         X_inside=X_inside-x(i);  		%需要去除Xi本身;因为在 一开始计算时,i=j,把中心的鱼也进行了一次计算
         nf=nf-1;   
         Xc = X_inside/nf; 				%此时Xc表示Xi感知范围其他伙伴的中心位置; 
         if  f(Xc)/nf < δ*f(x(i))
            x_next=x(i)+rand*Step*(Xc-x(i))/norm(Xc-x(i)); 
         else
             进行觅食行动
         end
    end
end

3 追尾行为

指鱼向其视野区域内的最优方向移动的一种行为。人工鱼X i X_iXi​搜索其视野内(d i j < v i s u a l d_{ij}<visualdij​<visual)适应度最高的个体X j X_jXj​,其适应度值为Y j Y_jYj​,并探索人工鱼X j X_jXj​视野内的伙伴数目n f n_fnf​,若Y j / n f < δ Y i Y_j/n_f< δY_iYj​/nf​<δYi​,表明X j X_jXj​状态较优且不太拥挤,则X i X_iXi​朝X j X_jXj​位置移动一步,否则执行觅食行为;
  框架图如下所示:

伪代码段如下:

Y_max=inf;nf=0;
for i = 1:N    
    %搜索人工鱼Xi视野范围内的最高适应度个体Xj
    for j = 1:N     
        if norm(x(j)-x(i))<Visual && f(x(j))<Y_max		% 求人工鱼Xi与其他人工鱼之间的距离
            X_max=x(j);        
            Y_max=f(x(j));
        end
    end
    %搜索人工鱼Xj视野范围内的伙伴数量
    for j = 1:N        
        if(norm(x(j)-X_max)<Visual)       
            nf=nf+1;
        end
    end
    nf=nf-1;%去掉他本身
    if Y_max/nf<delta*f(x(i))
        x_next= x(i,:)+rand*Step.*(temp_maxX-x(i,:))./norm(temp_maxX-x(i,:));
    else
        进行觅食行为;
    end
end

4 算法总述

综上所述,算法在运算过程中,会同时进行聚群和追尾行为。而觅食行为属于这两种行为中发现聚群对象或者追尾对象附近拥挤度过大时,人工鱼选择的行为方式,若在觅食过程中,未发现比自身适应度高的人工鱼,则按步长step随机移动。最后对聚群行为和追尾行为得到的适应度值进行比较,选择优秀的人工鱼作为下一代的个体。其总框架图如下:

2 分析拥挤度因子δ δδ
2.1 拥挤度因子的取值
  在求极小值问题中:δ = α n m a x , α ∈ ( 0 , 1 ] δ=αn_{max}, α∈(0,1]δ=αnmax​,α∈(0,1]
  在求极大值问题中:δ = 1 α n m a x , α ∈ ( 0 , 1 ] δ=\\frac{1}{αn_{max}},α∈(0,1]δ=αnmax​1​,α∈(0,1]
  其中α αα为极值接近水平,n m a x n_{max}nmax​为期望在该邻域内聚集的最大人工鱼数目。

2.2 拥挤度因子的作用机理
  对追尾行为的描述

图中af0为人工鱼af1-5在各自视野内的最优人工鱼,其实物浓度为Y j Y_jYj​,C1为以af0为圆心,以视野范围为半径的圆,即能探知af0的最远距离,人工鱼越靠近af0,状态越优。
  求极大值情况下:当δ n f ≤ 1 δn_f\\leq 1δnf​≤1时,所有人工鱼af1-5都执行追尾行为,向af0游动;
δ = 1 α n m a x δ=\\frac{1}{αn_{max}}δ=αnmax​1​
δ n f = n f α n m a x ≤ 1 δn_f =\\frac{n_f}{αn_{max}}\\leq 1δnf​=αnmax​nf​​≤1
  当α αα=1的时候,可以明显看出来n f ≤ n m a x n_f \\leq n_{max}nf​≤nmax​,即说明人工鱼视野范围内不拥挤。

当δ n f > 1 δn_f >1δnf​>1时,若C2的食物浓度为Y j δ n f \\frac{Y_j}{δn_f }δnf​Yj​​的等浓度食物圈,则C2与C1间的人工鱼af1、af2、af3执行追尾行动,向af0游动,人工鱼af4、af5执行觅食行为。此时δnf 越大执行追尾行动的人工鱼越少,反之越多。

2.3 拥挤度因子的影响

以极大值为例(极小值的情况正好和极大值相反), δ δδ越大,表明允许的拥挤程度越小,人工鱼摆脱局部最优的能力越强;但是收敛的速度会有所减缓,这主要因为人工鱼在逼近极值的同时,会因避免过分拥挤而随机走开或者受其它人工鱼的排斥作用,不能精确逼近极值点。可见,δ δδ的引入避免了人工鱼过度拥挤而陷入局部极值,另一方面,该参数会使得位于极值点附近的人工鱼之间存在相互排斥的影响,而难以向极值点精确逼近,所以,对于某些局部极值不是很严重的具体问题,可以忽略拥挤的因素,从而在简化算法的同时也加快了算法的收敛速度和提高结果的精确程度。

四、部分源代码

clear
clc
tic                                                                 %开始计时

c101=importdata('c101.txt');                                        %用importdata这个函数来读取文件 
demand=c101(2:end,4);                                               %需求量
vertexs=c101(:,2:3);                                                %所有点的坐标x和y
customer=vertexs(2:end,:);                                          %顾客坐标
cap=200;                                                            %车辆载重量
L=size(customer,1);                                                 %顾客数
K=25;                                                               %车辆数目

h=pdist(vertexs);                                                   %计算顾客之间的距离
D=squareform(h);                                                    %计算顾客之间的距离
%% 初始化参数
FishNum=9;                                                          %生成10只人工鱼
Max_gen=100;                                                        %最多迭代次数
trynumber=500;                                                      %最多试探次数
Visual=16;                                                          %感知距离
deta=0.8;                                                           %拥挤度因子
%% 预处理,确定能使用的车辆最少数目
[minK,chrom_minK,vc_minK,r_minK]=Pre_Deal(L,K,demand,cap);
%% 鱼群初始化,每一行表示一条鱼
initFish=AF_init(FishNum,minK,L);

BestY=zeros(Max_gen,1);                                             %记录每次迭代过程中最优路径的距离
besty=inf;                                                          %最优总距离,初始化为无穷大
gen=1;
currX=initFish;
currY=AF_foodconsistence(currX,D,L,minK,demand,cap);
while gen<=Max_gen
    for i=1:FishNum
        [Xinext,flag]= AF_movestrategy(currX,i,D,Visual,deta,trynumber,L,minK,demand,cap);
        currX(i,:)=Xinext;
    end
    currY=AF_foodconsistence(currX,D,L,minK,demand,cap);
    [Ymin,index]=min(currY);
    if Ymin<besty
        besty=Ymin;
        bestx=currX(index,:);
        BestY(gen)=besty;
    else
        BestY(gen)=BestY(gen-1);
    end
    %% 追尾行为
%输入X:               鱼群集合
%输入i:               第i条人工鱼
%输入D:               距离矩阵
%输入Visual:          感知距离
%输入deta:            拥挤度因子
%输入trynumber:       最多试探次数
%输入L:               顾客数目
%输入K:               车辆数目
%输入demand:          每个顾客的需求配送量
%输入cap:             每辆车的载重量
%输出Xinext:          新找到的路径
%输出flag:            标记是否找到更好的路径,flag=0表示追尾失败,flag=1表示追尾成功
function [Xinext,flag]=AF_follow(X,i,D,Visual,deta,trynumber,L,K,demand,cap)
Xi=X(i,:);                                                      %第i条人工鱼
N=size(X,1);                                                    %鱼群数目
Yi=AF_foodconsistence(Xi,D,L,K,demand,cap);                     %路径Xi的总距离
neighbork=k_neighborhood(X,i,Visual);                           %Xi的邻域集合
nf=size(neighbork,1);                                           %邻域集合中鱼的数量
flag=0;                                                         %标记是否追尾成功,即新路径是否比原来路径总距离更短
Y=AF_foodconsistence(neighbork,D,L,K,demand,cap);               %邻域中各条路径的总距离
[Ymin,minIndex]=min(Y);                                         %找出邻域集合中总距离最小的那条路径
Xmin=neighbork(minIndex,:);                                     %邻域集合中总距离最小的那条路径

if ~isempty(Ymin)
    if (Ymin<Yi) && (nf/N<deta)
        Xinext=Xmin;
        flag=1;
    else
        [Xinext,flag]=AF_prey(X,i,D,trynumber,Visual);
    end
else
    [Xinext,flag]=AF_prey(X,i,D,trynumber,Visual,L,K,demand,cap);
end

end
%% 本程序用来使第i条人工鱼觅食,假如觅食成功,则flag 为1,X中为i鱼觅食后的状态,否则flag为0
%输入X:               鱼群集合
%输入i:               第i条人工鱼
%输入D:               距离矩阵
%输入trynumber:       最多试探次数
%输入Visual:          感知距离
%输入L:               顾客数目
%输入K:               车辆数目
%输入demand:          每个顾客的需求配送量
%输入cap:             每辆车的载重量
%输出Xinext:          新找到的路径
%输出flag:            标记是否找到更好的路径,flag=0表示觅食失败,flag=1表示觅食成功
function [Xinext,flag]=AF_prey(X,i,D,trynumber,Visual,L,K,demand,cap)

Xinext=[];
Yi=AF_foodconsistence(X(i,:),D,L,K,demand,cap);                     %路径Xi的总距离
CityNum=length(X(i,:));
flag=0;                                                         %标记是否觅食到更好路径,flag=0表示没觅食到,flag=1表示觅食成功
for j=1:trynumber
    while(1)
        DJ=floor(rand*Visual)+1;    %不相同的字段数
        if(DJ>0 && DJ<=Visual)         %在视野范围内
            break;
        end
    end
    while(1)
         S(1)=floor(rand*CityNum)+1;
         if(S(1)>1 && S(1)<=CityNum)  %在所有城市里
            break;
         end
    end
    p=1;
    while(p<DJ)
       t=floor(rand*CityNum)+1;
       if(t>1&&t<=CityNum && sum(S==t)==0)
           p=p+1;
           S(p)=t;
       end
   end
   Xi=X(i,:);
   t=Xi(S(1));
   for k=1:DJ-1
       Xi(S(k))=Xi(S(k+1));
   end
   Xi(S(DJ))=t;
   YY=AF_foodconsistence(Xi,D,L,K,demand,cap);                     %路径Xi的总距离
   if YY<Yi
       Xinext=Xi;
       flag=1;
       return;
   end
end
Xinext=Xi;

end


五、运行结果

六、matlab版本及参考文献

1 matlab版本
2014a

2 参考文献
[1] 包子阳,余继周,杨杉.智能优化算法及其MATLAB实例(第2版)[M].电子工业出版社,2016.
[2]张岩,吴水根.MATLAB优化算法源代码[M].清华大学出版社,2017.

以上是关于CVRP基于matlab人工鱼群算法求解带容量的车辆路径规划问题含Matlab源码 1486期的主要内容,如果未能解决你的问题,请参考以下文章

CVRP基于matlab遗传算法求解带容量的车辆路径规划问题含Matlab源码 1280期

VRP问题基于蚁群算法求解带容量限制车辆路径CVRP问题matlab源码

CVRP基于matlab蚁群算法求解带容量的车辆路径规划问题含Matlab源码 1039期

VRP问题基于人工鱼群求解带时间窗的VRP问题matlab源码

VRP问题基于人工鱼群求解带时间窗的VRP问题matlab源码

VRP问题基于节约算法CW求解带容量的车辆路径规划问题(CVRP)