基于NSGA-II算法的多目标多旅行商问题建模求解
1 引言
NSGA-II算法学习过程中涉及到了较多内容,除了遗传算法中,核心步骤选择、交叉、变异外,又融入了快速非支配排序、拥挤度计算等内容。
在GA中,选择通常采用轮盘赌选择策略,为了加快收敛保留全局最优解,在采用轮盘赌的同时,通常引入精英保留(精英策略)提升算法性能。对于交叉和变异,通常在原染色体上进行,生成子代染色后,直接替换掉原染色体。
在NSGA-II中,每次迭代过程中,为了保证多样性,探索解空间,选择(采用的锦标赛选择)、交叉和变异产生子代种群后不会进行替换。此时有原种群P,及选择交叉变异后得到子代种群Q,P、Q种群规模均为N,合并P和Q为2N的新种群R。精英策略则通过快速非支配排序、拥挤度计算保留种群R种的精英解,淘汰差解,得到新父代种群P’。
2 多目标多旅行商问题
对于多目标多旅行商问题:
- 若旅行商数量不固定,相关文献1有以min{f1=最小化旅行商数量,f2=各旅行商之间行驶距离平衡}为目标。求解方法为:采用聚类方法,采用聚类方法确定旅行商数量,转化为旅行商固定的情况,此时仅优化目标f2即可。由于采用了聚类方法,导致第一目标函数旅行商数量固定,无需再使用多目标算法。
- 若旅行商数量固定,有的文献2以min{f1=所有旅行商行驶距离之和最小,f2=各旅行商之间行驶距离平衡}。求解方法可采用智能优化算法,如NSGA-II,编码方式为两层编码(两部分编码)2,第一层编码为不包含分隔符的传统 TSP 问题遗传编码,第二层编码用于记录该方案中在何处分隔,1 个分隔符位表示有 2 个旅行商。详见第3章。
本文研究的场景为旅行商数量固定的情况。问题描述为:
𝑚个推销员从同一座中心城市出发,访问其中一定数量的城市并且每座城市只能被某一个推销员访问一次,最后返回到中心城市,通常这种问题模型被称之为单仓库多旅行商问题(Single-Depot Multiple Travelling Salesman Problem, SD-MTSP);
其中,等式(2-1)表示需要同时最小化两个目标函数。等式(2-2)表示所有推销员的总路程,等式(2-3)代表着推销员中最长路线与最短路线的差值(平衡度)。等式(2-5)与等式(2-6)的含义是编号为 0 的中心城市的入度和出度都必须为𝑚,即代表𝑚个推销员均从中心城市出发并且完成行程后都回到了中心城市。等式(2-7)与等式(2-8)则表示除中心城市外的其他所有城市的出度和入度均为 1,即每个城市能且只能被推销员中的一个人访问。
3 多目标遗传算法NSGA-II
3.1 编码
设一种多旅行商问题的城市个数是 10,推销员人数为 3,在编码的时候,将城市按照自然数 0,1,…,9 进行编号,其中 0 为中心城市,即所有推销员的起始和终止点。图 3.1 展示出了上述编码方式下的一种解方案,其中染色体上的第一部分为 10 个自然数的一种排列,而第二部分则将第一部分分割成了三份,分别表示三个推销员所需要拜访的城市,其排列顺序就是拜访顺序,即三个推销员的路径分别为:0->1->2->3->0,0->4->5->6->7->0,0->8->9->0。设城市的位置关系如图 3.2
左所示,则图 3.1 的个体所代表的解如图 3.2 右所示。
3.2 选择(锦标赛选择)
锦标赛方法选择策略每次从种群中取出一定数量个体(放回抽样),然后选择其中最好的一个进入子代种群。重复该操作,直到新的种群规模达到原来的种群规模。具体的操作步骤如下:
- 确定每次选择的个体数量。一般选择2个(二元锦标赛)。
- 从种群中随机选择个个体(每个个体入选概率相同) 构成组,根据每个个体的适应度值,选择其中适应度值最好的个体进入子代种群。
- 重复步骤2,得到的个体构成新一代种群。
3.3 交叉(顺序交叉)
采用顺序交叉3,本文编码为两部分编码,对第一部分进行顺序交叉,第二部分保持不变。在两个父代染色体中随机选择起始和结束位置,将父代染色体1该区域内的基因复制到子代1相同位置上,再在父代染色体2上将子代1中缺少的基因按照顺序填入。具体步骤如下:
-
随机选择一对染色体(父代)中几个基因的起止位置(两染色体被选位置相同)。
-
生成一个子代,并保证子代中被选中的基因的位置与父代相同。
-
先找出第一步选中的基因在另一个父代中的位置,再将其余基因按顺序放入上一步生成的子代中。
3.4 变异
采用2-opt作为变异方式,只对第一部分。
3.5 快速非支配排序
3.5.1 符号说明
- 支配计数 n p n_p np,即支配解p的解的数量。
- Sp:解p支配的解的集合。
- P种群,p个体索引
- F i F_i Fi第i层非支配解集
- p_{rank}个体p的帕累托层级
3.5.2 快速非支配排序45
3.5.3 快速非支配排序举例6
3.6 拥挤比较算子7
计算步骤为:
- 对同层的个体初始化距离。令 I [ i ] d = 0 I[i]_d=0 I[i]d=0,(其中 I I I是某一层的解集, I [ i ] d I[i]_d I[i]d表示个体 i i i的拥挤距离);
- 对同层的个体按第 m m m个目标函数值升序排列;
- 使得排序边缘上的个体具有选择优势,令 I [ 1 ] d = I [ l ] d = ∞ I[1]_d=I[l]_d=\infty I[1]d=I[l]d=∞,其中 l = ∣ I ∣ l=|I| l=∣I∣,为该层个体的数量;
- 对排序中间的个体,求拥挤距离: I [ i ] d = I [ i ] d + I [ i + 1 ] m + I [ i − 1 ] m f m max − f m min I[i]_d=I[i]_d+\frac{I[i+1]_m+I[i-1]_m}{f_m^{\max} -f_m^{\min}} I[i]d=I[i]d+fmmax−fmminI[i+1]m+I[i−1]m其中, I [ i + 1 ] m I[i+1]_m I[i+1]m为第 i + 1 i+1 i+1个个体的第m个目标函数值, f m max f_m^{\max} fmmax和 f m min f_m^{\min} fmmin为集合中第 m m m目标函数值的最大值和最小值;
- 对不同的目标函数,重复1~4,得到个体 i i i的拥挤距离 I [ i ] d I[i]_d I[i]d,通过优先选择拥挤距离较大的个体,可使计算结果在目标空间比较均匀分布,以维持种群的多样性。
- 通过以上步骤1-5得到每个个体
p
p
p的拥挤度
p
d
p_d
pd,此外由3.5节快速非支配排序得到非支配等级
p
r
a
n
k
p_{rank}
prank,可以定义偏序关系
p
>
n
q
p>_n q
p>nq,代表个体
p
p
p优于个体
q
q
q,即
p
r
a
n
k
<
q
r
a
n
k
∨
p
r
a
n
k
=
q
r
a
n
k
∧
p
d
>
q
d
p_{rank} < q_{rank} ∨ p_{rank} = q_{rank} ∧ p_{d} > q_{d}
prank<qrank∨prank=qrank∧pd>qd
即:如果两个解具有不同的rank,我们偏向于低rank的解;如果两个解具有相同的rank,我们偏向于拥挤度距离大的解。
从几何角度理解拥挤距离,以两个目标函数为例,下图中黑点和白点分别为两个非支配前沿,对于解 i i i,从与 i i i在同一非支配前沿中选择与解 i i i最相近的两个点 i − 1 i-1 i−1和 i + 1 i+1 i+1为顶点组成一个长方形(cuboid),拥挤距离即为长方形周长。
3.7 精英保留策略
精英保留策略,核心思想是把群体在进化过程中迄今出现的最好个体不进行遗传操作而直接复制到下一代中,理论上证明了具有精英保留的标准遗传算法是全局收敛的,具体步骤如下:
- 将父代种群P和子代种群Q合并,组成种群规模大小为2N的新种群R。
- 将R进行非支配排序,并计算每个个体的拥挤度。
- 将非支配排序得到的非支配集F1,放到新父代种群P’中。若此时此时P’种群规模<N,则继续添加非支配集F2。当种群规模超出N时,则采用拥挤度比较算子添加个体至P ′ ^\prime ′,使P ′ ^\prime ′种群规模达到N。
3.8 NSGA-II算法流程
step1:初始化种群P,设置最大迭代次数G,令当前迭代次数g=1。
step2:计算目标函数值,进行快速非支配排序。
step3:对P进行选择、交叉、变异,生成子代种群Q。
step4:合并P和Q得到R,对R进行快速非支配排序,拥挤度计算,生成P’。【精英选择策略 】
step5:对新父代种群进行选择(只采用锦标赛选择方法8 ,基于序值和拥挤度距离进行选择)、交叉、变异,生成新子代种群Q’,令P:=P’,Q:=Q’。
step6:判断G>g?,是则转step4;否则结束。
4 数值实验
采用TSP测试算例eil51.txt进行实验,设置3个旅行商,求解本文双目标多旅行商TSP问题。算法设置最大迭代次数MAXGEN=1000;交叉概率pc=0.8,变异概率pm=0.2,设置所有旅行商出发和返回城市为depot=5;Java编程求解:基于NSGA-II算法的多目标多旅行商问题建模求解(Java)
求解结果如下:
初始解:
初始解:
染色体:1099983479
基因型_第1部分:[32, 11, 44, 49, 31, 40, 46, 41, 42, 25, 48, 50, 6, 7, 45, 38, 9, 18, 39, 24, 51, 21, 36, 3, 2, 47, 34, 1, 8, 37, 43, 22, 28, 35, 15, 10, 14, 33, 12, 4, 23, 26, 30, 19, 27, 29, 20, 13, 17, 16]
基因型_第2部分:[14, 37]
表现型:[32, 11, 44, 49, 31, 40, 46, 41, 42, 25, 48, 50, 6, 7][45, 38, 9, 18, 39, 24, 51, 21, 36, 3, 2, 47, 34, 1, 8, 37, 43, 22, 28, 35, 15, 10, 14][33, 12, 4, 23, 26, 30, 19, 27, 29, 20, 13, 17, 16]
目标函数f=[1588.6787678935825, 304.1803940001146]
算法求解的第一帕累托前沿解(部分):
------------------------------------------------
染色体:1558570469
基因型_第1部分:[10, 33, 19, 41, 13, 9, 50, 20, 36, 35, 38, 34, 30, 39, 45, 2, 28, 3, 8, 24, 48, 43, 23, 7, 26, 31, 27, 29, 21, 16, 11, 32, 4, 40, 42, 15, 12, 47, 37, 44, 17, 25, 14, 6, 51, 18, 46, 22, 1, 49]
基因型_第2部分:[15, 32]
表现型:[10, 33, 19, 41, 13, 9, 50, 20, 36, 35, 38, 34, 30, 39, 45][2, 28, 3, 8, 24, 48, 43, 23, 7, 26, 31, 27, 29, 21, 16, 11, 32][4, 40, 42, 15, 12, 47, 37, 44, 17, 25, 14, 6, 51, 18, 46, 22, 1, 49]
目标函数f=[825.4040179137074, 0.06118939246550781]
------------------------------------------------
染色体:933317281
基因型_第1部分:[10, 33, 19, 13, 25, 20, 9, 34, 39, 45, 11, 50, 35, 29, 32, 38, 30, 28, 3, 8, 6, 43, 23, 26, 7, 48, 31, 36, 21, 16, 12, 2, 4, 51, 37, 47, 17, 44, 18, 41, 14, 24, 46, 27, 22, 1, 49, 15, 42, 40]
基因型_第2部分:[15, 32]
表现型:[10, 33, 19, 13, 25, 20, 9, 34, 39, 45, 11, 50, 35, 29, 32][38, 30, 28, 3, 8, 6, 43, 23, 26, 7, 48, 31, 36, 21, 16, 12, 2][4, 51, 37, 47, 17, 44, 18, 41, 14, 24, 46, 27, 22, 1, 49, 15, 42, 40]
目标函数f=[1014.6956953988774, 0.02557783630703625]
------------------------------------------------
染色体:1618840957
基因型_第1部分:[10, 33, 19, 41, 13, 9, 50, 20, 36, 35, 38, 34, 30, 39, 45, 2, 28, 3, 8, 24, 48, 43, 23, 7, 26, 31, 27, 29, 21, 16, 11, 32, 4, 40, 42, 15, 12, 47, 37, 44, 17, 25, 14, 6, 51, 18, 46, 22, 1, 49]
基因型_第2部分:[15, 32]
表现型:[10, 33, 19, 41, 13, 9, 50, 20, 36, 35, 38, 34, 30, 39, 45][2, 28, 3, 8, 24, 48, 43, 23, 7, 26, 31, 27, 29, 21, 16, 11, 32][4, 40, 42, 15, 12, 47, 37, 44, 17, 25, 14, 6, 51, 18, 46, 22, 1, 49]
目标函数f=[825.4040179137074, 0.06118939246550781]
------------------------------------------------
染色体:974293010
基因型_第1部分:[10, 33, 19, 41, 13, 9, 50, 20, 36, 35, 38, 34, 30, 39, 45, 2, 28, 3, 8, 24, 48, 43, 23, 7, 26, 31, 27, 29, 21, 16, 11, 32, 4, 40, 42, 15, 12, 47, 37, 44, 17, 25, 14, 6, 51, 18, 46, 22, 1, 49]
基因型_第2部分:[15, 32]
表现型:[10, 33, 19, 41, 13, 9, 50, 20, 36, 35, 38, 34, 30, 39, 45][2, 28, 3, 8, 24, 48, 43, 23, 7, 26, 31, 27, 29, 21, 16, 11, 32][4, 40, 42, 15, 12, 47, 37, 44, 17, 25, 14, 6, 51, 18, 46, 22, 1, 49]
目标函数f=[825.4040179137074, 0.06118939246550781]
------------------------------------------------
参考
胡士娟,鲁海燕,向蕾等.求解MMTSP的模糊聚类单亲遗传算法[J].计算机科学,2020,47(06):219-224. ↩︎
杨帅. 求解多旅行商问题的进化多目标优化和决策算法研究[D/OL]. 武汉科技大学, 2020. https://kns.cnki.net/KCMS/detail/detail.aspx?dbcode=CMFD&dbname=CMFD202101&filename=1020105561.nh&v=. ↩︎ ↩︎
韩亚星. B2B模式下果蔬产品同城配送路径优化研究[D/OL]. 大连海事大学, 2019. https://kns.cnki.net/KCMS/detail/detail.aspx?dbcode=CMFD&dbname=CMFD202001&filename=1020016871.nh&v=. ↩︎