【路径规划】基于蚁群算法求解运钞车路径规划VRPSD问题matlab代码

278 阅读5分钟

1 简介

近年来,国内各大城市陆续建立了专业的金融押运企业,为银行网点的现钞运送提供服务。为了实现运钞智能化,降低银行运营成本,需要对银行现钞运送车辆路径规划提供决策支持。而银行运钞车路线规划问题是车辆路径规划的一个实际应用。到目前为止,出现了很多求解车辆路径问题的算法,有精确算法(accurate algorithm)和启发式算法(heuristicsalgorithms)。其中,精确算法用来求解问题最优解的方式是严格的数学方法,启发式算法则利用对状态空间的位置评价来找到较好的位置,再基于这个位置进行搜索,直到找到目标为止。随着问题规模不断地扩大,精确算法的计算量越来越大,还不能直接用来解决实际问题。启发式算法则可以根据不同的问题要求来求解问题。基于VRP问题的本质,不太可能使用精确的方法求解VRP的大规模的实例。因此,大部分方法都依赖于启发式方法来获取近似解。许多方法已经被用到了这个领域中,其中有选择使用标准优化技术的算法,例如,蚁群算法、遗传算法、模拟退火和约束编程。我们在这里关注于元启发式算法,主要是蚁群算法。蚁群算法是启发式算法中主流的一种算法。由Marco Dorigo于1992年受到蚂蚁觅食行为启发而提出,将其应用到了组合优化问题中。本文对银行运钞车路径规划设计了蚁群算法求解运钞车路径规划问题,通过实验结果表明,蚁群算法可以找到相对较好的解,而且具有很强的鲁棒性。​

img

img

img

img

2 部分代码

%{

[代码说明]
蚁群算法解决VRP问题

[算法说明]
首先实现一个ant蚂蚁类,用此蚂蚁类实现搜索。
算法按照tsp问题去解决,但是在最后计算路径的时候有区别。

比如有10个银行网点,网点1是银行中心,蚂蚁搜索的得到的路径是1,3,5,9,4,10,2,6,8,7。

计算路径的时候把网点依次放入派送线路中,
每放入一个网点前,检查该网点放入后是否会超过运钞车最大载重
如果没有超过就放入
如果超过,就重新开始一条派送路线
……
直到最后一个网点运送完
就会得到多条派送路线


%}

%清除所有变量和类的定义
clear;
clear classes;

%蚁群算法参数(全局变量)
global ALPHA; %启发因子
global BETA; %期望因子
global ANT_COUNT; %蚂蚁数量
global CITY_COUNT; %网点数量
global RHO; %信息素残留系数!!!
global IT_COUNT; %迭代次数
global DAry; %两两网点间距离
global TAry; %两两网点间信息素
global CITYWAry; %网点货物需求量
global VW; %运钞车最大载重

%===================================================================

%设置参数变量值
ALPHA=1.0;
BETA=2.0;
RHO=0.95;

IT_COUNT=1000;

VW=100;

%===================================================================
%读取数据并根据读取的数据设置其他参数
load data.txt; %从文本文件加载数据
city_xy_ary=data(:,2:3); %得到网点的坐标数据
CITYWAry=data(:,4); %得到每个网点的资金需求量
x_label=data(:,2); %第二列为横坐标
y_label=data(:,3); %第三列为纵坐标
C=[x_label y_label];     %坐标矩阵

CITY_COUNT=length(CITYWAry); %得到网点数量(包括银行中心在内)
ANT_COUNT=round(CITY_COUNT*2/3)+1; %根据网点数量设置蚂蚁数量,一般设置为网点数量的2/3

%MMAS信息素参数
%计算最大信息素和最小信息素之间的比值
PBest=0.05; %蚂蚁一次搜索找到最优解的概率
temp=PBest^(1/CITY_COUNT);
TRate=(1-temp)/((CITY_COUNT/2-1)*temp); %最大信息素和最小信息素之间的比值

%信息素的最大最小值开始的时候设置成多大无所谓
%第一次搜索完成会生成一个最优解,然后用这个解会重新产生最大最小值
Tmax=1; %信息素最大值
Tmin=Tmax*TRate; %信息素最小值


% 计算两两网点间距离 
DAry=zeros(CITY_COUNT);
for i=1:CITY_COUNT
  for j=1:CITY_COUNT       
      DAry(i,j)=sqrt((city_xy_ary(i,1)-city_xy_ary(j,1))^2+(city_xy_ary(i,2)-city_xy_ary(j,2))^2);
  end
end


% 初始化网点间信息素
TAry=zeros(CITY_COUNT);
TAry=TAry+Tmax;

%===================================================================

%初始化随机种子
rand('state', sum(100*clock));

%另一种方法
%rand('twister',sum(100*clock))

%定义蚂蚁
mayi=ant()

Best_Path_Length=10e9; %最佳路径长度,先设置成一个很大的值


tm1=datenum(clock); %记录算法开始执行时的时间

       
  %更新最后网点返回出发网点路径上的信息素
  TAry(n,1)=TAry(n,1)+dbQ
  TAry(1,n)=TAry(n,1);
       
   
  %-------------------------------------------------------------
  %更新完信息素,进行边界检查    
  Tmax=1/((1-RHO)*Best_Path_Length); %信息素最大值
  Tmin=Tmax*TRate; %信息素最小值
   
  for m=1:CITY_COUNT
      for n=1:CITY_COUNT
          if (TAry(m,n)>Tmax) 
              TAry(m,n)=Tmax;
          end
          if (TAry(m,n)<Tmin)
              TAry(m,n)=Tmin;                
          end
      end
  end
   
  %-------------------------------------------------------------
  %换行
  fprintf('\n');
      
end

tm2=datenum(clock); %记录算法结束执行时的时间

fprintf('\n搜索完成 , 用时%.3f秒 , 最佳路径长为%.3f , 派送方案如下 ::\n\n[1]',(tm2-tm1)*86400,Best_Path_Length);


%===================================================================
%输出结果
dbW=0;
for i=2:CITY_COUNT
  m=Best_Path(i-1); %上一个网点
  n=Best_Path(i); %当前网点

  if (dbW+CITYWAry(n)>VW) %运送的资金超过限制
      fprintf('         (满载率 : %.1f%%)\n[1]-%d',dbW*100/VW,n);
      dbW=CITYWAry(n); %运输的资金等于该城市的需求量
  else %没有超过限制
      fprintf('-%d',n);
      dbW=dbW+CITYWAry(n); %运输的资金加上该城市的需求量                
  end                
end
fprintf('         (满载率 : %.1f%%)',dbW*100/VW);

fprintf('\n\n');

%====== [程序结束]=====================================================


figure(1)   %作迭代收敛曲线图
x=linspace(0,IT_COUNT,IT_COUNT);
y=L_best(:,1);
plot(x,y);
xlabel('迭代次数'); ylabel('最短路径长度')

3 仿真结果

4 参考文献

[1]王星. 基于蚁群算法的图书物流车辆路径规划问题研究[D]. 武汉理工大学, 2011.

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