Memulai

Contoh ini menunjukkan cara membuat, menyelesaikan, dan menjelajahi hasil program linear sederhana (LP) menggunakan MathOpt. Informasi tentang cara menginstal OR-Tools tersedia di panduan penginstalan. Catatan tambahan tentang cara mem-build dan menjalankan dari sumber ditangguhkan ke bagian akhir.

Membangun model MathOpt

Di sumber, Anda biasanya hanya perlu menambahkan satu dependensi 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"

Masalah pemrograman linear berikut digunakan di seluruh panduan ini, dan diselesaikan dengan 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}$$

Pertama, build model:

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

Menyelesaikan dan memeriksa solusi

Selanjutnya, atur parameter untuk penyelesaian. Menyelesaikan model pengoptimalan dengan MathOpt sangat dapat dikonfigurasi. Ada parameter yang tidak bergantung pada pemecah masalah (misalnya aktifkan output), parameter khusus pemecah masalah (misalnya GlopParameters.optimization_rule), parameter yang bergantung pada properti model (misalnya prioritas percabangan), callback untuk log pemecah, dan callback untuk memantau dan mengontrol pengoptimalan. Kode berikut mengaktifkan log pemecah masalah.

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;

Untuk menyelesaikan soal menggunakan GLOP, pemecah LP berbasis simplex Google, gunakan fungsi 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());

Terakhir, periksa nilai objektif dari solusi yang optimal dan nilai variabel yang optimal. Perlu diperhatikan bahwa karena alasan penghentiannya optimal, aman untuk mengasumsikan nilai ini ada, tetapi untuk alasan penghentian lainnya (misalnya, tidak layak atau tidak terbatas), pemanggilan metode ini dapat melakukan CHECK fail (di C++) atau raise an exception (di 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;

Catatan tentang cara membuat dan menjalankan kode dengan Bazel

Jika Anda membuat MathOpt dari sumber menggunakan bazel, contoh ini memerlukan dependensi berikut dalam target build:

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"

Untuk menjalankan kode Anda, perintah bazel berikut akan mem-build dan menjalankan target Anda.

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