NSGAII算法

NSGA一II算法的基本思想为:首先,随机产生规模为N的初始种群,非支配排序后通过遗传算法的选择、交叉、变异三个基本操作得到第一代子代种群;其次,从第二代开始,将父代种群与子代种群合并,进行快速非支配排序,同时对每个非支配层中的个体进行拥挤度计算,根据非支配关系以及个体的拥挤度选取合适的个体组成新的父代种群;最后,通过遗传算法的基本操作产生新的子代种群:依此类推,直到满足程序结束的条件。相应的程序流程图如下图所示。

【VRP问题】基于NSGA算法求解多中心VRP问题_matlab

3.1 快速非支配排序算法

【VRP问题】基于NSGA算法求解多中心VRP问题_matlab_02

3.2 拥挤度和拥挤度比较算子

挤度是指种群中给定个体的周围个体的密度,直观上可表示为个体。周围仅仅包含个体。本身的最大长方形的长,用nd表示,

【VRP问题】基于NSGA算法求解多中心VRP问题_路径规划_03

拥挤度的算法如下:

【VRP问题】基于NSGA算法求解多中心VRP问题_matlab_04

3.3拥挤度比较算子

【VRP问题】基于NSGA算法求解多中心VRP问题_路径规划_05

3.3 两种算法对比及II代的改进:

非支配排序遗传算法(NSGA)在许多问题上得到了应用,但NSGA仍存在一些问题:
)a计算复杂度较高,为O(mN3)(m为目标函数个数,N为种群大小),所以当种群较大时,计算相当耗时。
b)没有精英策略;精英策略可以加速算法的执行速度,而且也能在一定程度上确保己经找到的满意解不被丢失。
)c需要指定共享半径。

而NSGA一II针对以上的缺陷通过以下三个方面进行了改进:

)a提出了快速非支配排序法,降低了算法的计算复杂度。由原来的O(mN3)降到O(mN2),其中,m为目标函数个数,N为种群大小。
b)提出了拥挤度和拥挤度比较算子,代替了需要指定共享半径的适应度共享策略,并在快速排序后的同级比较中作为胜出标准,使准Paroet域中的个体能扩展到整个Pareto域,并均匀分布,保持了种群的多样性。
)c引入精英策略,扩大采样空间。将父代种群与其产生的子代种群组合,共同竞争产生下一代种群,有利于保持父代中的优良个体进入下一代,并通过对种群中所有个体的分层存放,使得最佳个体不会丢失,迅速提高种群水平。

参考文献:

1、带精英策略的非支配排序遗传算法的研究与应用_郑强

clc;clear all;close all;
rand('seed',1e5);

%读取数据
data_all=xlsread('data.xlsx');
data_ori=xlsread('data_ori.xlsx');

%参数设置
global omg1;%权重1 时间成本
global omg2;%权重2 运费成本
global po;%位置
global need;%需求
global c;%运费
global gd_c;%固定运费
global w;%车的载重 向量形式
global car_num;%车的数目
global ORI;%0点的坐标
%global color;%路线颜色
global w_home;%车辆的所属仓库
%global kehu_num;%受灾点个数
global Cij;%道路通行能力
global yij;%实际道路的车流量
global ck_num;%仓库数目
global r;
global m;
global v;
global dis_max;%最大距离
global yunfeixishu;


omg1=0.7;
omg2=0.3;
po=data_all(:,1:2);
need=data_all(:,3);
c=15;
gd_c=200;
w=[30,30,30];
w_home=[1,2,3];
%color=['k','k','m','m','g','g','b','b','r','r'];
car_num=length(w);
ORI=data_ori;
[kehu_num,~]=size(data_all);
Cij=1000;
ck_num=size(ORI,1);
yij=unidrnd(600,[kehu_num+ck_num,kehu_num+ck_num]);
r=0.15;
m=4;
v=50;
dis_max=100;
yunfeixishu=1e-3;


tic;

f_num=1;

x_num=kehu_num;%决策变量的个数
x_min=zeros(1,x_num);%决策变量的最小值数组初始化
x_max=zeros(1,x_num);%决策变量的最大值数组的初始化

x_min(:)=1+0.001; 
x_max(:)=car_num+0.999;

pop=5e3;%种群大小
gen=50;%进化代数
pc=0.90;%交叉概率
pm=0.9;%变异概率
yita1=20;%模拟二进制交叉参数
yita2=20;%多项式变异参数

pf1=zeros(1,gen);

px=1:1:gen;

%初始化种群
chromo=initialize(pop,f_num,x_num,x_min,x_max);

for ii=1:gen
   %二进制竞赛选择(k取了pop/2,所以选两次)
   chromo_parent_1 = tournament_selection(chromo,x_num);
   chromo_parent_2 = tournament_selection(chromo,x_num);
   chromo_parent=[chromo_parent_1;chromo_parent_2];
   %模拟二进制交叉与多项式变异
   chromo_offspring=cross_mutation(chromo_parent,f_num,x_num,x_min,x_max,pc,pm,yita1,yita2);
   %精英保留策略
   %将父代和子代合并
   [pop_parent,~]=size(chromo);
   [pop_offspring,~]=size(chromo_offspring);
   combine_chromo(1:pop_parent,1:(f_num+x_num))=chromo(:,1:(f_num+x_num));
   combine_chromo((pop_parent+1):(pop_parent+pop_offspring),1:(f_num+x_num))=chromo_offspring(:,1:(f_num+x_num));
   %精英保留产生下一代种群
   chromo=elitism(pop,combine_chromo,f_num,x_num);
   
   if mod(ii,1) == 0
       fprintf('%d代已完成.\n',ii);
   end
   
   pf1(ii)=mean(chromo(:,x_num+1));
   
end

toc;
time=toc;

figure(1);
plot(px,pf1);
xlabel('迭代次数');
ylabel('种群内目标函数的平均值');
grid on;

uncode(chromo(1,:),f_num,x_num);
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.
  • 49.
  • 50.
  • 51.
  • 52.
  • 53.
  • 54.
  • 55.
  • 56.
  • 57.
  • 58.
  • 59.
  • 60.
  • 61.
  • 62.
  • 63.
  • 64.
  • 65.
  • 66.
  • 67.
  • 68.
  • 69.
  • 70.
  • 71.
  • 72.
  • 73.
  • 74.
  • 75.
  • 76.
  • 77.
  • 78.
  • 79.
  • 80.
  • 81.
  • 82.
  • 83.
  • 84.
  • 85.
  • 86.
  • 87.
  • 88.
  • 89.
  • 90.
  • 91.
  • 92.
  • 93.
  • 94.
  • 95.
  • 96.
  • 97.
  • 98.
  • 99.
  • 100.
  • 101.
  • 102.
  • 103.
  • 104.
  • 105.
  • 106.
  • 107.
  • 108.
  • 109.
  • 110.
  • 111.

【VRP问题】基于NSGA算法求解多中心VRP问题_matlab_06

【VRP问题】基于NSGA算法求解多中心VRP问题_路径规划_07