Bắt đầu

Ví dụ này cho thấy cách xây dựng, giải quyết và khám phá kết quả của một chương trình tuyến tính (LP) đơn giản bằng cách sử dụng MathOpt. Thông tin về cách cài đặt OR-Tools có trong hướng dẫn cài đặt. Các ghi chú bổ sung về cách tạo và chạy từ nguồn sẽ được trì hoãn đến cuối.

Xây dựng mô hình MathOpt

Trong nguồn của mình, thông thường, bạn chỉ cần thêm một phần phụ thuộc MathOpt:

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"

Bài toán lập trình tuyến tính sau đây được dùng xuyên suốt hướng dẫn này và được giải bằng 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}$$

Trước tiên, hãy xây dựng mô hình:

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

Giải bài tập và kiểm tra giải pháp

Tiếp theo, hãy đặt các tham số cho phương thức giải. Việc giải quyết các mô hình tối ưu hoá bằng MathOpt có thể định cấu hình cao. Có các tham số độc lập với trình giải (ví dụ: kích hoạt đầu ra), tham số dành riêng cho trình giải toán (ví dụ: GlopParameters.optimization_quy tắc), các tham số phụ thuộc vào thuộc tính của mô hình (ví dụ: mức độ ưu tiên phân nhánh), lệnh gọi lại cho nhật ký trình giải toán và một lệnh gọi lại để theo dõi và kiểm soát quá trình tối ưu hoá. Mã sau đây sẽ bật nhật ký của trình giải.

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;

Để giải bài toán này bằng GLOP, trình giải LP dựa trên đơn giản của Google, hãy dùng hàm Solve().

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

Cuối cùng, hãy kiểm tra giá trị mục tiêu của giải pháp tối ưu và các giá trị biến tối ưu. Xin lưu ý rằng vì lý do chấm dứt là tối ưu, nên bạn có thể giả định các giá trị này tồn tại, nhưng vì các lý do chấm dứt khác (ví dụ: không khả thi hoặc không bị ràng buộc), lệnh gọi các phương thức này có thể CHECK fail (trong C++) hoặc raise an exception (trong Python).

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;

Lưu ý về việc xây dựng và chạy mã bằng Bazel

Nếu bạn đang tạo MathOpt từ nguồn bằng cách sử dụng bazel, thì ví dụ này cần các phần phụ thuộc sau trong mục tiêu bản dựng:

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"

Để chạy mã của bạn, lệnh bazel sau đây sẽ tạo và chạy mục tiêu của bạn.

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