Функция solve
возвращает решение как структуру с каждой переменной в проблеме, имеющей поле в структуре. Чтобы получить численные значения выражений в проблеме от этой структуры легко, используйте функцию evaluate
.
Например, решите линейную проблему программирования в двух переменных.
x = optimvar('x'); y = optimvar('y'); prob = optimproblem; prob.Objective = -x -y/3; prob.Constraints.cons1 = x + y <= 2; prob.Constraints.cons2 = x + y/4 <= 1; prob.Constraints.cons3 = x - y <= 2; prob.Constraints.cons4 = x/4 + y >= -1; prob.Constraints.cons5 = x + y >= 1; prob.Constraints.cons6 = -x + y <= 2; sol = solve(prob)
sol = struct with fields: x: 0.6667 y: 1.3333
Предположим, что вы хотите значение целевой функции в решении. Можно повторно выполнить проблему, на этот раз прося значение целевой функции и решение.
[sol,fval] = solve(prob)
sol = struct with fields: x: 0.6667 y: 1.3333 fval = -1.1111
Также для длительной проблемы, сэкономьте время путем выполнения целевой функции в решении с помощью evaluate
.
fval = evaluate(prob.Objective,sol)
fval = -1.1111
Чтобы проверять, точно ли решение, о котором сообщают, можно рассмотреть выходные параметры от solve
. Возвратите весь solve
выходные параметры
[sol,fval,exitflag,output,lambda] = solve(prob);
Проверяйте выходной флаг. exitflag = OptimalSolution
обычно означает, что solve
сходился к решению. Для объяснения других значений exitflag
смотрите exitflag
.
Проверяйте выходное сообщение в командной строке или в выходной структуре. Когда выходное сообщение утверждает, что решатель сходился к решению, затем обычно решение надежно. Это сообщение соответствует exitflag = OptimalSolution
.
Когда у вас будут целочисленные ограничения, проверяйте абсолютный разрыв и относительный разрыв в выходном сообщении или в выходной структуре. Когда эти разрывы являются нулем или почти обнуляют, решение надежно.
Если solve
сообщает о той вашей проблеме, неосуществимо (выходным флагом является NoFeasiblePointFound
), исследуйте проблему infeasibility во множестве точек, чтобы видеть, какие ограничения могут быть чрезмерно строгими. Предположим, что у вас есть одна непрерывная переменная оптимизации под названием x
, который имеет конечные границы на всех компонентах, и у вас есть ограничения constr1
через constr20
.
N = 100; % check 100 points infeas = zeros(N,20); % allocate L = x.LowerBound; U = x.UpperBound; S = numel(L); pthist = cell(N); for k = 1:N pt = L + rand(size(L)).*(U-L); pthist{k} = pt; for j = 1:20 infeas(k,j) = infeasibility(['constr',num2str(j)],pt); end end
infeas(a,b)
результата имеет ненулевые значения везде, где связанная точка pt{a}
неосуществима для ограничения b
.
Если solve
занимает много времени, существует несколько возможных причин и средств.
Проблемная формулировка является медленной. Если вы задали цель или ограничительные выражения во вложенных циклах, то solve
может занять много времени, чтобы преобразовать проблему внутренне в матричную форму. Чтобы ускорить решение, попытайтесь сформулировать свои выражения векторизованным способом. Смотрите Создают Эффективные Задачи оптимизации.
Смешано-целочисленное линейное решение для программирования является медленным. Иногда можно ускорить целочисленную проблему путем установки опций. Можно также повторно сформулировать проблему сделать его быстрее, чтобы решить. Смотрите Настраивающееся Целочисленное Линейное Программирование.
Решение для нелинейного программирования является медленным. Для предложений смотрите, что Решатель Занимает слишком много времени. Для дальнейших предложений смотрите Когда Сбои Решателя.
Превышенный Предел решателя. Чтобы решить некоторые проблемы, solve
может взять больше, чем количество по умолчанию шагов решения. Для проблем с целочисленными ограничениями увеличьте число позволенных шагов путем увеличения LPMaxIterations
, MaxNodes
, MaxTime
или опций RootLPMaxIterations
к выше, чем значения по умолчанию. Чтобы установить эти опции, используйте optimoptions('intlinprog',...)
. Для проблем нецелого числа увеличьте опцию MaxIterations
с помощью optimoptions('linprog','MaxIterations',...)
. Смотрите options
.
evaluate
| infeasibility
| solve