Можно ли получить теневые цены с помощью org.apache.commons.math3.optim?

У меня большая проблема с 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?

Спасибо заранее


person Gerald    schedule 10.01.2019    source источник


Ответы (1)


Он не возвращает двойников. Вы, вероятно, можете получить их из финальной таблицы, но для этого может потребоваться некоторая сантехника.

Отмечено, что это не лучший решатель для любых, кроме самых маленьких задач ЛП. Это не серьезный алгоритм, а скорее реализация симплексного метода полной таблицы из главы 1 учебника. Не рекомендуется для больших проблем.

person Erwin Kalvelagen    schedule 10.01.2019