C++线性规划库

1 背景

学习工作中的很多问题归结为线性规划问题。因此,对于线性规划的求解显得很有必要。

现在已经有很多开源的库或者商业软件可以求解这类问题,由于自己根据单纯形法封装了线性规划求解函数在自己的软件MathSword,为了方便C++使用,特地封装成C++可直接调用的类。

 

2 下载

封装的类在lineProgSolver.h头文件,可点击LineProg下载,对于代码里使用到的库MathLib.dll, 可到这里下载对于版本的MathSword, 解压后从解压目录Calculator下获取。

 

3 例子

以Beale问题为例

求如下目标函数的最大值

f = 0.75 * x1 – 20 * x2 + 0.5 * x3 – 6 * x4

其约束条件如下

0.25 * x1 – 8 * x2 – x3 + 9 * x4 ≤ 0

0.5 * x1 – 12 * x2 – 0.5 * x3 + 3 * x4 ≤0

x3 ≤ 1

x1>=0,x2>=0,x3>=0,x4>=0

使用如下代码求解

int main()

{

    using namespace LineProg;

    LineProgSolver solver("D:\\SoftWare\\MathSword\\Calculator\\MathLib.dll");

    SolverVar x1, x2, x3, x4;

    //1. 如果多次调用,每次调用前clear一下

    solver.clear();

    //2. 添加约束: 0.25 * x1 – 8 * x2 – x3 + 9 * x4 ≤ 0

    solver.addConstraint(0.25 * x1 – 8 * x2 – x3 + 9 * x4, EquationType_E::LessEqual_E, 0);

    //3. 添加约束:0.5 * x1 – 12 * x2 – 0.5 * x3 + 3 * x4 ≤ 0

    solver.addConstraint(0.5 * x1 – 12 * x2 – 0.5 * x3 + 3 * x4, EquationType_E::LessEqual_E, 0);

    //4. 添加约束: x3 ≤ 1

    solver.addConstraint(x3, EquationType_E::LessEqual_E, 1);

    //5. 设置最大化目标函数: 0.75 * x1 – 20 * x2 + 0.5 * x3 – 6 * x4

    solver.setMaxExpress(0.75 * x1 – 20 * x2 + 0.5 * x3 – 6 * x4);

    //6. 设置求解变量

    solver.setOptVar({ &x1, &x2, &x3, &x4 });

    //7. 求解

    if (solver.solve())

    {

        std::cout << "MaxExpress: " << solver.getMaxExpressValue() << "\n";

        std::cout << "x1 = " << x1.value << "\n";

        std::cout << "x2 = " << x2.value << "\n";

        std::cout << "x3 = " << x3.value << "\n";

        std::cout << "x4 = " << x4.value << "\n";

    }

    system("pause");

    return 0;

}

发表回复

您的电子邮箱地址不会被公开。