Исследуйте решение для оптимизации

Получите числовое решение

Функция 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.

Смотрите также

| |

Похожие темы