exponenta event banner

Анализ решения по оптимизации

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

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.

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

См. также

| |

Связанные темы