优化(二)
多目标规划问题

决策变量 Xi表示购买第i个资产的额度,i可表示从1到n
目标函数 收益“最大”,风险“最小”

约束条件 资产额度

多目标优化问题的标准形式

多目标优化的算法
1、目标达成法 fgoalattain
设定一个目标解,使其满足要求
2、最大最小法 fminimax
使最大的函数最小,其余的函数也自然足够小
3、权重法
设置权重,化为单目标优化问题
当使用不同的权重时,会有不同的有效解
pareto前沿
4、基于种群的启发式算法
GA、PSO
目标达成法

fgoalattain - 求解涉及多目标的目标达到问题
fgoalattain 求解目标达到问题,这是多目标优化问题最小化的一种表示。
x = fgoalattain(fun,x0,goal,weight)
x = fgoalattain(fun,x0,goal,weight,A,b)
x = fgoalattain(fun,x0,goal,weight,A,b,Aeq,beq)
x = fgoalattain(fun,x0,goal,weight,A,b,Aeq,beq,lb,ub)
x = fgoalattain(fun,x0,goal,weight,A,b,Aeq,beq,lb,ub,nonlcon)
x = fgoalattain(fun,x0,goal,weight,A,b,Aeq,beq,lb,ub,nonlcon,options)
x = fgoalattain(problem)
[x,fval] = fgoalattain(___)
[x,fval,attainfactor,exitflag,output] = fgoalattain(___)
[x,fval,attainfactor,exitflag,output,lambda] = fgoalattain(___)

A = [-0.5,0,0;0 -2 10;0 1 -2];
B = [1 0;-2 2;0 1];
C = [1 0 0;0 0 1];
myfun = @(K)sort(eig(A+B*K*C));
K0 = [0,0;0,0];
goal = [-5;-3;-1];
weight = abs(goal);
lb = -4*ones(size(K0));
ub = 4*ones(size(K0));
options = optimoptions('fgoalattain','Display','iter','PlotFcn','optimplotx','UseParallel',true);
[x,fvals,attainfactor] = fgoalattain(myfun,K0,goal,weight,[],[],[],[],lb,ub,[],options)
Starting parallel pool (parpool) using the 'Processes' profile ...
Connected to the parallel pool (number of workers: 6).
Attainment Max Line search Directional
Iter F-count factor constraint steplength derivative Procedure
0 6 0 2.16228
1 13 1.396 0.006823 1 0.847
2 20 0.7369 0.02458 1 -0.62
3 27 -0.03774 0.7425 1 -0.228 Hessian modified
4 34 0.6944 0.001286 1 0.892 Hessian modified
5 41 0.6688 0.007303 1 -0.0208
6 48 0.6697 0.0005198 1 0.00177
。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
66 484 0.8289 0.001015 1 -0.169
67 491 0.2704 2.748 1 -0.0938 Hessian modified
68 498 -0.07561 0.4142 1 -0.091
69 505 -0.3449 0.05682 1 -0.0862
Solver stopped prematurely.
fgoalattain stopped because it exceeded the function evaluation limit,
options.MaxFunctionEvaluations = 5.000000e+02.
x =
-1.7926 1.6656
1.4129 -4.0000
fvals =
-5.3070
-4.3241
-0.6614
attainfactor =
-0.0756

fminimax
fminimax - 求解 minimax 约束问题
fminimax 寻找能够最小化一组目标函数最大值的点。
x = fminimax(fun,x0)
x = fminimax(fun,x0,A,b)
x = fminimax(fun,x0,A,b,Aeq,beq)
x = fminimax(fun,x0,A,b,Aeq,beq,lb,ub)
x = fminimax(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon)
x = fminimax(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon,options)
x = fminimax(problem)
[x,fval] = fminimax(___)
[x,fval,maxfval,exitflag,output] = fminimax(___)
[x,fval,maxfval,exitflag,output,lambda] = fminimax(___)

myfun = @(x)[2*x(1)^2+x(2)^2-48*x(1)-40*x(2)+304;-x(1)^2-3*x(2)^2;
x(1)+3*x(2)-18;-x(1)-x(2);x(1)+x(2)-8];
x0 = [0;0];
options = optimoptions('fminimax','Display','iter','PlotFcn','optimplotfval','UseParallel',true);
[x,fvals,maxfval,flag] = fminimax(myfun,x0,[],[],[],[],[],[],[],options)
Starting parallel pool (parpool) using the 'Processes' profile ...
Connected to the parallel pool (number of workers: 6).
Objective Max Line search Directional
Iter F-count value constraint steplength derivative Procedure
0 4 0 304
1 9 -1.949e-07 37.64 1 -4.01e-08
2 14 -0.04824 4.79 1 -0.0236 Hessian modified twice
3 19 0.08054 0.03317 1 0.707
4 24 0.06484 0.02827 1 -0.111
5 30 -0.006252 0.6573 0.5 -0.105
6 35 -0.01464 0.4839 1 -0.0147
7 40 -2.215e-05 0.000731 1 0.498
8 45 -7.379e-10 2.786e-08 1 0.167 Hessian modified
Local minimum possible. Constraints satisfied.
fminimax stopped because the predicted change in the objective function
is less than the value of the function tolerance and constraints
are satisfied to within the value of the constraint tolerance.
<stopping criteria details>
x =
4.0000
4.0000
fvals =
0.0000
-64.0005
-1.9999
-8.0000
-0.0000
maxfval =
2.7124e-08
flag =
5

线性最小二乘问题
lsqlin - 求解约束线性最小二乘问题
具有边界或线性约束的线性最小二乘求解器。
x = lsqlin(C,d,A,b)
x = lsqlin(C,d,A,b,Aeq,beq,lb,ub)
x = lsqlin(C,d,A,b,Aeq,beq,lb,ub,x0,options)
x = lsqlin(problem)
[x,resnorm,residual,exitflag,output,lambda] = lsqlin(___)
[wsout,resnorm,residual,exitflag,output,lambda] = lsqlin(C,d,A,b,Aeq,beq,lb,ub,ws)

lsqnonneg - 求解非负线性最小二乘问题
求解以下形式的非负最小二乘曲线拟合问题
x = lsqnonneg(C,d)
x = lsqnonneg(C,d,options)
x = lsqnonneg(problem)
[x,resnorm,residual] = lsqnonneg(___)
[x,resnorm,residual,exitflag,output] = lsqnonneg(___)
[x,resnorm,residual,exitflag,output,lambda] = lsqnonneg(___)

非线性最小二乘问题
lsqcurvefit - 用最小二乘求解非线性曲线拟合(数据拟合)问题
非线性最小二乘求解器
x = lsqcurvefit(fun,x0,xdata,ydata)
x = lsqcurvefit(fun,x0,xdata,ydata,lb,ub)
x = lsqcurvefit(fun,x0,xdata,ydata,lb,ub,options)
x = lsqcurvefit(problem)
[x,resnorm] = lsqcurvefit(___)
[x,resnorm,residual,exitflag,output] = lsqcurvefit(___)
[x,resnorm,residual,exitflag,output,lambda,jacobian] = lsqcurvefit(___)
x = [0.9 1.5 13.8 19.8 24.1 28.2 35.2 60.3 74.6 81.3];
y = [455.2 428.6 124.1 67.3 43.2 28.1 13.1 -0.4 -1.3 -1.5];
model = @(w,x)w(1)*exp(w(2)*x);
w0 = [1;-1];
options = optimoptions('lsqcurvefit','Display','iter','PlotFcn','optimplotfunccount','UseParallel',true);
w = lsqcurvefit(model,w0,x,y,[],[],options)
Norm of First-order
Iteration Func-count f(x) step optimality
0 3 413105 310
Objective function returned Inf; trying a new point...
1 6 413105 10 310
2 9 412532 0.5 644
3 12 412532 1 644
4 15 412077 0.25 924
5 18 409495 0.5 8.54e+03
6 21 409495 1 8.54e+03
7 24 409495 0.25 8.54e+03
8 27 409495 0.0625 8.54e+03
9 30 409490 0.015625 1.97e+04
10 33 409399 0.00390625 5.13e+03
11 36 409373 0.0078125 1.68e+03
12 39 409354 0.0078125 1.26e+03
13 42 409317 0.015625 1.17e+03
14 45 409244 0.03125 1.17e+03
15 48 409098 0.0625 1.17e+03
16 51 408806 0.125 1.16e+03
17 54 408228 0.25 1.72e+03
18 57 407080 0.5 2.21e+03
19 60 404831 1 5.9e+03
20 63 400436 2 9.5e+03
21 66 392000 4 2e+04
22 69 375932 8 3.03e+04
23 72 346359 16 5.79e+04
24 75 293519 32 7.83e+04
25 78 206806 64 1.17e+05
26 81 85325.3 128 1.41e+05
27 84 1076.22 235.794 7.02e+04
28 87 27.9038 4.37309 1.16e+04
29 90 9.50714 0.925607 125
30 93 9.50489 0.00973978 0.504
31 96 9.50489 9.32741e-05 0.00247
Local minimum possible.
lsqcurvefit stopped because the final change in the sum of squares relative to
its initial value is less than the value of the function tolerance.
<stopping criteria details>
w =
498.8309
-0.1013
lsqnonlin - 求解非线性最小二乘(非线性数据拟合)问题
非线性最小二乘求解器
x = lsqnonlin(fun,x0)
x = lsqnonlin(fun,x0,lb,ub)
x = lsqnonlin(fun,x0,lb,ub,options)
x = lsqnonlin(problem)
[x,resnorm] = lsqnonlin(___)
[x,resnorm,residual,exitflag,output] = lsqnonlin(___)
[x,resnorm,residual,exitflag,output,lambda,jacobian] = lsqnonlin(___)


myfun = @(x)[3*x(1)^2+2*x(1)*x(2)+2*x(2)^2+x(3)+3*x(4)-6;2*x(1)^2+x(1)+x(2)^2+10*x(3)+2*x(4)-2;
3*x(1)^2+x(1)*x(2)+2*x(2)^2+2*x(3)+9*x(4)-9;x(1)^2*3*x(2)^2+2*x(3)+3*x(4)-3];
x0 = [0;0;0;0];
options = optimoptions('lsqnonlin','Display','iter','PlotFcn','optimplotfunccount','UseParallel',true,"StepTolerance",1e-14,"FunctionTolerance",1e-14,"MaxFunctionEvaluations",4e3);
x = lsqnonlin(myfun,x0,[],[],options)
Norm of First-order
Iteration Func-count f(x) step optimality
0 5 130 112
1 10 130 10 112
2 15 130 2.5 112
3 20 22.1692 0.833678 23
4 25 10.1113 1.25 28.1
5 30 10.1113 2.5 28.1
6 35 3.73635 0.625 15.6
7 40 3.73635 1.1494 15.6
8 45 1.20046 0.287351 4.12
9 50 0.786275 0.574702 5.61
10 55 0.238445 0.39581 3.74
11 60 0.238445 0.574702 3.74
12 65 0.110943 0.143676 0.484
。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
106 535 0.0767115 1.3702e-07 2.08e-06
107 540 0.0767115 1.3702e-07 1.46e-06
108 545 0.0767115 1.3702e-07 1.66e-06
109 550 0.0767115 1.3702e-07 1.16e-06
110 555 0.0767115 1.3702e-07 1.32e-06
111 560 0.0767115 1.3702e-07 9.21e-07
Local minimum found.
Optimization completed because the size of the gradient is less than
the value of the optimality tolerance.
<stopping criteria details>
x =
0.7034
0.8992
-0.1727
0.6292
>> myfun(x)
ans =
0.0814
0.0331
0.0514
-0.2576

非线性方程(组)
fzero - 非线性函数的根
此 MATLAB 函数 尝试求出 fun(x) = 0 的点 x。此解是 fun(x) 变号的位置 - fzero 无
法求函数(例如 x^2)的根。
x = fzero(fun,x0)
x = fzero(fun,x0,options)
x = fzero(problem)
[x,fval,exitflag,output] = fzero(___)
fsolve - 对非线性方程组求解
非线性方程组求解器
x = fsolve(fun,x0)
x = fsolve(fun,x0,options)
x = fsolve(problem)
[x,fval] = fsolve(___)
[x,fval,exitflag,output] = fsolve(___)
[x,fval,exitflag,output,jacobian] = fsolve(___)
线性规划问题
linprog - 求解线性规划问题
非线性规划求解器
x = linprog(f,A,b)
x = linprog(f,A,b,Aeq,beq)
x = linprog(f,A,b,Aeq,beq,lb,ub)
x = linprog(f,A,b,Aeq,beq,lb,ub,options)
x = linprog(problem)
[x,fval] = linprog(___)
[x,fval,exitflag,output] = linprog(___)
[x,fval,exitflag,output,lambda] = linprog(___)

混合整数规划
有的决策变量可以取整数,有的决策变量可以取连续值
intlinprog - 混合整数线性规划 (MILP)
混合整数线性规划求解器。
x = intlinprog(f,intcon,A,b)
x = intlinprog(f,intcon,A,b,Aeq,beq)
x = intlinprog(f,intcon,A,b,Aeq,beq,lb,ub)
x = intlinprog(f,intcon,A,b,Aeq,beq,lb,ub,x0)
x = intlinprog(f,intcon,A,b,Aeq,beq,lb,ub,x0,options)
x = intlinprog(problem)
[x,fval,exitflag,output] = intlinprog(___)


f = [8 1];
intcon = 2;
A = [-1 -2;-4 -1;2 1];
b = [14;-33;20];
x = intlinprog(f,intcon,A,b)
LP: Optimal objective value is 59.000000.
Optimal solution found.
Intlinprog stopped at the root node because the objective value is within a gap tolerance of the optimal
value, options.AbsoluteGapTolerance = 0 (the default value). The intcon variables are
integer within tolerance, options.IntegerTolerance = 1e-05 (the default value).
x =
6.5000
7.0000
二次规划问题

quadprog - 二次规划
具有线性约束的二次目标函数的求解器。
x = quadprog(H,f)
x = quadprog(H,f,A,b)
x = quadprog(H,f,A,b,Aeq,beq)
x = quadprog(H,f,A,b,Aeq,beq,lb,ub)
x = quadprog(H,f,A,b,Aeq,beq,lb,ub,x0)
x = quadprog(H,f,A,b,Aeq,beq,lb,ub,x0,options)
x = quadprog(problem)
[x,fval] = quadprog(___)
[x,fval,exitflag,output] = quadprog(___)
[x,fval,exitflag,output,lambda] = quadprog(___)
[wsout,fval,exitflag,output,lambda] = quadprog(H,f,A,b,Aeq,beq,lb,ub,ws)

H = [1 -1; -1 2];
f = [-2; -6];
A = [1 1; -1 2; 2 1];
b = [2; 2; 3];
[x,fval,exitflag,output,lambda] = quadprog(H,f,A,b)
Minimum found that satisfies the constraints.
Optimization completed because the objective function is non-decreasing in
feasible directions, to within the value of the optimality tolerance,
and constraints are satisfied to within the value of the constraint tolerance.
<stopping criteria details>
x =
0.6667
1.3333
fval =
-8.2222
exitflag =
1
output =
包含以下字段的 struct:
message: 'Minimum found that satisfies the constraints.↵↵Optimization completed because the objective function is non-decreasing in ↵feasible directions, to within the value of the optimality tolerance,↵and constraints are satisfied to within the value of the constraint tolerance.↵↵<stopping criteria details>↵↵Optimization completed: The relative dual feasibility, 2.254493e-13,↵is less than options.OptimalityTolerance = 1.000000e-08, the complementarity measure,↵7.525735e-13, is less than options.OptimalityTolerance, and the relative maximum constraint↵violation, 5.033011e-15, is less than options.ConstraintTolerance = 1.000000e-08.'
algorithm: 'interior-point-convex'
firstorderopt: 1.3527e-12
constrviolation: 1.7764e-15
iterations: 4
linearsolver: 'dense'
cgiterations: []
lambda =
包含以下字段的 struct:
ineqlin: [3×1 double]
eqlin: [0×1 double]
lower: [2×1 double]
upper: [2×1 double]