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)
Solving problem using linprog. Optimal solution found. sol = struct with fields: x: 0.6667 y: 1.3333
Предположим, что вы хотите значение целевой функции в решении. Можно повторно выполнить проблему, на этот раз прося значение целевой функции и решение.
[sol,fval] = solve(prob)
Solving problem using linprog. Optimal solution found. 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
.
Проверяйте выходное сообщение в командной строке или в структуре output. Когда выходное сообщение утверждает, что решатель сходился к решению, затем обычно решение надежно. Это сообщение соответствует exitflag = OptimalSolution
.
Когда у вас будут целочисленные ограничения, проверяйте абсолютную погрешность и относительную погрешность в выходном сообщении или в выходной структуре. Когда эти погрешности являются нулем или почти нули, решение надежно.
Если solve
сообщает о той вашей проблеме, неосуществимо (выходным флагом является NoFeasiblePointFound
), исследуйте проблемную недопустимость во множестве точек, чтобы видеть, какие ограничения могут быть чрезмерно строгими. Предположим, что у вас есть одна непрерывная переменная оптимизации под названием 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