Bu örnekte, MathOpt kullanılarak basit bir doğrusal programda (LP) nasıl oluşturulacağı, çözülebileceği ve sonuçların nasıl keşfedileceği gösterilmektedir. OR-Tools'un yüklenmesiyle ilgili bilgileri yükleme kılavuzunda bulabilirsiniz. Kaynaktan derleme ve çalıştırmayla ilgili ek notlar sona ermektedir.
MathOpt modeli oluşturma
Kaynağınızda genellikle yalnızca tek bir MathOpt bağımlılığı eklemeniz gerekir:
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"
Bu kılavuz boyunca aşağıdaki doğrusal programlama problemi kullanılmıştır ve GLOP ile çözülmüştür.
İlk olarak modeli oluşturun:
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);
Çözümü çözme ve inceleme
Daha sonra çözüm için parametreleri belirleyin. MathOpt ile optimizasyon modellerinin çözümü yüksek düzeyde yapılandırılabilir. Çözücüden bağımsız parametreler (ör. çıkışı etkinleştirme), çözücüye özel parametreler (ör. GlopParameters.optimization_rule), modelin özelliklerine bağlı parametreler (ör. kollara ayırma önceliği), çözücü günlükleri için geri çağırma ve optimizasyonu izleyip kontrol etmek için bir geri çağırma vardır. Aşağıdaki kod çözücü günlüklerini açar.
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;
Problemi, Google'ın basitx tabanlı LP çözücü olan GLOP'u kullanarak çözmek için Solve()
işlevini kullanın.
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());
Son olarak, optimum çözümün nesnel değerini ve optimum değişken değerlerini inceleyin. Fesih nedeni optimum olduğundan bu değerlerin mevcut olduğunu varsaymanın güvenli olduğunu unutmayın. Ancak diğer sonlandırma nedenlerinden dolayı (örneğin, uygun olmayan veya sınırsız) bu yöntemlerin çağrılması için CHECK fail
(C++) veya raise an exception
(Python'da) kullanılabilir.
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;
Kodunuzu Bazel ile oluşturma ve çalıştırmayla ilgili notlar
Bazel kullanarak kaynaktan MathOpt derliyorsanız bu örnek, derleme hedefinde aşağıdaki bağımlılıklara ihtiyaç duyar:
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"
Aşağıdaki bazel komutu, kodunuzu çalıştırmak için hedefinizi derler ve çalıştırır.
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