【VRP问题】粒子群求解VRPTW模型【Matlab 282期】

一、简介

基本介绍
粒子群优化算法(Particle swarm optimization, PSO)是一种基于群体搜索的处理连续或者离散空间内优化问题的算法。
粒子群算法使用在解空间中不断移动的粒子作为寻优的群体,每个粒子具有位置和速度两个属性(位置和速度的维数和解空间的维数相同),粒子的位置代表了某个可行解,速度代表了与下一个寻找到的可行解的差值。
每个粒子根据自己已经寻找过的最优解和群体当前寻找到的最优解来调整自己的速度(按某种特定规则),以搜索到更优的解。
粒子群算法的基本过程
初始化常数和各记录矩阵:
代价函数计算函数CostFunction; 代价函数参数数目nVar; 代价函数各参数上下界(即粒子位置的边界)[VarMin,VarMax]
最大迭代次数iter_max
粒子群体的数量nPop
粒子速度边界[VelMin,VelMax]
单粒子最优加速常数C1
全局最优加速常数C2(一般取C 1 = C 2 ∈ [ 0 , 4 ] C1=C2\in[0,4]C1=C2∈[0,4])
惯性因子W
粒子位置记录矩阵PopPosition(nPop行nVar列,每一行是一个粒子的位置坐标)
粒子速度记录矩阵PopVelocity(nPop行nVar列,每一行是一个粒子的速度各分量)
单粒子历史最优位置记录矩阵Pbest(nPop行nVar列,每一行是一个粒子历史最优位置坐标)
全局历史最优位置记录矩阵Gbest(一行nVar列,只记录最最优解)
历史最优值记录矩阵(iter_max行一列,每一代的最优解值)
初始化粒子位置和速度:
在粒子的解空间中随机初始化各粒子的位置;在粒子各个速度分量的范围内随机初始化各粒子的初速度。
计算代价函数
计算各粒子当前位置对应的代价函数值,并与该粒子历史最优解比较,更新Pbest矩阵;同时与Gbest比较,更新Gbest值;并更新历史最优值记录矩阵
更新速度和位置
在更新Pbest矩阵和Gbest矩阵后,按下公式更新粒子的速度:
V i + 1 = W V i + C 1 R 1 ( P i − X i ) + C 2 R 2 ( G − X i ) V_{i+1} = WV_i + C_1R_1(P_i-X_i) + C_2R_2(G-X_i)Vi+1​=WVi​+C1​R1​(Pi​−Xi​)+C2​R2​(G−Xi​)
其中,W为惯性因子,表征粒子维持原速不变的能力;C1为单粒子加速常数,表征粒子向他自己历史最优解出加速的能力;C2位全局最优加速常数,表征粒子向当前全局最优解处加速的能力;R1、R2为两个0到1之间的随机数。
计算完速度之后注意要限制速度边界,一旦速度大于边界值,令其等于边界值。
更新速度之后,应该计算粒子下一次的位置,并保存为当前粒子位置:
X i + 1 = X i + V i + 1 X_{i+1} = X_i + V_{i+1}Xi+1​=Xi​+Vi+1​
同理,计算完位置后也要限制边界。
循环迭代和输出
循环迭代计算代价函数和更新速度和位置,达到最大代数之后输出结果即可。
在使用面向对象的语言实现该算法的时候,可以定义粒子这一对象,其应具有属性:当前位置、当前速度、当前代价值、历史最优位置、历史最优代价值,应具有方法:速度更新方法、位置更新方法、代价值更新方法。

二、源代码

%
 
tic
clear
clc
%% 用importdata这个函数来读取文件
r101=importdata('r101.txt');
cap=200;                                                        %车辆最大装载量
%% 提取数据信息
E=r101(1,5);                                                    %配送中心时间窗开始时间
L=r101(1,6);                                                    %配送中心时间窗结束时间
vertexs=r101(:,2:3);                                            %所有点的坐标x和y
customer=vertexs(2:end,:);                                      %顾客坐标
cusnum=size(customer,1);                                       	%顾客数
v_num=25;                                                      	%车辆最多使用数目
demands=r101(2:end,4);                                          %需求量
a=r101(2:end,5);                                                %顾客时间窗开始时间[a[i],b[i]]
b=r101(2:end,6);                                                %顾客时间窗结束时间[a[i],b[i]]
s=r101(2:end,7);                                                %客户点的服务时间
h=pdist(vertexs);
dist=squareform(h);                                             %距离矩阵
%% 粒子群算法参数
alpha=10;                                                       %违反的容量约束的惩罚函数系数
belta=100;                                                      %违反时间窗约束的惩罚函数系数
NIND=50;                                                        %粒子数目
MAXGEN=100;                                                     %迭代次数
w=1;                                                            %惯性因子
wdamp=0.99;                                                     %惯性因子衰减率
c1=1.5;                                                         %个体学习因子
c2=2.0;                                                         %全局学习因子
XvMin=1;                                                        %Xv下限
XvMax=v_num;                                                    %Xv上限
XrMin=1;                                                        %Xr下限
XrMax=cusnum;                                                   %Xr上限
VvMin=-(v_num-1);                                            	%Vv下限
VvMax=v_num-1;                                                  %Vv上限
VrMin=-(cusnum-1);                                            	%Vr下限
VrMax=cusnum-1;                                                 %Vr上限
%% 初始化粒子群位置
init_vc=init(cusnum,a,demands,cap);                             %构造初始解
population=initpopCW(init_vc,NIND,cusnum,XvMin,XvMax,XrMin,XrMax,VvMin,VvMax,VrMin,VrMax);
ObjV=calObj(population,v_num,cap,demands,a,b,L,s,dist,alpha,belta); %计算各个粒子的目标函数值
gbest_pos=population{1,1}(1:2,:);                               %假设第一个粒子位置为全局最优位置
gbest_obj=ObjV(1,1);                                            %第一个粒子位置的目标函数值
pbest_pos=cell(NIND,1);                                         %初始化各个粒子的个体最优位置
pbest_obj=ObjV;                                                 %初始化各个粒子的个体最优的目标函数值
for i=1:NIND
    particle=population{i,1};                                   %第i个粒子
    position=particle(1:2,:);                                   %第i个粒子的位置
    pbest_pos{i,1}=position;                                    %初始化这个粒子的个体最优
    if pbest_obj(i,1)<gbest_obj
        %更新初始种群中的全局最优粒子
        gbest_obj=pbest_obj(i,1);
        gbest_pos=position;
    end
end
globalVC=decode(gbest_pos,v_num);                               %初始全局最优配送方案
%统计一个配送方案的总成本、车辆使用数目、行驶总距离、违反约束路径数目、违反约束顾客数目
[cost,NV,TD,vio_NV,vio_cus]=statistic(globalVC,a,b,s,L,dist,demands,cap,alpha,belta);
disp(['初始全局最优解总成本为:',num2str(cost),',车辆使用数目为:',num2str(NV),...
    ',行驶总距离为:',num2str(TD),',违反约束路径数目为:',num2str(vio_NV),',违反约束顾客数目为:',num2str(vio_cus)]);
BestCost=zeros(MAXGEN,1);                                       %记录每次迭代的全局最优目标函数值
%% 主循环
gen=1;                                                          %计数器
while gen<=MAXGEN
    %% 更新各个粒子的位置和速度
    for i=1:NIND
        particle=population{i,1};                               %第i个粒子
        position=particle(1:2,:);                              	%第i个粒子的位置
        Xv=position(1,:);
        Xr=position(2,:);
        velocity=particle(3:4,:);                               %第i个粒子的速度
        Vv=velocity(1,:);
        Vr=velocity(2,:);
        %% 更新速度
        velocity=w*velocity+ +c1*rand([2,cusnum]).*(pbest_pos{i,1}-position)...
            +c2*rand([2,cusnum]).*(gbest_pos-position);
        %% 速度越界处理
        velocity(1,:)=max(velocity(1,:),VvMin);
        velocity(1,:)=min(velocity(1,:),VvMax);
        velocity(2,:)=max(velocity(2,:),VrMin);
        velocity(2,:)=min(velocity(2,:),VrMax);
        %% 更新位置
        position=position+velocity;
        position(1,:)=ceil(position(1,:));          %对Xv向上取整
        %% 速度镜像影响
        IsOutside=(position(1,:)<XvMin | position(1,:)>XvMax | position(2,:)<XrMin | position(2,:)>XrMax);
        velocity(IsOutside)=-velocity(IsOutside);
        %% 位置越界处理
        position(1,:)=max(position(1,:),XvMin);
        position(1,:)=min(position(1,:),XvMax);
        position(2,:)=max(position(2,:),XrMin);
        position(2,:)=min(position(2,:),XrMax);
        %% 对第i个粒子解码出的配送方案进行relocate操作
        VC=decode(position,v_num);
        RVC=relocate(VC,cap,demands,a,b,L,s,dist,alpha,belta);
        position=change(RVC,cusnum);
        %% 计算第i个粒子目标函数值
        cost=costFuction(RVC,a,b,s,L,dist,demands,cap,alpha,belta);
        %% 更新个体最优
        if cost<pbest_obj(i,1)
            pbest_pos{i,1}=position;
            pbest_obj(i,1)=cost;
            %%  更新全局最优
            if pbest_obj(i,1)<gbest_obj
                gbest_pos=pbest_pos{i,1};
                gbest_obj=pbest_obj(i,1);
            end
        end
        %% 更新第i个粒子的速度和位置
        particle=[position;velocity];
        population{i,1}=particle;
    end
    %% 记录各代全局最优解,打印各代全局最优解
    BestCost(gen)=gbest_obj;
    globalVC=decode(gbest_pos,v_num);                               %初始全局最优配送方案
    %统计一个配送方案的总成本、车辆使用数目、行驶总距离、违反约束路径数目、违反约束顾客数目
    [cost,NV,TD,vio_NV,vio_cus]=statistic(globalVC,a,b,s,L,dist,demands,cap,alpha,belta);
    disp(['第',num2str(gen),'代全局最优解总成本为:',num2str(cost),',车辆使用数目为:',num2str(NV),...
        ',行驶总距离为:',num2str(TD),',违反约束路径数目为:',num2str(vio_NV),',违反约束顾客数目为:',num2str(vio_cus)]);
    w=w*wdamp;
    %% 更新计数器
    gen=gen+1;
end
%% 将全局最优粒子解码为全局最优配送方案
globalVC=decode(gbest_pos,v_num);
%% 对全局最优配送方案进行局部搜索
globalVC=relocate_gbest(globalVC,cap,demands,a,b,L,s,dist,alpha,belta);
%% 统计全局最优配送方案的总成本、车辆使用数目、行驶总距离、违反约束路径数目、违反约束顾客数目
    [cost,NV,TD,vio_NV,vio_cus]=statistic(globalVC,a,b,s,L,dist,demands,cap,alpha,belta);
    disp(['最终全局最优解总成本为:',num2str(cost),',车辆使用数目为:',num2str(NV),...
        ',行驶总距离为:',num2str(TD),',违反约束路径数目为:',num2str(vio_NV),',违反约束顾客数目为:',num2str(vio_cus)]);
%% 画出全局最优配送方案路线图
draw_Best(globalVC,vertexs);
%% Results
figure;
%plot(BestCost,'LineWidth',2);
semilogy(BestCost,'LineWidth',2);
xlabel('迭代次数');
ylabel('全局最优目标函数值');
grid on;
toc

三、运行结果

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

四、备注

完整代码或者代写添加QQ912100926
往期回顾>>>>>>
【路径规划】粒子群优化算法之三维无人机路径规划【Matlab 012期】
【路径规划】遗传算法之多物流中心的开放式车辆路径规划【Matlab 013期】
【路径规划】粒子群算法之机器人栅格路径规划【Matlab 014期】
【路径规划】蚁群算法之求解最短路径【Matlab 015期】
【路径规划】免疫算法之物流中心选址【Matlab 016期】
【路径规划】人工蜂群之无人机三维路径规划【Matlab 017期】
【路径规划】遗传算法之基于栅格地图机器人路径规划【Matlab 018期】
【路径规划】蚁群算法之多无人机攻击调度【Matlab 019期】
【路径规划】遗传算法之基于栅格地图的机器人最优路径规划【Matlab 020期】
【路径规划】遗传算法之考虑分配次序的多无人机协同目标分配建模【Matlab 021期】
【路径规划】蚁群算法之多中心vrp问题【Matlab 022期】
【路径规划】蚁群算法之求解带时间窗的多中心VRP【Matlab 023期】
【路径规划】遗传算法之多中心VRP求解【Matlab 024期】
【路径规划】模拟退火之求解VRP问题【Matlab 025期】
【路径规划】A星之栅格路径规划【Matlab 026期】
【路径规划】基于一种带交叉因子的双向寻优粒子群栅格地图路径规划【Matlab 027期】
【路径规划】【TSP】蚁群算法之求解TSP问题含GUI【Matlab 028期】
【路径规划】蚁群算法之栅格地图路径规划【Matlab 029期】
【路径规划】遗传算法之旅行商 TSP 【Matlab 030期】
【路径规划】模拟退火算法之旅行商 TSP 问题【Matlab 031期】
【路径规划】蚁群算法之智能车路径规划【Matlab 032期】
【路径规划】华为杯:基于matlab 无人机优化运用于抢险救灾【Matlab 033期】
【路径规划】matlab之最小费用最大流算问题【Matlab 034期】
【路径规划】A算法之解决三维路径规划问题【Matlab 035期】
【路径规划】人工蜂群算法之路径规划【Matlab036期】
【路径规划】人工蜂群算法之路径规划【Matlab 037期】
【路径规划】蚁群算法之求解多旅行商MTSP问题【Matlab 038期】
【路径规划】蚁群算法之无人机路径规划【Matlab 039期】
【路径规划】遗传算法之求解多VRP问题【Matlab 040期】
【VRP】遗传算法之带时间窗的车辆路径问题【Matlab 041期】
【路径规划】蚁群算法之三维路径规划【Matlab 042期】
【路径规划】粒子群优化蚁群之求解最短路径【Matlab 043期】
【TSP问题】差分进化之求解TSP问题【Matlab 044期】
【路径规划】RRT之三维路径规划【Matlab 144期】
【路径规划】人工势场算法之无人机编队路径规划【 Matlab 145期】
【VRP问题】节约算法之求解TWVRP问题【Matlab 146期】
【VRP问题】节约算法之求解CVRP问题【Matalb 147期】
【VRP问题】禁忌搜索算法之求解VRP问题【Matalb 148期】
【VRP问题】模拟退火算法之求解CVRP问题【Matlab 149期】
【VRP问题】模拟退火求解带时间窗之TWVRP问题【Matlab 150期】
【VRP问题】人工鱼群算法之求解带时间窗VRP问题【Matlab 151期】
【VRP问题】遗传算法之求解带容量VRP问题【Matlab 152期】
【路径规划】狼群算法算法之三维路径规划【Matlab 153期】
【路径规划】人工势场算法之无人机三维路径规划【Matlab 154期】
【路径规划】改进差分算法之三维多无人机协同航迹规划【Matlab 155期】
【路径规划】人工蜂群算法之多无人机三维路径规划【Matlab 156期】
【路径规划】麻雀搜索算法之无人机三维路径规划【Matlab 157期】
【路径规划】蚁群算法之三维路径规划【Matlab 158期】
【路径规划】免疫算法之最短路径规划【Matlab 159期】
【旅行商问题】免疫算法之求解旅行商问题【Matlab 160期】
【路径规划】遗传算法的公交排班系统分析【Matlab 161期】
【TSP】粒子群算法Hopfield之TSP求解【Matlab 162期】
【路径规划】A和改进A*的路径规划【Matlab 163期】
【TSP】改进的禁忌搜索算法之求解旅行商问题【Matlab 170期】
【TSP】改进的蚁群算法之求解旅行商问题【Matlab 171期】
【路径规划】模拟退火算法之求解火灾巡逻最短路径【Matlab 193期】
【三维路径规划】蚁群算法寻优潜水器的三维路径【Matlab 194期】
【三维路径规划】matlab 蚁群算法UAV巡检路径【Matlab 195期】
【三维路径规划】无人机的三维动态仿真【Matlab 196期】
【三维路径规划】无人机三维空间的航迹规划【Matlab 228期】
【路径规划】分布式目标检测和跟踪的多无人机【Matlab 229期】
【路径规划】粒子群算法求解无人机最短路径【Matlab 277期】
【无人机】多无人协同任务分配程序平台【Matlab278期】
【路径规划】多无人机协同任务规划【Matlab 279期】
【路径规划】任意架次植保无人机作业路径规划【Matlab 280期】
【路径规划】粒子群遗传求解多无人机三维路径规划【Matlab 281期】

已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 游动-白 设计师:白松林 返回首页