ไอดอลเป็นไลบรารี C ++ สำหรับการเพิ่มประสิทธิภาพทางคณิตศาสตร์และการตัดสินใจที่ซับซ้อน
มันถูกออกแบบมาเพื่อช่วยให้คุณสร้างอัลกอริทึมใหม่ได้อย่างง่ายดายสำหรับการแก้ปัญหาที่ท้าทายมากขึ้นเรื่อย ๆ มันเป็นเครื่องมือที่หลากหลายและทรงพลังที่สามารถใช้ในการแก้ปัญหาการเพิ่มประสิทธิภาพที่หลากหลายรวมถึงการเขียนโปรแกรมเชิงเส้นผสม (MILP), ปัญหาที่ จำกัด กำลังสอง (MIQCQP และ MIQP), ปัญหา Bilevel (BO), ปัญหาการเพิ่มประสิทธิภาพที่แข็งแกร่ง (RO และ ARO) และอีกมากมาย
เยี่ยมชมเอกสารออนไลน์ของเรา
หากคุณกำลังเลือกไอดอลในโครงการวิจัยของคุณและพบปัญหาบางอย่างโปรดติดต่อเราที่ Lefebvre (AT) Uni-Trier.de
ดูว่าการใช้อัลกอริทึมสาขาและราคาง่ายเพียงใดโดยใช้ไอดอล
const auto [model, decomposition] = create_model(); // Creates the model with an annotation for automatic decomposition
const auto sub_problem_specifications =
DantzigWolfe::SubProblem ()
.add_optimizer(Gurobi()); // Each sub-problem will be solved by Gurobi
const auto column_generation =
DantzigWolfeDecomposition (decomposition)
.with_master_optimizer(Gurobi::ContinuousRelaxation()) // The master problem will be solved by Gurobi
.with_default_sub_problem_spec(sub_problem_specifications);
const auto branch_and_bound =
BranchAndBound ()
.with_node_selection_rule(BestBound()) // Nodes will be selected by the "best-bound" rule
.with_branching_rule(MostInfeasible()) // Variables will be selected by the "most-fractional" rule
.with_log_level(Info, Blue);
const auto branch_and_price = branch_and_bound + column_generation; // Embed the column generation in the Branch-and-Bound algorithm
model.use(branch_and_price);
model.optimize();ที่นี่ไอดอลใช้ Coin-or/Mibs ตัวแก้ภายนอกเพื่อแก้ปัญหาการเพิ่มประสิทธิภาพ Bilevel ด้วยระดับต่ำกว่าจำนวนเต็ม
/*
This example is taken from "The Mixed Integer Linear Bilevel Programming Problem" (Moore and Bard, 1990).
min -1 x + -10 y
s.t.
y in argmin { y :
-25 x + 20 y <= 30,
1 x + 2 y <= 10,
2 x + -1 y <= 15,
2 x + 10 y >= 15,
y >= 0 and integer.
}
x >= 0 and integer.
*/
Env env;
// Define High Point Relaxation
Model high_point_relaxation (env);
auto x = high_point_relaxation.add_var( 0 , Inf, Integer, " x " );
auto y = high_point_relaxation.add_var( 0 , Inf, Integer, " y " );
high_point_relaxation.set_obj_expr(-x - 10 * y);
auto follower_c1 = high_point_relaxation.add_ctr(- 25 * x + 20 * y <= 30 );
auto follower_c2 = high_point_relaxation.add_ctr(x + 2 * y <= 10 );
auto follower_c3 = high_point_relaxation.add_ctr( 2 * x - y <= 15 );
auto follower_c4 = high_point_relaxation.add_ctr( 2 * x + 10 * y >= 15 );
// Prepare bilevel description
Bilevel::LowerLevelDescription description (env);
description.set_follower_obj_expr(y);
description.set_follower_var(y);
description.set_follower_ctr(follower_c1);
description.set_follower_ctr(follower_c2);
description.set_follower_ctr(follower_c3);
description.set_follower_ctr(follower_c4);
// Use coin-or/MibS as external solver
high_point_relaxation.use(Bilevel::MibS(description));
// Optimize and print solution
high_point_relaxation.optimize();
std::cout << high_point_relaxation.get_status() << std::endl;
std::cout << high_point_relaxation.get_reason() << std::endl;
std::cout << save_primal(high_point_relaxation) << std::endl;ไอดอลยังสามารถเชื่อมต่อกับรูทเพื่อตรวจสอบความคืบหน้าของอัลกอริทึมของคุณ ตัวอย่างเช่นนี่คือภาพหน้าจอของการตรวจสอบ MIBS สำหรับอินสแตนซ์ Bilevel
ไอดอลสามารถใช้เป็นอินเทอร์เฟซแบบครบวงจรกับนักแก้ปัญหาโอเพนซอร์ซหรือเชิงพาณิชย์หลายตัวเช่น
นี่คือโปรไฟล์ประสิทธิภาพที่คำนวณได้ตาม Dolan, E. , Moré, J. ซอฟต์แวร์การเพิ่มประสิทธิภาพการเปรียบเทียบการเปรียบเทียบพร้อมโปรไฟล์ประสิทธิภาพ คณิตศาสตร์. โปรแกรม 91, 201–213 (2002) https://doi.org/10.1007/S101070100263
Versionning สอดคล้องกับ Semantic Versionning 2.0.0