多目标0-1背包问题小编已经在基于粒子群算法的多目标搜索算法讲解(附MATLAB代码)这篇推文详细介绍过,NSGA-II小编已经在NSGA-II多目标优化算法讲解(附MATLAB代码)这篇推文详细介绍过,但是如何用NSGA-II求解多目标0-1背包问题小编还没有讲过,在网上查阅到的相关论文和代码几乎为零。因此,小编今天为大家讲解用NSGA-II求解多目标0-1背包问题。
01 | 问题描述
问题描述:
假设存在五类物品,每类物品中又包含四种具体物品,现要求从这五类物品中分别选择一种物品放入背包中,使得背包内物品的总价值最大,总体积最小,并且背包的总质量不超过92Kg。其中P为每个物品的价值,R为每个物品的体积,C为每个物品质量。
PS:每一列物品代表每一类物品
02 | 算法设计
(1)编码
因为我们需要确定从这五类物品中分别拿哪一个具体的物品,比如说从第一类物品拿第一个物品(即第一行第一列),从第二类物品拿第二个物品(即第二行第二列),从第三类物品拿第三个物品(即第三行第三列),从第四类物品拿第四个物品(即第四行第四列),从第五类物品拿第四个物品(即第四行第五列)。
因此,我们就可以采用12344的编码方式表达上述装包过程,这里的数字就相当于矩阵中的第几行(第几个具体物品),第几个数字就表示第几列(第几类物品)。
(2)约束处理
当然随机生成的个体可能会出现物品总重量超过背包总重量(92kg)的情况,比如说43343这个个体所表示的装包方案中
物品总重量=14+18+25+32+6.8=95.8>92,我们的处理方式是从已经装包的物品中选择重量最大的一个物品,然后用同类物品中重量最小的物品进行替换。所以我们将重量为32的物品从包中移除,用第四类物品中重量最小的物品进行替换,即第四类第二个物品,此时物品总重量=14+18+25+26+6.8=89.8<92。
但是当遇到特殊个体时,比如43443,
物品总重量=14+18+28+32+6.8=98.8>92,我们采用上述替换方法对每个物品尝试进行替换,最终都不能满足重量限制。因此,我们采用重新随机生成个体的方法,直到所生成的个体满足重量限制为止。
(3)适应度函数
一共有两个目标,第一个目标为物品总价值之和,第二个目标为物品总体积之和。
(4)交叉操作
因为物品个数为6,产生[1,5]区间的随机整数a1和a2,然后截取这两个位置中间那段染色体进行交换,如a1=2,a2=4。(PS,交叉部分的代码要比这个解释稍微复杂一些,不过没有什么影响)
1 | 2 3 4 | 4
4 | 1 2 3 | 1
交叉为
1 | 1 2 3 | 4
4 | 2 3 4 | 1
(5)变异操作
变异操作就是随机选择染色体上两个位置点进行交换
1 1 2 3 4
变异为
1 3 2 1 4
(6)Pareto最优解和Pareto最优前沿
Pareto最优解:对于多目标优化问题,通常存在一个解集,这些解之间就全体目标函数而言是无法比较优劣的,其特点是:无法在改进任何目标函数的同时不削弱至少一个其他目标函数。这种解称作非支配解或Pareto最优解。
Pareto最优前沿:对于组成Pareto最优解集的所有Pareto最优解,其对应目标空间中的目标矢量所构成的曲面称作Pareto最优前沿。
(7)快速非支配排序算子的设计
多目标优化问题的设计关键在于求取Pareto最优解集。NSGA-II算法中的快速非支配排序是根据个体的非劣解水平对种群分层,其作用是指引搜索向Pareto最优解集方向进行。它是一个循环的适应值分级过程:首先找出群体中非支配解集,记为第一非支配层F,将其所有个体赋予非支配序值irank=1(其中irank是个体i的非支配排序值),并从整个种群中除去;然后继续找出余下群体中非支配解集,记为第二非支配排序层F2,个体被赋予非支配序值irank=2;照此进行下去,直到整个种群被分层,同一分层内的个体具有相同的非支配序值irank。
(8)个体拥挤距离算子设计
为了能够在具有相同irank的个体内进行选择性排序,NSGA-II提出了个体拥挤距离的概念。个体i的拥挤距离是目标空间上与i相邻的2个个体i+1和i-1之间的距离,其计算步骤为:
a)对同层的个体初始化距离。令L[i]d=0(其中L[i]d表示任意个体i的拥挤距离);
b)对同层的个体按第m个目标函数值升序排列;
c)使得排序边缘上的个体具有选择优势。给定一个大数M,令L[1]d=L[end]d=M;
d)对排序中间的个体,求拥挤距离:
(其中:L[i+1]m为第i+1个个体的第m目标函数值,和
分别为集合中第m目标函数值的最大值和最小值)
e)对不同的目标函数,重复步骤a)~步骤d)操作,得到个体i的拥挤距离L[i]d,通过优先选择拥挤距离较大的个体,可使计算结果在目标空间比较均匀分布,以维持种群的多样性。
(9)精英策略选择算子
精英策略即保留父代中的优良个体直接进入子代,以防止获得的Pareto最优解丢失。精英策略选择算子按3个指标对由父代Ci和子代Di合成的种群Ri进行优选,以组成新的父代种群Ci+1。首先淘汰父代中方案校验标志为不可行的方案;其次按照非支配序值irank从低到高排序,将整层种群依次放入Ci+1,直到放入某一层Fj时出现Ci+1大小超过种群规模限制N的情况;最后,依据Fj中的个体拥挤距离由大到小的顺序继续填充Ci+1直到种群数量达到N时终止。
03 | 实例验证
(1)分层
这里举个例子,比如说有如下种群,种群数目为10,
1 1 1 2 1
1 1 2 2 1
1 1 4 2 1
1 2 1 1 1
1 2 2 1 1
1 2 1 1 1
1 3 1 1 1
1 1 1 3 1
2 3 1 1 1
1 4 1 1 1
按照(3)进行计算,上述种群中每个个体的物品总价值(第1列)、总体积(第2列)和总重量(第3列)如下
28 1.45 77
27 1.43 75
29 1.50 81
35 1.65 85
34 1.63 83
35 1.65 85
36 1.67 88
30 1.50 79
37 1.72 90
34 1.62 84
按照(7)的方法对上述种群进行分层,分层结果为[1,1,2,1,2,1,1,1,1,1],1表示第一层,2表示第二层。
(2)计算拥挤度距离
分层后,如果我们只想要5个个体,那么我们需要从处于第一层的8个个体中选出5个,这时我们需要计算这8个个体的拥挤度距离,然后按照拥挤度距离降序排列,最后选择前5个个体。这8个处于第一层个体的物品总价值(第1列)和总体积(第2列)为
28 1.45
27 1.43
35 1.65
35 1.65
36 1.67
30 1.50
37 1.72
34 1.62
此时按照(8)的方法计算拥挤度距离。
首先将第一列升序排列,排列结果为[27,28,30,34,35,35,36,37]。其次使得排序边缘上的个体具有选择优势,给定一个大数M,令L[2]1=L[7]1=M。再次对排序中间的个体,求拥挤距离,结果为
[0.3,Inf,0.1,0.1,0.2,0.6,Inf,0.5](Inf为无穷大)。
然后将第二列升序排列,排列结果为[1.43,1.45,1.50,1.62,1.65,1.65,1.67,1.72]。进而给定一个大数M,令L[2]2=L[7]2=M。再次对排序中间的个体,求拥挤距离。在上述结果基础上,进行累加,结果为[0.54,Inf,0.20,0.17,0.44,1.19,Inf,1.02](Inf为无穷大)。
最后将拥挤度距离进行降序排列,结果为(第一行为降序排列的拥挤度距离,第二行为对应个体的编号)
[Inf,Inf,1.19,1.02,0.54,0.44,0.20,0.17;
7, 2, 6, 8, 1, 5, 3, 4]
因此选择第7、2、6、8和1个个体。
04 | 参考
1.https://www.zhihu.com/question/26990498/answer/35644566
05 | matlab源代码