이 예에서는 MathOpt를 사용하여 간단한 선형 프로그램 (LP)의 결과를 빌드하고, 해결하고, 탐색하는 방법을 보여줍니다. OR-도구 설치에 관한 정보는 설치 가이드에서 확인할 수 있습니다. 소스에서 빌드하고 실행하는 방법에 관한 추가 참고사항은 끝까지 연기합니다.
MathOpt 모델 빌드
소스에서는 일반적으로 다음과 같이 하나의 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"
다음 선형 프로그래밍 문제는 이 가이드 전체에서 사용되며 GLOP로 해결됩니다.
먼저 모델을 빌드합니다.
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);
솔루션 해결 및 검사
다음으로 Solve의 매개변수를 설정합니다. MathOpt를 사용하여 최적화 모델을 해결하는 것은 쉽게 구성할 수 있습니다. 솔버 독립 매개변수 (예: 출력 사용 설정), 솔버별 매개변수 (예: GlopParameters.optimization_rule), 모델 속성 (예: 분기 우선순위), 솔버 로그의 콜백, 최적화를 모니터링하고 제어하는 콜백이 있습니다. 다음 코드는 솔버 로그를 사용 설정합니다.
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;
Google의 심플렉스 기반 LP 솔버인 GLOP을 사용하여 문제를 해결하려면 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());
마지막으로 최적 해의 목표 값과 최적 변수 값을 검사합니다. 종료 이유가 최적의 경우이므로 이러한 값이 있다고 가정하는 것이 안전하지만, 다른 종료 이유 (예: 실행 불가능 또는 제한되지 않음)의 경우 이러한 메서드를 호출하면 CHECK fail
(C++의 경우) 또는 raise an exception
(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;
Bazel을 사용한 코드 빌드 및 실행에 대한 참고 사항
bazel을 사용하여 소스에서 MathOpt를 빌드하는 경우 이 예에서는 빌드 타겟에 다음 종속 항목이 필요합니다.
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"
코드를 실행하기 위해 다음 bazel 명령어가 타겟을 빌드하고 실행합니다.
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