شروع شدن

این مثال نحوه ساخت، حل و کاوش نتایج یک برنامه خطی ساده (LP) را با استفاده از MathOpt نشان می دهد. اطلاعات مربوط به نصب OR-Tools در راهنمای نصب موجود است. نکات اضافی در مورد نحوه ساخت و اجرا از منبع به انتها موکول می شود.

یک مدل MathOpt بسازید

در منبع خود، معمولاً فقط باید یک وابستگی MathOpt را اضافه کنید:

پایتون

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"

مسئله برنامه نویسی خطی زیر در سراسر این راهنما استفاده می شود و با 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)

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

محلول را حل و بررسی کنید

در مرحله بعد، پارامترهای حل را تنظیم کنید. حل مدل های بهینه سازی با MathOpt بسیار قابل تنظیم است. پارامترهای مستقل از حل کننده (به عنوان مثال فعال کردن خروجی)، پارامترهای خاص حل کننده (مانند GlopParameters.optimization_rule)، پارامترهایی که به ویژگی های مدل بستگی دارند (به عنوان مثال اولویت انشعاب)، یک تماس برای گزارش های حل کننده، و یک تماس برای نظارت و کنترل بهینه سازی کد زیر ورود حل کننده را روشن می کند.

پایتون

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

برای حل مشکل با استفاده از GLOP، حلگر LP مبتنی بر سیمپلکس گوگل، از تابع 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}")

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

در آخر، مقدار هدف راه حل بهینه و مقادیر متغیر بهینه را بررسی کنید. توجه داشته باشید که چون دلیل خاتمه بهینه بود، می‌توان فرض کرد که این مقادیر وجود دارند، اما به دلایل پایانی دیگر (مثلاً غیرقابل اجرا یا نامحدود) فراخوانی این روش‌ها می‌تواند CHECK fail یا raise an exception .

پایتون

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

نکاتی در مورد ساخت و اجرای کد خود با Bazel

اگر MathOpt را از منبع با استفاده از bazel می‌سازید، این مثال به وابستگی‌های زیر در build target نیاز دارد:

پایتون

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

C++

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

C++

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