ตัวอย่างนี้แสดงวิธีสร้าง แก้โจทย์ และสำรวจผลลัพธ์ของโปรแกรมเชิงเส้นแบบง่าย (LP) โดยใช้ MathOpt ข้อมูลเกี่ยวกับการติดตั้ง หรือเครื่องมือ อยู่ในคำแนะนำในการติดตั้ง หมายเหตุเพิ่มเติมเกี่ยวกับวิธีสร้างและเรียกใช้จากแหล่งที่มาจะเลื่อนไปยังตอนท้าย
สร้างโมเดล MathOpt
ในแหล่งที่มา โดยทั่วไปคุณจะต้องเพิ่มทรัพยากร Dependency 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);
แก้และตรวจสอบคำตอบ
ถัดมา ให้กำหนดพารามิเตอร์สำหรับการแก้ปัญหา การแก้ปัญหาโมเดลการเพิ่มประสิทธิภาพด้วย 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;
หากต้องการแก้โจทย์โดยใช้ GLOP ซึ่งเป็นเครื่องมือแก้โจทย์ LP ที่ใช้รูปแบบอย่างง่ายของ Google ให้ใช้ฟังก์ชัน 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
หากคุณกำลังสร้าง MathOpt จากต้นทางโดยใช้ Bazel ตัวอย่างนี้ต้องใช้ทรัพยากร Dependency ต่อไปนี้ในเป้าหมายบิลด์
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