速查表

使用 Optimization Toolbox 进行基于问题的优化

使用自然语法来定义和求解优化问题、最小二乘问题以及非线性方程组。

1.定义问题

按照基于问题的工作流,首先使用 optimproblem 创建一个优化问题,用于存放目标、约束及其所涉及的变量。在求解非线性方程组时,创建一个 eqnproblem。

示例:

assignmentProb = optimproblem
responseProb = optimproblem
initialStateProb = eqnproblem
2.定义变量

使用 optimvar 创建优化变量。设置显示名称以及可选的维度、边界和类型。使用整数或字符串进行索引。

示例:

x = optimvar("x");
y = optimvar("y");

employees = ["a","b","c"];
tasks = ["t1","t2","t3"];
assign = optimvar("assign",employees,tasks,"LowerBound",0,"UpperBound",1,"Type","integer")
3.定义要在目标、约束和方程中使用的表达式

使用支持的运算直接指定 OptimizationExpression。

示例:

response = -3*(y - x.^3 - x).^2 - (x - 4/3).^2;
totalCost = sum(sum(cost.*assign));
sumByEmployee = sum(assign,2);
sumByTask = sum(assign,1);

使用 fcn2optimexpr 将任意 MATLAB® 函数转换为优化表达式,即可在问题中使用该函数。

示例:

a = 4;
xyfcn = @(x,y,a)gamma(y)*a*x.^2;
xyexpr = fcn2optimexpr(xyfcn,x,y,a);
4.定义目标

设置优化方向。使用标量 OptimizationExpression 设置目标函数。

示例:

responseProb.ObjectiveSense = "maximize";
responseProb.Objective = response;

assignmentProb.ObjectiveSense = "minimize";
assignmentProb.Objective = totalCost;
5.定义约束和方程

将 OptimizationExpression 与关系运算符组合使用,以指定 OptimizationConstraint 或 OptimizationEquality。将其赋给问题。

示例:

responseProb.Constraints.ellipse = x.^2/2 + y.^2/4 <= 1;
responseProb.Constraints.xyconstr = xyexpr >= 1;

assignmentProb.Constraints.oneTaskPerEmployee = sumByTask <= 1;
assignmentProb.Constraints.oneEmployeePerTask = sumByEmployee == 1;

initialStateProb.Equations.eq1 = x*cos(y) + y*sin(x) == 1/2;
initialStateProb.Equations.eq2 = exp(-exp(-(x + y))) == y*(1 + x^2);
6.审核

使用 show 和 showbounds 进行显示。使用 write 和 writebounds 写入到一个文件。

使用工作区浏览器查看。

7.求解和分析

求解问题;对于非线性问题,需要提供初始点。solve 函数返回解值、目标值、求解停止的原因等信息。

示例:

x0.x = 0;
x0.y = 0;
[sol,fval,exitflag] = solve(responseProb,x0)

使用优化选项进行求解。​

示例:

o = optimoptions(assignmentProb,"MaxTime",10);
sol = solve(assignmentProb,"Options",o)

进阶操作​