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;
}