优化设计——多目标函数优化(降维/主目标法、线性加权法、理想点法)——MATLAB编程
2020.06.07修改(F2(x)函数输入输错了,只是结果偏差,程序逻辑没问题,已修正)
建议与本人前几篇博文程序互相参照,系列程序有继承性,一些程序段功能实现代码与原理在前几篇博文中都有提到!
案例如下:
优化原理
降维/主目标法
主目标法就是从多目标中依据重要程度选择一个目标作为主目标,而将其它目标转化为约束,即将多目标优化问题转化为单目标问题。
线性加权法
在具有多个指标的优化问题中,可以给予那些相对重要的指标较大的权系数,于是可将多目标优化问题转化为所有目标加权求和的单目标优化问题。
理想点法
即先求解每个单目标问题的最优解,将所有单目标问题最优解作为期望值,寻求可行域内距离期望解最近的点作为多目标优化问题的最优解。
具体原理不在这里过多赘述,不少优化设计有关资料都有关于此三种方法的详细介绍
MATLAB程序
三种方法的计算全部在同一主程序main内,附有四个子程序(复合型法优化程序minfun、minfun2与可行域判断程序judge、judge2)
其中,minfun2与judge2子程序为降维/主目标法服务,minfun与judge子程序为线性加权法与理想点法服务:
主程序main:
%% 初始参数设定,求f最小值
syms x1 x2 x
D1=100;D2=80;L=1000;E=2.06e11;%单位为mm
f1=pi/4*(x1*(D2^2-x2^2)+(L-x1)*(D1^2-x2^2));%目标函数输入
f2=64/(3*pi*E)*(x1^3*(1/(D2^4-x2^4)-1/(D1^4-x2^4))+L^3/(D1^4-x2^4));%目标函数输入
e2=1e-3;%复合型法收敛e2
xa=0.5;xb=40;%可行域内初始点,可通过judge函数选取
%约束条件(在 judge函数)
%% a.降维法、主目标法
% f1为主目标函数,f2转化为约束条件
% 先用复合型法求取f2的有约束最优解x20,得到ffx20
minx20=minfun(f2,xa,xb,e2);
ffx20=double(subs(f2,symvar(f2),minx20'));
%f2转化的约束条件为f2<=ff20+abs(e1*ffx20),g5=f2-ffx20-abs(e1*ffx20);
e1=0.02;
e3=ffx20+abs(e1*ffx20);
%再用复合型法直接求含g5约束条件的f1的解
minxa=minfun2(f1,xa,xb,e2,e3);
ffxa1=double(subs(f1,symvar(f1),minxa'));
ffxa2=double(subs(f2,symvar(f2),minxa'));
minxa
ffxa1
ffxa2
%% a END %%
%% b.线性加权法
fb=0.6*f1+0.4*f2;%构造新目标函数fb
%复合型法求解fb
minxb=minfun(fb,xa,xb,e2);
ffxb1=double(subs(f1,symvar(f1),minxb'));
ffxb2=double(subs(f2,symvar(f2),minxb'));
minxb
ffxb1
ffxb2
%% b END %%
%% c.理想点法求解
% 先对f1复合型法求解最优解xc1
xc1=minfun(f1,xa,xb,e2);
ffc1=double(subs(f1,symvar(f1),xc1'));
% 再对f2复合型法求解最优解xc2
xc2=minfun(f2,xa,xb,e2);
ffc2=double(subs(f2,symvar(f2),xc2'));
fc=sqrt((f1-ffc1)^2+(f2-ffc2)^2);
% 复合型法求解fc
minxc=minfun(fc,xa,xb,e2);
ffxc1=double(subs(f1,symvar(f1),minxc'));
ffxc2=double(subs(f2,symvar(f2),minxc'));
minxc
ffxc1
ffxc2
%% c END %%
复合型法minfun2:
function minx=minfun2(f,xa,xb,e2,e3)
%% 初始参数设定,求f最小值
syms x1 x2 x
% 可行域条件在judge2子函数中.m文件中
h=2; % 初始单纯形构造因子
hi=1; % 初始单纯型构造因子系数
alpha=1; % alpha 反射因子
ai=0; % 反射因子系数
gama=2; % gama 扩张因子
beta=0.5;% beta 收缩因子
eps=e2;% eps 精度值
n = 0; %迭代循环次数
m = 1000; %精度差值
k = 0; %数据记录
g = 0; %操作记录
%% 构造初始单纯形
x0=[xa xb];% 给定在可行域内初始点
x0=x0';
X(:,1)=x0;
Num_var_f=length(symvar(f));%二维函数
for i = 1:Num_var_f %二维函数,需要三个顶点坐标
x = zeros(Num_var_f,1);%预分配内存
x=x0;
x(i) = x0(i) + h/hi;
X(:,i+1)=x;% 将单纯形按列从左往右存储
end