因为小编最近在做一个javaweb项目开发,前几天才答辩完。而且最近电脑硬盘又坏了,重新换了硬盘之后,以前的数据都没了,在这里提醒一下大家重要的东西一定要存云盘或者U盘备份。之后又陆陆续续回了趟家,整理了最近的所学和接下来的计划。所以有20多天没有更新专栏了,接下来一两周会一直更新的~~
-----------------------------------优雅端庄的分割线---------------------------------
本次主要讲解多目标优化算法的问题,总所周知,多目标优化在各种应用场景中都十分常见,近一点的比如2016年的数学建模a题,系泊系统的设计问题,远一点的比如2000年的无线信道分配问题等,都涉及到了多目标的优化。
多目标的优化问题的一般公式可以如下:其中可以是x一个变量,也可以是多个变量
在两个目标函数中,它们之间可能是存在着一定的矛盾,也就是说,当一个目标函数的提高需要以另外一个目标函数的降低作为代价。在这个时候,我们就称,这样的两个解是非劣解,也就是长说的Pareto最优解。多目标优化算法就是要找到这些Pareto最优解。优化情况
在这里,我们用到的方法是采用MATLAB提供的一个函数:gamultiobj函数。我们通过一个例题来证明,问题如下:
运行结果:
代码如下:
main函数:
clear
clc
fitnessfcn = @fun; % 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);
fun函数:
function f = fun(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);
在MATLAB中,options 是一个结构体,需要用到gaoptimset函数来对其参数进行设置。options的参数有很多:
我们这里设置的是最优前端个体系数ParetoFraction为0.3,种群大小PopulationSize为100,最大遗传代数Generations为200,停止代数StallGenLimit为200,适应度函数偏差TolFun为1e-100,这里绘制的是第一前端个体的分布情况。然后我们就调用函数gamultiobj来运行。
函数gamultiobj是MATLAB中一个封装好了的带精英策略的快速非支配排序遗传算法。函数具体的运行方法和传统的遗传算法一样,先产生初始种群,接着判断是否达到最优化,是的话就退出,得到Pareto最优解。具体的步骤可以用一幅图展示:
运行之后我们可以通过命令行看到x 和fval的值,其中x代表我们找到的Pareto最优解,fval就是与之对应的目标函数值:
根据结果,我们可以看出,返回的最优解有30个,这是因为种群大小是100,最优前端个体系数ParetoFraction为0.3的原因。这样,我们就找到了Pareto最优解了。
参考文献:
Feng Shi. MATLAB 智能算法-30个案例分析[M]. 北京航空航天大学出版社, 2011.
胡毓达. 多目标规划有效性理论[M]. 上海科学技术出版社, 1994.
李光金, 刘永清. 基于多目标规划的DEA[J]. 系统工程理论与实践, 1997, 17(3):17-23.