Hi all,
I need to implement a way to recover some important information from
SimplexSolver's final tableau.
I'll start by the shadow price, which seems very straight forward. If I
understand it correctly, I must:
1 Store the original LinearConstraints in the same order as the normalized
constraints.
The LinearConstraintSet stores the constraints in a HashSet, so care
must be taken to ensure ordering.
2 After the optimization, given a constraint, I must determine the
tableau's column relative to the constraint's slack variable and return the
value on the objective function row.
The column index should be getSlackVariableOffset() plus the number of
LEQ and GEQ constraints present in the original constraints list before the
given constraint.
I'm kinda new to the Simplex method, so this may be wrong too. Looking at
the code, I think that the logic in (2) should be implemented in
SimplexSolver, but I'm not sure about (1), since:
A SimplexSolver doesn't store the SimplexTableau instance used during
optimization. Since SS is immutable, it really shouldn't. So I must return
the shadow price of every constraint along the optimal PointValuePair,
creating another overload of the doOptimize method (or some other new
method).
B I'm not confident enough that iterating a HashSet is fully
deterministic, nothing in the contracts says so. If it's really not
deterministic, then I'd have to copy the original constraints in the same
foreachloop that builds the normalized constraints list inside
SimplexTableau (from the HashSet in LinearConstraintSet). Normalization
happens in the normalizeConstraints method, and it returns a List right
into the final "constraints" field. To have both lists populated in the
same loop and placed in final fields, the loop would have to be in the
constructor. Kinda ugly...
So, any comments about the Simplex method and coding will be greatly
appreciated.
I'm a mathematician and programmer (much more the later than the former),
but I'm not well versed in Java's idiosyncrasies, and I'm new to
participating in the FOSS community. I want to do this, and so any guidance
will be appreciated :)
Best regards,
Renato C.
PS.: I opened a JIRA issue to track this:
https://issues.apache.org/jira/browse/MATH1032
