0
点赞
收藏
分享

微信扫一扫

多目标优化 | 基于NSGA-II的多目标0-1背包问题求解(附matlab代码)

多目标优化 | 基于NSGA-II的多目标0-1背包问题求解(附matlab代码)_多目标


多目标0-1背包问题小编已经在​​基于粒子群算法的多目标搜索算法讲解(附MATLAB代码)​​这篇推文详细介绍过,NSGA-II小编已经在​​NSGA-II多目标优化算法讲解(附MATLAB代码)​​这篇推文详细介绍过,但是如何用NSGA-II求解多目标0-1背包问题小编还没有讲过,在网上查阅到的相关论文和代码几乎为零。因此,小编今天为大家讲解用NSGA-II求解多目标0-1背包问题。

01 | 问题描述



问题描述:

假设存在五类物品,每类物品中又包含四种具体物品,现要求从这五类物品中分别选择一种物品放入背包中,使得背包内物品的总价值最大总体积最小,并且背包的总质量不超过92Kg。其中P为每个物品的价值,R为每个物品的体积,C为每个物品质量。



多目标优化 | 基于NSGA-II的多目标0-1背包问题求解(附matlab代码)_最优解_02多目标优化 | 基于NSGA-II的多目标0-1背包问题求解(附matlab代码)_多目标_03多目标优化 | 基于NSGA-II的多目标0-1背包问题求解(附matlab代码)_多目标_04

 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)适应度函数

一共有两个目标,第一个目标为物品总价值之和,第二个目标为物品总体积之和

多目标优化 | 基于NSGA-II的多目标0-1背包问题求解(附matlab代码)_最优解_05

(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)对排序中间的个体,求拥挤距离:



多目标优化 | 基于NSGA-II的多目标0-1背包问题求解(附matlab代码)_最优解_06

(其中:L[i+1]m为第i+1个个体的第m目标函数值,多目标优化 | 基于NSGA-II的多目标0-1背包问题求解(附matlab代码)_最优解_07多目标优化 | 基于NSGA-II的多目标0-1背包问题求解(附matlab代码)_最优解_08分别为集合中第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。再次对排序中间的个体,求拥挤距离多目标优化 | 基于NSGA-II的多目标0-1背包问题求解(附matlab代码)_背包问题_09结果为

[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源代码


举报

相关推荐

0 条评论