Main Content

变量名称不允许重复

如果您使用两个同名的不同变量,则优化表达式、约束或问题可能会引发错误。当您创建一个变量,然后使用该变量创建一个表达式,再重新创建该变量时,该错误的处理会相当麻烦。假设您创建以下变量和约束表达式:

x = optimvar('x',10,2);
cons = sum(x,2) == 1;

此时,您意识到您打算创建整数变量。因此您重新创建该变量,更改其类型。

x = optimvar('x',10,2,'Type','integer');

创建一个目标和问题。

obj = sum(x*[2;3]);
prob = optimproblem('Objective',obj);

现在您尝试在该问题中加入约束条件。

prob.Constraints = cons

此时,您会收到一条错误消息,指出出现在同一问题中的 OptimizationVariables 必须具有不同 "Name" 属性。问题是,当您重新创建 x 变量时,它是新变量,与约束表达式无关。

您可以通过两种方式更正此问题。

  • 使用当前 x 创建新约束表达式。

    cons = sum(x,2) == 1;
    prob.Constraints = cons;
  • 通过使用旧表达式创建问题来检索原始的 x 变量。更新检索到的变量,使其具有正确的 Type 属性。将检索到的变量用于问题和目标。

    oprob = optimproblem('Constraints',cons);
    x = oprob.Variables.x;
    x.Type = 'integer';
    oprob.Objective = sum(x*[2;3]);

    如果使用旧变量创建的表达式数目多于使用新变量创建的表达式数目,此方法会很有用。

相关主题