Начало работы

В этом примере показано, как построить, решить и изучить результаты простой линейной программы (ЛП) с использованием MathOpt. Информация об установке OR-Tools доступна в руководстве по установке . Дополнительные примечания о том, как собирать и запускать исходный код , отложены до конца.

Постройте модель MathOpt

В исходный код вам обычно нужно добавить только одну зависимость MathOpt:

Питон

from ortools.math_opt.python import mathopt

С++

#include <iostream>
#include <ostream>

#include "absl/log/check.h"
#include "absl/status/statusor.h"
#include "ortools/base/init_google.h"
#include "ortools/math_opt/cpp/math_opt.h"

В этом руководстве используется следующая задача линейного программирования, которая решается с помощью GLOP.

$$\begin{aligned} &\max &x + 2 \cdot y\\ &\text{subject to} &x + y &\leq 1.5 \\ &&-1 \leq x &\leq 1.5 \\ &&0 \leq y &\leq 1 \end{aligned}$$

Сначала постройте модель:

Питон

# Build the model.
model = mathopt.Model(name="getting_started_lp")
x = model.add_variable(lb=-1.0, ub=1.5, name="x")
y = model.add_variable(lb=0.0, ub=1.0, name="y")
model.add_linear_constraint(x + y <= 1.5)
model.maximize(x + 2 * y)

С++

// Build the model.
namespace math_opt = ::operations_research::math_opt;
math_opt::Model lp_model("getting_started_lp");
const math_opt::Variable x = lp_model.AddContinuousVariable(-1.0, 1.5, "x");
const math_opt::Variable y = lp_model.AddContinuousVariable(0.0, 1.0, "y");
lp_model.AddLinearConstraint(x + y <= 1.5, "c");
lp_model.Maximize(x + 2 * y);

Решите и проверьте решение

Далее задайте параметры решения. Решение моделей оптимизации с помощью MathOpt имеет широкие возможности настройки. Существуют параметры, независимые от решателя (например, включение вывода), параметры, специфичные для решателя (например, GlopParameters.optimization_rule), параметры, которые зависят от свойств модели (например, приоритет ветвления), обратный вызов для журналов решателя и обратный вызов для мониторинга и контролировать оптимизацию. Следующий код включает журнал решателя.

Питон

# Set parameters, e.g. turn on logging.
params = mathopt.SolveParameters(enable_output=True)

С++

// Set parameters, e.g. turn on logging.
math_opt::SolveArguments args;
args.parameters.enable_output = true;

Чтобы решить задачу с помощью GLOP, симплексного решателя LP от Google, используйте функцию Solve() .

Питон

# Solve and ensure an optimal solution was found with no errors.
# (mathopt.solve may raise a RuntimeError on invalid input or internal solver
# errors.)
result = mathopt.solve(model, mathopt.SolverType.GLOP, params=params)
if result.termination.reason != mathopt.TerminationReason.OPTIMAL:
    raise RuntimeError(f"model failed to solve: {result.termination}")

С++

// Solve and ensure an optimal solution was found with no errors.
const absl::StatusOr<math_opt::SolveResult> result =
    math_opt::Solve(lp_model, math_opt::SolverType::kGlop, args);
CHECK_OK(result.status());
CHECK_OK(result->termination.EnsureIsOptimal());

Наконец, проверьте объективное значение оптимального решения и оптимальные значения переменных. Обратите внимание: поскольку причина завершения была оптимальной, можно с уверенностью предположить, что эти значения существуют, но по другим причинам завершения (например, невозможным или неограниченным) вызов этих методов может привести CHECK fail (в C++) или raise an exception (в Python).

Питон

# Print some information from the result.
print("MathOpt solve succeeded")
print("Objective value:", result.objective_value())
print("x:", result.variable_values()[x])
print("y:", result.variable_values()[y])

С++

// Print some information from the result.
std::cout << "MathOpt solve succeeded" << std::endl;
std::cout << "Objective value: " << result->objective_value() << std::endl;
std::cout << "x: " << result->variable_values().at(x) << std::endl;
std::cout << "y: " << result->variable_values().at(y) << std::endl;

Примечания по созданию и запуску кода с помощью Bazel

Если вы собираете MathOpt из исходного кода с помощью bazel , для этого примера в цели сборки потребуются следующие зависимости:

Питон

"//util/operations_research/math_opt/python:mathopt"

С++

"//util/operations_research/math_opt/cpp:math_opt"
"//util/operations_research/math_opt/solvers:glop_solver"

Чтобы запустить ваш код, следующая команда bazel собирает и запускает вашу цель.

Питон

bazel run path/to/you:target --with_scip=false --with_cp_sat=false
--with_glpk=false --with_glop=true -- --your_flags

С++

bazel run path/to/you:target -- --your_flags