Main Content

本页翻译不是最新的。点击此处可查看最新英文版本。

基于问题的优化工作流

注意

Optimization Toolbox™ 提供两种求解单目标优化问题的方法。本主题描述基于问题的方法。基于求解器的优化问题设置描述基于求解器的方法。

要求解优化问题,请执行以下步骤。

  • 使用 optimproblem 创建一个优化问题对象。问题对象是一个容器,您可以在其中定义目标表达式和约束。优化问题对象将定义问题和问题变量中存在的任何边界。

    例如,创建一个最大化问题。

    prob = optimproblem('ObjectiveSense','maximize');
  • 使用 optimvar 创建命名变量。优化变量是符号变量,用于描述问题目标和约束。在变量定义中包含任何边界。

    例如,创建一个名为 'x' 的 15×3 二元变量数组。

    x = optimvar('x',15,3,'Type','integer','LowerBound',0,'UpperBound',1);
  • 将问题对象中的目标函数定义为命名变量中的表达式。

    注意

    如果您的非线性函数不是由多项式、有理式和初等函数(如 exp)组成的,可以使用 fcn2optimexpr 将其转换为优化表达式。请参阅Convert Nonlinear Function to Optimization ExpressionSupported Operations for Optimization Variables and Expressions

    如有必要,在表达式中包含额外参数作为工作区变量;请参阅Pass Extra Parameters in Problem-Based Approach

    例如,假设您有一个与变量 x 的矩阵大小相同的实矩阵 f,目标是 f 中条目乘以对应变量 x 的总和。

    prob.Objective = sum(sum(f.*x));
  • 将优化问题的约束定义为命名变量的比较或定义为表达式的比较。

    注意

    如果您的非线性函数不是由多项式、有理式和初等函数(如 exp)组成的,可以使用 fcn2optimexpr 将其转换为优化表达式。请参阅Convert Nonlinear Function to Optimization ExpressionSupported Operations for Optimization Variables and Expressions

    例如,假设 x 的每行中的变量之和必须为 1,每列中的变量之和不能超过 1。

    onesum = sum(x,2) == 1;
    vertsum = sum(x,1) <= 1;
    prob.Constraints.onesum = onesum;
    prob.Constraints.vertsum = vertsum;
  • 对于非线性问题,将初始点设置为结构体,其字段是优化变量名称。例如:

    x0.x = randn(size(x));
    x0.y = eye(4); % Assumes y is a 4-by-4 variable
  • 使用 solve 求解问题。

    sol = solve(prob);
    % Or, for nonlinear problems,
    sol = solve(prob,x0)

除了这些基本步骤之外,您还可以在求解问题之前使用 showwrite 来回顾问题定义。使用 optimoptions 设置 solve 的选项,如 Change Default Solver or Options 中所述。

警告

基于问题的方法不支持目标函数、非线性等式或非线性不等式中使用复数值。如果某函数计算具有复数值,即使是作为中间值,最终结果也可能不正确。

注意

一个优化问题中的所有名称必须具有唯一性。具体来说,所有变量名称、目标函数名称和约束函数名称都不能相同。

有关基本的混合整数线性规划示例,请参阅混合整数线性规划基础:基于问题或视频版本使用优化建模求解混合整数线性规划问题。有关非线性示例,请参阅基于问题求解有约束非线性问题:。有关更多示例,请参阅基于问题的非线性优化线性规划和混合整数线性规划二次规划和锥规划

另请参阅

| | | | | |

相关主题