Main Content

変数名の重複は許可されない

同じ名前の 2 つの異なる変数を使用すると、最適化式、制約、または問題でエラーがスローされることがあります。変数を作成してから、その変数を使用して式を作成し、その後、変数を作成し直した場合、このエラーは厄介です。次の変数と制約の式を作成するとします。

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 を作成し直すと、制約式とは無関係な新しい変数になる点です。

この問題は 2 通りの方法で修正できます。

  • 現在の 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]);

    この手法は、新しい変数を使用する式より、古い変数を使用する式の方が多数作成されていた場合に役立つことがあります。

関連するトピック