У меня большая проблема с LP, выглядящая так:
max z = c^T * x
s.t. A*x <= b
and Aeq * x = beq
После написания ограничений код выглядит так:
import org.apache.commons.math3.optim.linear.LinearConstraint;
import org.apache.commons.math3.optim.linear.Relationship;
import org.apache.commons.math3.exception.TooManyIterationsException;
import org.apache.commons.math3.optim.OptimizationData;
import org.apache.commons.math3.optim.PointValuePair;
import org.apache.commons.math3.optim.linear.LinearConstraintSet;
import org.apache.commons.math3.optim.linear.LinearObjectiveFunction;
import org.apache.commons.math3.optim.linear.NoFeasibleSolutionException;
import org.apache.commons.math3.optim.linear.NonNegativeConstraint;
import org.apache.commons.math3.optim.linear.SimplexSolver;
import org.apache.commons.math3.optim.linear.UnboundedSolutionException;
import org.apache.commons.math3.optim.nonlinear.scalar.GoalType;
LinearObjectiveFunction objective = new LinearObjectiveFunction(objectiveCoefficients, 0);
SimplexSolver solver = new SimplexSolver(epsilon, maxUlps, cutOff);
LinearConstraintSet constraintSet = new LinearConstraintSet(constraints);
NonNegativeConstraint nonnegative = new NonNegativeConstraint(true);
GoalType maximization = GoalType.MAXIMIZE;
OptimizationData[] optData = new OptimizationData[]{maximization, objective, constraintSet, nonnegative};
try{
PointValuePair solution = solver.optimize(optData);
}catch ...
работает очень хорошо. Однако я не могу получить значения двойственной задачи, то есть теневые цены моих ограничений, не решая двойную задачу отдельно.
Есть ли возможность получить как значения x моей основной задачи, так и теневые цены ограничений с помощью org.apache.commons.math3.optim
?
Спасибо заранее