Если вы используете две различных переменные, которые имеют то же имя, то выражения оптимизации, ограничения или проблемы могут выдать ошибку. Эта ошибка неприятна, когда вы создаете переменную, затем создаете выражение с помощью той переменной, затем воссоздаете переменную. Предположим, что вы создаете следующую переменную и ограничительное выражение:
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]);
Этот метод может быть полезным, если вы создали больше выражений с помощью старой переменной, чем выражения с помощью новой переменной.