Informationen für Einsteiger

In diesem Beispiel wird gezeigt, wie Sie die Ergebnisse eines einfachen linearen Programms (LP) mit MathOpt erstellen, lösen und untersuchen. Informationen zur Installation von OR-Tools finden Sie in der Installationsanleitung. Zusätzliche Hinweise zum Erstellen und Ausführen aus der Quelle werden bis zum Ende verschoben.

MathOpt-Modell erstellen

In der Quelle müssen Sie in der Regel nur eine einzelne MathOpt-Abhängigkeit hinzufügen:

Python

from ortools.math_opt.python import mathopt

C++

#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"

Das folgende lineare Programmierproblem wird in diesem Leitfaden verwendet und mit GLOP gelöst.

$$\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}$$

Erstellen Sie zuerst das Modell:

Python

# 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)

C++

// 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);

Lösung lösen und untersuchen

Als Nächstes legen Sie die Parameter für die Lösung fest. Die Lösung von Optimierungsmodellen mit MathOpt lässt sich hochgradig konfigurieren. Es gibt lösungsunabhängige Parameter (z.B. Ausgabe aktivieren), löserspezifische Parameter (z.B. GlopParameters.Optimization_rule), Parameter, die von Eigenschaften des Modells (z.B. Verzweigungspriorität) abhängen, einen Callback für die Solver-Logs und einen Callback zum Überwachen und Steuern der Optimierung. Mit dem folgenden Code werden die Solver-Logs aktiviert.

Python

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

C++

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

Verwenden Sie die Funktion Solve(), um das Problem mit GLOP, dem unidirektionalen LP-Resolver von Google, zu lösen.

Python

# 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}")

C++

// 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());

Untersuchen Sie zuletzt den Zielwert der optimalen Lösung und die optimalen Variablenwerte. Da der Beendigungsgrund optimal war, kann davon ausgegangen werden, dass diese Werte vorhanden sind. Aus anderen Beendigungsgründen (z. B. unmöglich oder unbegrenzt) kann das Aufrufen dieser Methoden jedoch CHECK fail (in C++) oder raise an exception (in Python) sein.

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])

C++

// 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;

Hinweise zum Erstellen und Ausführen von Code mit Bazel

Wenn Sie MathOpt aus der Quelle mit bazel erstellen, benötigt dieses Beispiel die folgenden Abhängigkeiten im Build-Ziel:

Python

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

C++

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

Mit dem folgenden bazel-Befehl wird das Ziel erstellt und ausgeführt, um Ihren Code auszuführen.

Python

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

C++

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