[ https://issues.apache.org/jira/browse/MATH293?page=com.atlassian.jira.plugin.system.issuetabpanels:alltabpanel
]
Benjamin McCann updated MATH293:

Attachment: SimplexSolverTest.patch
SimplexTableau.patch
Thanks for the bug report Andrea. I was expecting this problem when I submitted the patch
for MATH286, but didn't have a good test case to work against and verify the fix. This is
largely what I was thinking of when I mentioned we should test some more, but didn't think
you'd beat me to it in finding a good example to work off of :o) When I changed the columns
being dropped in the patch for MATH286 it meant there wasn't always a way to always tell
which variable each column of the tableau represented. This patch creates a mapping between
column index and variable label so that when we can read the final solution out of the tableau.
I feel much better about this now. Thanks!
> Matrix's "OutOfBoundException" in SimplexSolver
> 
>
> Key: MATH293
> URL: https://issues.apache.org/jira/browse/MATH293
> Project: Commons Math
> Issue Type: Bug
> Affects Versions: Nightly Builds
> Environment: java 1.6 on Windows XP 32Bit
> Reporter: Andrea
> Attachments: SimplexSolverTest.patch, SimplexTableau.patch
>
>
> Hi all,
> This bug is somehow related to incident MATH286, but not necessarily...
> Let's say I have an LP and I solve it using SimplexSolver. Then I create a second LP
similar to the first one, but with "stronger" constraints. The second LP has the following
properties:
> * the only point in the feasible region for the second LP is the solution returned for
the first LP
> * the solution returned for the first LP is also the (only possible) solution to the
second LP
> This shows the problem:
> {code:borderStyle=solid}
> LinearObjectiveFunction f = new LinearObjectiveFunction(new double[] { 0.8, 0.2, 0.7,
0.3, 0.4, 0.6}, 0 );
> Collection<LinearConstraint> constraints = new ArrayList<LinearConstraint>();
> constraints.add(new LinearConstraint(new double[] { 1, 0, 1, 0, 1, 0 }, Relationship.EQ,
30.0));
> constraints.add(new LinearConstraint(new double[] { 0, 1, 0, 1, 0, 1 }, Relationship.EQ,
30.0));
> constraints.add(new LinearConstraint(new double[] { 0.8, 0.2, 0.0, 0.0, 0.0, 0.0 }, Relationship.GEQ,
10.0));
> constraints.add(new LinearConstraint(new double[] { 0.0, 0.0, 0.7, 0.3, 0.0, 0.0 }, Relationship.GEQ,
10.0));
> constraints.add(new LinearConstraint(new double[] { 0.0, 0.0, 0.0, 0.0, 0.4, 0.6 }, Relationship.GEQ,
10.0));
> RealPointValuePair solution = new SimplexSolver().optimize(f, constraints, GoalType.MAXIMIZE,
true);
> double valA = 0.8 * solution.getPoint()[0] + 0.2 * solution.getPoint()[1];
> double valB = 0.7 * solution.getPoint()[2] + 0.3 * solution.getPoint()[3];
> double valC = 0.4 * solution.getPoint()[4] + 0.6 * solution.getPoint()[5];
> f = new LinearObjectiveFunction(new double[] { 0.8, 0.2, 0.7, 0.3, 0.4, 0.6}, 0 );
> constraints = new ArrayList<LinearConstraint>();
> constraints.add(new LinearConstraint(new double[] { 1, 0, 1, 0, 1, 0 }, Relationship.EQ,
30.0));
> constraints.add(new LinearConstraint(new double[] { 0, 1, 0, 1, 0, 1 }, Relationship.EQ,
30.0));
> constraints.add(new LinearConstraint(new double[] { 0.8, 0.2, 0.0, 0.0, 0.0, 0.0 }, Relationship.GEQ,
valA));
> constraints.add(new LinearConstraint(new double[] { 0.0, 0.0, 0.7, 0.3, 0.0, 0.0 }, Relationship.GEQ,
valB));
> constraints.add(new LinearConstraint(new double[] { 0.0, 0.0, 0.0, 0.0, 0.4, 0.6 }, Relationship.GEQ,
valC));
> solution = new SimplexSolver().optimize(f, constraints, GoalType.MAXIMIZE, true);
> {code}
> Instead of returning the solution, SimplexSolver throws an Exception:
> {noformat} Exception in thread "main" org.apache.commons.math.linear.MatrixIndexException:
no entry at indices (0, 7) in a 6x7 matrix
> at org.apache.commons.math.linear.Array2DRowRealMatrix.getEntry(Array2DRowRealMatrix.java:356)
> at org.apache.commons.math.optimization.linear.SimplexTableau.getEntry(SimplexTableau.java:408)
> at org.apache.commons.math.optimization.linear.SimplexTableau.getBasicRow(SimplexTableau.java:258)
> at org.apache.commons.math.optimization.linear.SimplexTableau.getSolution(SimplexTableau.java:336)
> at org.apache.commons.math.optimization.linear.SimplexSolver.doOptimize(SimplexSolver.java:182)
> at org.apache.commons.math.optimization.linear.AbstractLinearOptimizer.optimize(AbstractLinearOptimizer.java:106){noformat}
> I was too optimistic with the bug MATH286 ;)

This message is automatically generated by JIRA.

You can reply to this email to add a comment to the issue online.
