我使用 Or-tools 用 C# 编写了这段代码来解决 LP 问题(下面的 LPSolve 脚本)
public static void test(ConvolutionData data)
{
Solver solver = Solver.CreateSolver("GLOP");
if (solver is null)
{
return;
}
Variable x1 = solver.MakeNumVar(0.1, double.PositiveInfinity, "x1");
Variable x2 = solver.MakeNumVar(0.1, double.PositiveInfinity, "x2");
Variable x3 = solver.MakeNumVar(0.1, double.PositiveInfinity, "x3");
Variable t1 = solver.MakeNumVar(0.0, double.PositiveInfinity, "t1");
Variable t2 = solver.MakeNumVar(0.0, double.PositiveInfinity, "t2");
Variable u1 = solver.MakeNumVar(0.0, double.PositiveInfinity, "u1");
Variable v1 = solver.MakeNumVar(0.0, double.PositiveInfinity, "v1");
Constraint c1 = solver.Add(202 * x1 + 61 * x2 + 4 * x3 + t1 >= 0);
Constraint c2 = solver.Add(204 * x1 + 57 * x2 + 5 * x3 + t2 >= 0);
Constraint c3 = solver.Add(-2 * x1 + 4 * x2 - x3 + u1 - v1 == 0);
solver.Minimize(t1 + u1 + v1 + t2);
Solver.ResultStatus resultStatus = solver.Solve();
}
为什么这个 .lp 脚本与 LpSolve 中的解不同? 或者只是因为解决方法不同?
/* Objective function */
min: t1 + t2 + u1 + v1;
202 x1 + 61 x2 + 4 x3 + t1 >= 0;
204 x1 + 57 x2 + 5 x3 + t2 >= 0;
-2 x1 + 4 x2 - x3 + u1 - v1 = 0;
x1 >= 0.1;
x2 >= 0.1;
x3 >= 0.1;
是的,目标是一样的。没有什么可以强制解决方案是相等的。