文章目录

  • 一、概述
  • 1、引言
  • 2、多目标优化数学模型
  • 二、基本概念
  • 2.1 支配(dominate)与非劣(non- inferior)
  • 2.2 序值(rank)和前端(front)
  • 2.3 拥挤距离(crowding distance)
  • 2.4 最优前端个体系数(ParetoFraction)
  • 三、MATLAB实现
  • 3.1 问题描述
  • 3.2 gamultiobj函数介绍
  • 3.3 代码实现
  • 3.4 结果分析


一、概述

1、引言

  优化目标可以理解为目标函数,在多目标优化问题中优化目标个数在2个及以上。因此,多目标优化问题和单目标优化相比,最大的区别在于多目标优化问题是一个向量优化(目标函数向量)的问题。而向量之间仅仅存在偏序关系,难以直接比较向量之间的大小,这就导致该类优化问题的性质非常不好。现实问题中,多个优化目标之间或多或少都会存在矛盾
  如果我们想要选购一款性价比高的手机,自然就要在价格和性能这两个优化目标之间进行权衡。选取手机内存(64g、128g、256g)、尺寸(普通、pro、promax)作为该问题的决策变量,不同的决策变量值就可以构成许多个决策向量=[内存,尺寸],这些决策向量构成决策空间。显而易见的是,内存越大-价格越高-性能越好尺寸越高-性能越好-价格越贵。因此,我们无法找到一个确切的解作为该优化问题的最终解,只能获得可行域范围内的解集供用户挑选(易看出,此处的解就是一个决策向量)。

2、多目标优化数学模型

  决策变量、目标函数、约束条件是多目标优化问题的三要素。标准的多目标优化问题的数学模型描述如下:
多目标输出 机器学习 多目标函数优化算法_多目标
符号解释:

  • 多目标输出 机器学习 多目标函数优化算法_多目标_02为待优化的目标函数
  • 多目标输出 机器学习 多目标函数优化算法_优化问题_03为待优化的变量
  • 多目标输出 机器学习 多目标函数优化算法_多目标输出 机器学习_04为变量多目标输出 机器学习 多目标函数优化算法_优化问题_03的上界和下界
  • 多目标输出 机器学习 多目标函数优化算法_多目标输出 机器学习_06为变量多目标输出 机器学习 多目标函数优化算法_优化问题_03的不等式约束
  • 多目标输出 机器学习 多目标函数优化算法_算法_08为变量多目标输出 机器学习 多目标函数优化算法_优化问题_03的等式约束

多目标输出 机器学习 多目标函数优化算法_matlab_10多目标输出 机器学习 多目标函数优化算法_多目标_11是相互矛盾的。因为因为多目标输出 机器学习 多目标函数优化算法_优化问题_12多目标输出 机器学习 多目标函数优化算法_算法_13,也就是说,某一个目标函数的提高需要以另一个目标函数的降低作为代价,称这样的解A和解B是非劣解(noninferiority solutions),或者说是Pareto最优解(Pareto optima)。多目标优化算法的目的就是要寻找这些Pareto最优解。

多目标输出 机器学习 多目标函数优化算法_多目标输出 机器学习_14

二、基本概念

2.1 支配(dominate)与非劣(non- inferior)

多目标输出 机器学习 多目标函数优化算法_优化问题_15至少有一个目标比个体多目标输出 机器学习 多目标函数优化算法_算法_16的好,而且个体多目标输出 机器学习 多目标函数优化算法_优化问题_15的所有目标都不比个体多目标输出 机器学习 多目标函数优化算法_算法_16的差,那么称个体多目标输出 机器学习 多目标函数优化算法_优化问题_15支配个体多目标输出 机器学习 多目标函数优化算法_算法_16(多目标输出 机器学习 多目标函数优化算法_优化问题_15 dominates 多目标输出 机器学习 多目标函数优化算法_算法_16),或者称个体多目标输出 机器学习 多目标函数优化算法_算法_16受个体多目标输出 机器学习 多目标函数优化算法_优化问题_15支配(多目标输出 机器学习 多目标函数优化算法_优化问题_15 is dominated by 多目标输出 机器学习 多目标函数优化算法_算法_16) ,也可以说,个体多目标输出 机器学习 多目标函数优化算法_优化问题_15非于个体多目标输出 机器学习 多目标函数优化算法_算法_16(多目标输出 机器学习 多目标函数优化算法_优化问题_15 is non- inferior to 多目标输出 机器学习 多目标函数优化算法_算法_16)。

2.2 序值(rank)和前端(front)

多目标输出 机器学习 多目标函数优化算法_优化问题_15支配多目标输出 机器学习 多目标函数优化算法_算法_16,那么多目标输出 机器学习 多目标函数优化算法_优化问题_15的序值比多目标输出 机器学习 多目标函数优化算法_算法_16的低。如果多目标输出 机器学习 多目标函数优化算法_优化问题_15多目标输出 机器学习 多目标函数优化算法_算法_16互不支配,或者说,多目标输出 机器学习 多目标函数优化算法_优化问题_15多目标输出 机器学习 多目标函数优化算法_算法_16相互非劣,那么多目标输出 机器学习 多目标函数优化算法_优化问题_15多目标输出 机器学习 多目标函数优化算法_算法_16有相同的序值。序值为1的个体属于第一前端,序值为2的个体属于第二前端,依次类推。显然,在当前种群中,第一前端是完全不受支配的,第二前端受第一前端中个体的支配。这样,通过排序,可以将种群中的个体分到不同的前端。

2.3 拥挤距离(crowding distance)

  拥挤距离用来计算某前端中的某个体与该前端中其他个体之间的距离,用以表征个体间的拥挤程度。显然,拥挤距离的值越大,个体间就越不拥挤,种群的多样性就越好。需要指出的是,只有处于同一前端的个体间才需要计算拥挤距离,不同前端之间的个体计算拥挤距离是没有意义的。

2.4 最优前端个体系数(ParetoFraction)

多目标输出 机器学习 多目标函数优化算法_多目标_41,其取值范围为0~1。需要指出的是,ParetoFraction的概念是函数gamultiobj所特有的,在NSGA-II中是没有的,这也是为什么称函数gamultiobj(MATLAB自带的基于遗传算法的多目标优化算法,是基于NSGA -II改进的一种多目标优化算法,也是本文下面求解问题所用的算法)是一种多目标优化算法的原因。

三、MATLAB实现

3.1 问题描述

  待优化的多目标问题表述如下:
多目标输出 机器学习 多目标函数优化算法_优化问题_42

3.2 gamultiobj函数介绍

  gamultiobj函数在:MATLAB安装目录\toolbox\globaloptim中。其使用方法如下:
多目标输出 机器学习 多目标函数优化算法_matlab_43
符号解释:

  • 多目标输出 机器学习 多目标函数优化算法_优化问题_03:返回找到一个局部Pareto集合多目标输出 机器学习 多目标函数优化算法_优化问题_03
  • 多目标输出 机器学习 多目标函数优化算法_matlab_46:返回多目标输出 机器学习 多目标函数优化算法_优化问题_03中所有解定义的所有适应度函数的值。多目标输出 机器学习 多目标函数优化算法_matlab_46有nf列,其中nf是目标的数量,与多目标输出 机器学习 多目标函数优化算法_优化问题_03具有相同的行数。
  • 多目标输出 机器学习 多目标函数优化算法_多目标_50:目标函数
    例如:
function f = my_first_multi(x)
 %目标函数
f(1) = x(1)^4 - 10*x(1)^2+x(1)*x(2) + x(2)^4 - (x(1)^2)*(x(2)^2);
f(2) = x(2)^4 - (x(1)^2)*(x(2)^2) + x(1)^4 + x(1)*x(2);
fitnessfcn = @my_first_multi;   % 适应度函数的函数句柄
  • 多目标输出 机器学习 多目标函数优化算法_优化问题_51:变量多目标输出 机器学习 多目标函数优化算法_优化问题_03的个数
  • 多目标输出 机器学习 多目标函数优化算法_多目标输出 机器学习_53多目标输出 机器学习 多目标函数优化算法_优化问题_03的线性不等式约束,多目标输出 机器学习 多目标函数优化算法_优化问题_55,没有就用[]
    例如:A = [1,2;3,4;5,6] and b = [10;20;30] 代表
    多目标输出 机器学习 多目标函数优化算法_多目标_56
    多目标输出 机器学习 多目标函数优化算法_算法_57
    多目标输出 机器学习 多目标函数优化算法_matlab_58
  • 多目标输出 机器学习 多目标函数优化算法_matlab_59多目标输出 机器学习 多目标函数优化算法_优化问题_03的线性等式约束,多目标输出 机器学习 多目标函数优化算法_多目标输出 机器学习_61,没有就用[]
    例如:
    Aeq = [1,2,3;2,4,1] and beq = [10;20]代表
    多目标输出 机器学习 多目标函数优化算法_多目标输出 机器学习_62
    多目标输出 机器学习 多目标函数优化算法_matlab_63
  • 多目标输出 机器学习 多目标函数优化算法_优化问题_64多目标输出 机器学习 多目标函数优化算法_优化问题_03的上下界,多目标输出 机器学习 多目标函数优化算法_优化问题_66,没有就用[]
  • 多目标输出 机器学习 多目标函数优化算法_优化问题_67多目标输出 机器学习 多目标函数优化算法_优化问题_03的非线性约束,函数多目标输出 机器学习 多目标函数优化算法_优化问题_67接受多目标输出 机器学习 多目标函数优化算法_优化问题_03并返回向量多目标输出 机器学习 多目标函数优化算法_多目标_71多目标输出 机器学习 多目标函数优化算法_多目标_72,分别表示非线性不等式和等式。使c(x)≤0和ceq(x) = 0。
    例如:
    多目标输出 机器学习 多目标函数优化算法_优化问题_73
    多目标输出 机器学习 多目标函数优化算法_优化问题_74
    多目标输出 机器学习 多目标函数优化算法_matlab_75
    代码如下:
function [c,ceq] = nonlcon(x)
c(1) = x(1)^2-x2;
c(2) = x(1)^2+2*x1*x2-5;
ceq = x(1)-x(2)^2;
end
  • 多目标输出 机器学习 多目标函数优化算法_算法_76多目标输出 机器学习 多目标函数优化算法_优化问题_03的整数约束,要求多目标输出 机器学习 多目标函数优化算法_算法_76中列出的变量取整数值。当多目标输出 机器学习 多目标函数优化算法_算法_76为非空时,对于多目标输出 机器学习 多目标函数优化算法_优化问题_67,ceq必须返回空值。
  • 多目标输出 机器学习 多目标函数优化算法_matlab_81:设置优化参数

这里只是做简单介绍,详细介绍参考MATLABA官方

3.3 代码实现

  (1)使用函数gamultiobj求解多目标优化问题的第一步是编写目标函数的M文件。对
于以上问题,函数名为my_first_multi,目标函数代码如下:

function f = my_first_multi(x)
 %目标函数
f(1) = x(1)^4 - 10*x(1)^2+x(1)*x(2) + x(2)^4 - (x(1)^2)*(x(2)^2);
f(2) = x(2)^4 - (x(1)^2)*(x(2)^2) + x(1)^4 + x(1)*x(2);

  (2)使用命令行方式调用gamultiobj函数,代码如下:

clear
clc
fitnessfcn = @my_first_multi;   % Function handle to the fitness function
nvars = 2;                      % Number of decision variables
lb = [-5,-5];                   % Lower bound
ub = [5,5];                     % Upper bound
A = []; b = [];                 % No linear inequality constraints
Aeq = []; beq = [];             % No linear equality constraints
options = gaoptimset('ParetoFraction',0.3,'PopulationSize',100,'Generations',200,'StallGenLimit',200,'TolFun',1e-100,'PlotFcns',@gaplotpareto);

[x,fval] = gamultiobj(fitnessfcn,nvars, A,b,Aeq,beq,lb,ub,options);

多目标输出 机器学习 多目标函数优化算法_matlab_82,绘制Pareto前端。

3.4 结果分析

  可以看到,在基于遗传算法的多目标优化算法的运行过程中,自动绘制了第一前端中个体的分布情况,且分布随着算法进化一代而更新一次。当选代停止后,得到如下图所示的第一前端个体分布图。同时,Worksapce中返回了函数gamultiobj得到的Pareto解集x及与x对应的目标函数值,如下表所列。需要说明的是,由于算法的初始种群是随机产生的,因此每次运行的结果不一样。

多目标输出 机器学习 多目标函数优化算法_优化问题_83

序号

多目标输出 机器学习 多目标函数优化算法_多目标输出 机器学习_84

多目标输出 机器学习 多目标函数优化算法_优化问题_85

多目标输出 机器学习 多目标函数优化算法_matlab_86

多目标输出 机器学习 多目标函数优化算法_优化问题_87

1

-0.707106331

0.707073

-5.24999

-0.25

2

0.832482315

-0.83055

-7.14362

-0.21335

3

-0.707106331

0.707073

-5.24999

-0.25

4

2.671846723

-1.97666

-38.3334

33.05425

5

1.796546904

-1.46041

-26.8172

5.458635

6

2.409171646

-1.8517

-36.9589

21.08214

7

2.368949823

-1.72953

-36.5618

19.55743

8

1.702078369

-1.53457

-24.4664

4.504309

9

0.989973221

-0.73077

-9.80161

-0.00114

10

2.220327613

-1.5795

-34.5771

14.72148

11

2.340450713

-1.83376

-36.1758

18.6013

12

1.643693127

-1.48438

-23.2559

3.76141

13

2.096188757

-1.6257

-32.6685

11.27152

14

1.078856237

-0.8303

-11.5075

0.131821

15

2.173833905

-1.67333

-33.9537

13.30179

16

2.638950538

-1.96228

-38.3096

31.33104

17

2.012820536

-1.63771

-31.0694

9.44507

18

1.609579116

-1.07152

-22.5765

3.330951

19

2.053805095

-1.35124

-31.5318

10.64938

20

1.319236996

-1.3451

-16.0248

1.37911

21

2.259777888

-1.46052

-34.6319

16.4341

22

1.889380772

-1.56903

-28.6464

7.051187

23

1.813599357

-1.40256

-27.2172

5.674235

24

1.744700635

-1.37822

-25.7525

4.687286

25

2.539551817

-1.95918

-37.8967

26.59656

26

1.961798584

-1.5357

-30.2018

8.284762

27

1.42453827

-1.09142

-18.7281

1.564972

28

2.460348783

-1.78242

-37.414

23.11921

29

2.601732392

-1.95616

-38.2195

29.47064

30

1.200014386

-1.02306

-13.9661

0.434279

  从上图可以看到,第一前端的Pareto最优解分布均匀。从上表可以看到,返回的Pareto最优解个数为30个,而种群大小为100,可见,ParetoFraction为0.3的设置发挥了作用。另外,个体被限制在了[-5,5]的上下限范围内。