如何使用ojAlgo解决线性规划问题



我正在学习如何解决线性规划问题,我想使用ojAlgo LinearSolver。

  1. 我使用SolverTask求解等式约束,并得到一个可行点。不错
  2. 然后,我使用等式约束的LinearSolver解决了我认为相同的问题,它失败了,说问题是不可置信的
  3. 然后我添加了不等式约束,设计成不影响求解,它也说它是不可置信的。但现在我也得到了一个比预期更大的Result向量

我的问题:

  1. 我应该如何重新表述我的问题,以使用只有等式约束的LinearSolver.newGeneralBuilder((来解决它,同时获得与SolverTask相同的解决方案
  2. 我应该如何重新表述我的问题,以使用带有等式和不等式约束的LinearSolver.newGeneralBuilder((来解决它,同时获得与SolverTask相同的解决方案
  3. 当添加不等式时,这些额外的Result值是什么

我使用ojAlgo 49.2.1,在50.0.1中得到相同的结果。

public void testLinearProgramSolver() throws RecoverableCondition {
Primitive64Store g = FACTORY.column(new double[]{1, 1, 1});
Primitive64Store Ae = FACTORY.rows(new double[][] {
{ 1,   1, 1},
{0.55, 1, 0},
{ 0,   1, 1},
});
Primitive64Store ce = FACTORY.column(new double[]{-1.0, 0.050000000000000044, 0});
Primitive64Store Ai = FACTORY.rows(new double[][] {
{1, 0, 0},
{0, 1, 0},
{0, 0, 1},
});
Primitive64Store ci = FACTORY.column(new double[]{-2, -1, -1});
// Using SolverTask to solve Ae*x + ce = 0
SolverTask<Double> solver = SolverTask.PRIMITIVE.make(Ae, ce);
MatrixStore<Double> X = solver.solve(Ae, ce.negate());
MatrixStore<Double> residual = Ae.multiply(X).add(ce);
double norm = residual.norm();
//  Using LinearSolver with equalities
LinearSolver.GeneralBuilder builderEqualities = LinearSolver.newGeneralBuilder();
LinearSolver linearProgram = builderEqualities
.objective(g)
.equalities(Ae, ce.negate())
.build();
Optimisation.Result result = linearProgram.solve();
Primitive64Store x2 = FACTORY.column(result.toRawCopy1D());
int maxDim2 = x2.getMaxDim();
//  Using LinearSolver with inequalities
LinearSolver.GeneralBuilder builderInequalities = LinearSolver.newGeneralBuilder();
LinearSolver linearProgram1 = builderInequalities
.objective(g)
.equalities(Ae, ce.negate())
.inequalities(Ai, ci.negate())
.build();
Optimisation.Result result1 = linearProgram1.solve();
Primitive64Store x1 = FACTORY.column(result1.toRawCopy1D());
int maxDim1 = x1.getMaxDim();
}

1/2(通常不使用LP解算器来求解全阶方程组。应该有很多可能的解决方案,并且您希望找到最好的解决方案。

  1. 这些将是不等式中的松弛变量。(可以直接从解算器获得结果,但它不知道它是如何构建的。(

先试用ExpressionsBasedModel。

最新更新