Переменные с запрещенными двойными названиями

Если вы используете две различных переменные, которые имеют то же имя, то выражения оптимизации, ограничения или проблемы могут выдать ошибку. Эта ошибка неприятна, когда вы создаете переменную, затем создаете выражение с помощью той переменной, затем воссоздаете переменную. Предположим, что вы создаете следующую переменную и ограничительное выражение:

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]);

    Этот метод может быть полезным, если вы создали больше выражений с помощью старой переменной, чем выражения с помощью новой переменной.

Похожие темы