优化问题描述
优化
优化算法是指在满足一定条件下,在众多方案中或者参数中最优方案,或者参数值,以使得某个或者多个功能指标达到最优,或使得系统的某些性能指标达到最大值或者最小值
线性规划
线性规划是指目标函数和约束都是线性的情况
[x,fval]=linprog(f,A,b,Aeq,Beq,LB,UB)
x:求得最优情况下变量的解
fval:求得最优目标值
f:目标函数的系数(符号按最小值标准,若目标是求解机大值可以通过添加负号改成求极小值)
A:不等式约束的变量系数(符合按小于标准,如果是大于约束可通过加负号变成小于)
b:不等式约束的常量
Aeq:等式约束的变量系数Beq:等式约束的常量LB:变量的下限UB:变量的上限
%% 线性规划
clc;clear;close all;
%目标函数/max 要改成min 的形式,max最大值可以系数加个负号的变成求min
f=[-1;-2;3];
%不等约束 /化成标准形式 x1+x2<=
% -x1-x2+0*x3<=-3
%0*x1-x2-x3<=-3
A=[-1,-1,0;0,-1,-1];%左边特征矩阵
b=[-3;-3]; %右边
%等式约束
Aeq=[1,0,1];
Beq=[4];
%变量约束,上限,下限
LB=zeros(3,1);
UB=2*ones(3,1);
%优化
[x,fval]=linprog(f,A,b,Aeq,Beq,LB,UB);
%
objstr=['目标函数最优值:',num2str(fval)];
disp(objstr)
for i=1:length(x)
xstr=['x',num2str(i),'的值为:',num2str(x(i))];
disp(xstr)
end
非线性规划
非线性规划是指目标函数和约束有非线性的情况
%% 非线性规划1
clc;clear;close all;
%初始解,随意给个初始解
x0=zeros(3,1);
%不等约束
A=[2,1,3];%左边特征矩阵
b=[6]; %右边
%描述线性
%等式约束
Aeq=[];
Beq=[];
%变量约束,上限,下限
LB=zeros(3,1);
UB=1*ones(3,1);
%
%优化求解 max 加负号
fun = @(x)-x(1)^2+x(2)^2-x(2)*x(3);
%
nonlcon = @unitdisk;
[x,fval]=fmincon(fun,x0,A,b,Aeq,Beq,LB,UB,nonlcon);
objstr=['目标函数最优值:',num2str(-fval)];%num2str 数字变成字符
disp(objstr)
for i=1:length(x)
xstr=['x',num2str(i),'的值为:',num2str(x(i))];
disp(xstr)
end
function [c,ceq] = unitdisk(x)
%c为不等式非线性约束
%ceq为等式非线性约束
c=x(1)^2+x(1)*x(2)+x(2)*x(3)-x(2)-6;
%多个非线性约束的话,可以用[约束1;约束2];
ceq = [];
end
%%
%遇到较为复杂的目标函数
%可以写为函数的形式
fun = @obj;
function y = obj(x)
y1 = x(1)^2+x(2)^2;
y = sqrt(y1)+x(3)^3;
end
%%
多目标优化
多目标求解的第一种方法:
%% 非线性规划1
clc;clear;close all;
%%
%初始解,随意给个初始解
x0=zeros(3,1);
%不等约束
A=[2,1,3];%左边特征矩阵
b=[6]; %右边
%等式约束
Aeq=[];
Beq=[];
%变量约束,上限,下限
LB=zeros(3,1);
UB=1*ones(3,1);
%优化求解
%%
w1=0.5;w2=0.5;
fun = @(x)(-x(1)^2+x(2)^2-x(2)*x(3))*w1+(2*x(1)^2-x(2)^3+2*x(2)*x(3))*w2;
nonlcon = @unitdisk;
[x1,fval1]=fmincon(fun,x0,A,b,Aeq,Beq,LB,UB,nonlcon);
objstr=['目标函数最优值:',num2str(fval1)];
disp(objstr)
for i=1:length(x1)
xstr=['x',num2str(i),'的值为:',num2str(x1(i))];
disp(xstr)
end
function [c,ceq] = unitdisk(x)
%c为不等式非线性约束
%ceq为等式非线性约束
c=x(1)^2+x(1)*x(2)+x(2)*x(3)-x(2)-6;
ceq = [];
end
多目标求解的第二种方法
%% 非线性规划1
clc;clear;close all;
%%
%初始解,随意给个初始解
x0=zeros(3,1);
%不等约束
A=[2,1,3];%左边特征矩阵
b=[6]; %右边
%等式约束
Aeq=[];
Beq=[];
%变量约束,上限,下限
LB=zeros(3,1);
UB=1*ones(3,1);
%优化求解
%%
fun1 = @(x)-x(1)^2+x(2)^2-x(2)*x(3);
fun2 = @(x)2*x(1)^2-x(2)^3+2*x(2)*x(3);
%%
nonlcon = @unitdisk;
[x1,fval1]=fmincon(fun1,x0,A,b,Aeq,Beq,LB,UB,nonlcon);
objstr=['目标函数最优值:',num2str(fval1)];
disp(objstr)
for i=1:length(x1)
xstr=['x',num2str(i),'的值为:',num2str(x1(i))];
disp(xstr)
end
[x2,fval2]=fmincon(fun2,x0,A,b,Aeq,Beq,LB,UB,nonlcon);
objstr=['目标函数最优值:',num2str(fval2)];
disp(objstr)
for i=1:length(x2)
xstr=['x',num2str(i),'的值为:',num2str(x2(i))];
disp(xstr)
end
%% 多目标规划
goal=[fval1,fval2];
func = @(x)[-x(1)^2+x(2)^2-x(2)*x(3);2*x(1)^2-x(2)^3+2*x(2)*x(3)];
weight=[1,1];
[x,fival]=fgoalattain(func,x0,goal,weight,A,b,Aeq,Beq,LB,UB,nonlcon);
disp('在两个目标的优化结果为')
disp(func(x))
for i=1:length(x)
xstr=['x',num2str(i),'的值为:',num2str(x(i))];
disp(xstr)
end
%%
function [c,ceq] = unitdisk(x)
%c为不等式非线性约束
%ceq为等式非线性约束
c=x(1)^2+x(1)*x(2)+x(2)*x(3)-x(2)-6;
ceq = [];
end
%% 非线性规划1
clc;clear;close all;
%%
%初始解,随意给个初始解
x0=zeros(10,1);
%不等约束
A=[];%左边特征矩阵
b=[]; %右边
%等式约束
Aeq=[];
Beq=[];
%变量约束,上限,下限
LB=-1*ones(10,1);LB(1)=0;
UB=1*ones(10,1);
%优化求解
%%
fun1 = @obj1;
fun2 = @obj2;
%%
nonlcon = [];
[x1,fval1]=fmincon(fun1,x0,A,b,Aeq,Beq,LB,UB,nonlcon);
objstr=['目标函数最优值:',num2str(fval1)];
disp(objstr)
for i=1:length(x1)
xstr=['x',num2str(i),'的值为:',num2str(x1(i))];
disp(xstr)
end
[x2,fval2]=fmincon(fun2,x0,A,b,Aeq,Beq,LB,UB,nonlcon);
objstr=['目标函数最优值:',num2str(fval2)];
disp(objstr)
for i=1:length(x2)
xstr=['x',num2str(i),'的值为:',num2str(x2(i))];
disp(xstr)
end
%% 多目标规划
goal=[fval1,fval2];
func = @obj3;
weight=[1,1];
[x,fival]=fgoalattain(func,x0,goal,weight,A,b,Aeq,Beq,LB,UB,nonlcon);
disp('在两个目标的优化结果为')
disp(func(x))
for i=1:length(x)
xstr=['x',num2str(i),'的值为:',num2str(x(i))];
disp(xstr)
end
%%
function y1=obj1(x)
[dim, num] = size(x);
tmp = zeros(dim,num);
tmp(2:dim,:)= (x(2:dim,:) - sin(6.0*pi*repmat(x(1,:),[dim-1,1]) + pi/dim*repmat((2:dim)',[1,num]))).^2;
tmp1 = sum(tmp(3:2:dim,:)); % odd index
tmp2 = sum(tmp(2:2:dim,:)); % even index
y1 = x(1,:) + 2.0*tmp1/size(3:2:dim,2);
% y(2,:) = 1.0 - sqrt(x(1,:)) + 2.0*tmp2/size(2:2:dim,2);
end
function y2=obj2(x)
[dim, num] = size(x);
tmp = zeros(dim,num);
tmp(2:dim,:)= (x(2:dim,:) - sin(6.0*pi*repmat(x(1,:),[dim-1,1]) + pi/dim*repmat((2:dim)',[1,num]))).^2;
tmp1 = sum(tmp(3:2:dim,:)); % odd index
tmp2 = sum(tmp(2:2:dim,:)); % even index
% y2 = x(1,:) + 2.0*tmp1/size(3:2:dim,2);
y2 = 1.0 - sqrt(x(1,:)) + 2.0*tmp2/size(2:2:dim,2);
end
function y=obj3(x)
[dim, num] = size(x);
tmp = zeros(dim,num);
tmp(2:dim,:)= (x(2:dim,:) - sin(6.0*pi*repmat(x(1,:),[dim-1,1]) + pi/dim*repmat((2:dim)',[1,num]))).^2;
tmp1 = sum(tmp(3:2:dim,:)); % odd index
tmp2 = sum(tmp(2:2:dim,:)); % even index
y(1,:) = x(1,:) + 2.0*tmp1/size(3:2:dim,2);
y(2,:) = 1.0 - sqrt(x(1,:)) + 2.0*tmp2/size(2:2:dim,2);
end
% function [c,ceq] = unitdisk(x)
% %c为不等式非线性约束
% %ceq为等式非线性约束
% c=x(1)^2+x(1)*x(2)+x(2)*x(3)-x(2)-6;
% ceq = [];
% end