commons-user mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Alexander Sehlström <>
Subject [Math] Limitations of the SimplexSolver class?
Date Mon, 08 Apr 2013 15:29:10 GMT

I am trying to solve a linear programming problem using the SimplexSolver (org.apache.commons.math3.optim.linear.SimplexSolver).

It dose start to compute, however it never returns any result. Is there any limit on the number
of variables it is possible to solve for?

My problem reads:

Determine s_c, the solution of: 

    | min   g(x)' * s
    | s.t.  s_l <= s <= s_u

where g(x) is the vector of first order derivatives of f(x) with
respect to xi, s is the step length to use for update of x and
the lower and upper bounds of s are defined as:

    s_l = max( -delta, xmin - x )
    s_u = min(  delta, xmax - x )

The number of variables are 640 since g(x) is a vector of length 640.

My code runs fine until SimplexSolver.optimize() is called; the method never returns a result
and the code is stuck without any error thrown.


My code is appended below.

// Gradient of objective function at x
LinearObjectiveFunction g = new LinearObjectiveFunction(evaluation.derivatives.toArray(),

// Boundaries s_l and s_u
// - Treat the boundaries as linear constraints.
DoubleMatrix tempMatrix = new DoubleMatrix(x.length, 2);

// s_l = max( -delta, xmin - x ),
tempMatrix.putColumn(0, DoubleMatrix.ones(x.length).mul(-1*delta));
tempMatrix.putColumn(1, xmin.sub(x));
s_l = tempMatrix.rowMaxs();

// s_u = min(  delta, xmax - x ),
tempMatrix.putColumn(0, DoubleMatrix.ones(x.length).mul(delta));
tempMatrix.putColumn(1, xmax.sub(x));
s_u = tempMatrix.rowMins();

Collection<LinearConstraint> constraints = new ArrayList();

for (int i = 0; i < s_l.length; i++) {
    double[] coef = eye.getRow(i).toArray();
    constraints.add(new LinearConstraint(coef, Relationship.GEQ, s_l.get(i)));
    constraints.add(new LinearConstraint(coef, Relationship.LEQ, s_u.get(i)));

// Solve
LinearConstraintSet lcs = new LinearConstraintSet(constraints);
NonNegativeConstraint nnc = new NonNegativeConstraint(false);

simplexresult = new SimplexSolver().optimize(new MaxIter(100), g, lcs, nnc);

s_c = new DoubleMatrix(simplexresult.getPoint());

  • Unnamed multipart/alternative (inline, None, 0 bytes)
View raw message