多目标优化之帕累托最优

转载:https://zhuanlan.zhihu.com/p/54691447

发现一个奇怪的现象,平时看东西看得挺多的,但是过了不久就又忘记了,而且也说不出个所以然来,可能就是没有好好的消化,总结吧。因此想到了把平时学的一些东西,用知乎记下来,一来作为自己的一个总结,方便后续的复习,二来假如有人能够看到的话对其有帮助也不错,能够提一些意见就再好不过了。

注:一些东西公式之类的,很多都是参考别人的论文,书籍等,自己也没有敲,这里只是自己的一个笔记本,侵删

步入正题:听了好几次师兄讲解帕累托最优,多目标优化的内容,奈何组会时间太短,短时间根本无法理解(智商原因),所以昨晚突发奇想查了一些资料,发现配合例子讲解很容易明白

多目标优化问题生活中很常见,比如汽车车身零部件设计中,要求设计的零件刚度要很大,同时质量很轻,这就是一个两目标问题,同时他还有一些条件约束,比如模态约束,尺寸约束等。再者金融领域中,我们希望投入的资金少,风险小,并且获得的利益最大,这就是一个三目标问题,但是掰着脚趾头都知道同时达到这三个目标是不可能的,多目标优化就是给出他的一些列可能的选择,然后用户自己去评判想选谁,哈哈,是不是很鸡肋。

多目标优化问题的数学模型一般可以写成如下形式

f_{1}(x),f_{2}(x),.......f_{n}(x)表示n个目标函数,目标是都使之达到最小, X\subseteq R^{m} 是其变量的约束集合,可以理解为变量的取值范围,下麦介绍具体的解之间的支配,占优关系,不用公式,通俗易懂。

1:解A优于解B(解A强帕累托支配解B)

假设现在有两个目标函数,解A对应的目标函数值都比解B对应的目标函数值好,则称解A比解B优越,也可以叫做解A强帕累托支配解B,举个例子,就很容易懂了

下图中代表的是两个目标的的解的情况,横纵坐标表示两个目标函数值,E点表示的解所对应的两个目标函数值都小于C,D两个点表示的解所对应的两个目标函数值,所以解E优于解C,D.

2:解A无差别于解B(解A能帕累托支配解B)

同样假设两个目标函数,解A对应的一个目标函数值优于解B对应的一个目标函数值,但是解A对应的另一个目标函数值要差于解B对应的一个目标函数值,则称解A无差别于解B,也叫作解A能帕累托支配解B,举个例子,还是上面的图,点C和点D就是这种情况,C点在第一个目标函数的值比D小,在第二个函数的值比D大。

3:最优解

假设在设计空间中,解A对应的目标函数值优越其他任何解,则称解A为最优解,举个例子,下图的 x_{1} 就是两个目标函数的最优解,使两个目标函数同时达到最小,但是前面也说过,实际生活中这种解是不可能存在的。真要存在就好了,由此提出了帕累托最优解

 

4:帕累托最优解

同样假设两个目标函数,对于解A而言,在 变量空间 中找不到其他的解能够优于解A(注意这里的优于一定要两个目标函数值都优于A对应的函数值),那么解A就是帕累托最优解,举个例子,下图中应该找不到比 x_{1} 对应的目标函数都小的解了吧,即找不到一个解优于 x_{1} 了,同理也找不到比 x_{2} 更优的解了,所以这两个解都是帕累托最优解,实际上, x_{1},x_{2} 这个范围的解都是帕累托最优解,不信自己慢慢想。因此对于多目标优化问题而言,帕累托最优解只是问题的一个可接受解,一般都存在多个帕累托最优解,这个时候就需要人们自己决策了。

 

5:帕累托最优前沿

还是看 刚才 那张图 ,如下图所示,更好的理解一下帕累托最优解,实心点表示的解都是帕累托最优解,所有的帕累托最优解构成帕累托最优解集,这些解经目标函数映射构成了该问题的Pareto最优前沿或Pareto前沿面,说人话,即帕累托最优解对应的目标函数值就是帕累托最优前沿。

 

对于两个目标的问题,其Pareto最优前沿通常是条线。而对于多个目标,其Pareto最优前沿通常是一个超曲面。

在MATLAB中,可以使用多目标遗传算法来求解帕累托前沿最优解。下面是一个示例代码,展示了如何使用MATLAB实现多目标遗传算法来求解帕累托前沿最优解集: ```matlab % 定义问题 fitnessfcn = @(x) [-x(1)^2 - x(2)^2, -(x(1)-1)^2 - (x(2)-1)^2]; nvars = 2; % 变量数目 lb = [0,0]; % 变量下限 ub = [2,2]; % 变量上限 % 设置遗传算法参数 options = optimoptions('ga','PopulationSize',100,'Generations',50); % 运行遗传算法 [x,fval,exitflag,output,population,scores] = gamultiobj(fitnessfcn,nvars,[],[],[],[],lb,ub,options); % 计算帕累托前沿解集 paretoFrontIndices = paretofront(fval); paretoFront = fval(paretoFrontIndices,:); paretoSet = x(paretoFrontIndices,:); % 输出结果 disp('帕累托前沿解集:'); disp(paretoFront); disp('相应的变量值:'); disp(paretoSet); ``` 在这个示例中,我们首先定义了一个多目标优化问题,其中目标函数为`[-x(1)^2 - x(2)^2, -(x(1)-1)^2 - (x(2)-1)^2]`。然后,我们设置了一些遗传算法参数,并使用`gamultiobj`函数来执行多目标遗传算法。最后,我们使用`paretofront`函数计算帕累托前沿解集,并将结果输出为两个矩阵。 帕累托前沿解集是一组非支配解,它们在多个目标函数下都是最优的。在MATLAB中,我们可以通过计算目标函数值的拥挤度来选择帕累托前沿上的最优解。拥挤度表示解在目标函数空间中的密度,较高的拥挤度表示解更优。具体的拥挤度计算方法可以参考引用[3]中的描述。 希望这个示例代码可以帮助你求解帕累托前沿最优解集。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值