Переменные с запрещенными повторяющимися именами

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

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

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

Похожие темы