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

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

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.

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

| |

Похожие темы