Я хочу решить следующую модель с помощью Commons Math 3 от Apache:
maximize: 30x + 40y
s.t. x+y <= 240; 2x+y <= 320; x,y>=0;
Мой код, связанный с документами, должен быть:
// objective f = 30x + 40y + 0
LinearObjectiveFunction f = new LinearObjectiveFunction(new double[] { 30, 40},0);
List<LinearConstraint> constraints = new ArrayList();
// x + y <= 240
constraints.add(new LinearConstraint(new double[] {1, 1}, Relationship.LEQ, 240));
// x + y <= 320
constraints.add(new LinearConstraint(new double[] {2, 1}, Relationship.LEQ, 320));
// x,y >=0
NonNegativeConstraint nonNegativeConstraint = new NonNegativeConstraint(false);
LinearConstraintSet constraintSet = new LinearConstraintSet(constraints);
SimplexSolver linearOptimizer = new SimplexSolver();
// put everything together in order to get a maximization problem
// in the next line i receive org.apache.commons.math3.optim.linear.UnboundedSolutionException: unbounded solution
PointValuePair solution = linearOptimizer.optimize(f, constraintSet, GoalType.MAXIMIZE, nonNegativeConstraint);
if (solution != null) {
//get solution
double max = solution.getValue();
System.out.println("Opt: " + max);
}
Но каждый раз, когда вызывается linearOptimizer.optimize
, я получаю: org.apache.commons.math3.optim.linear.UnboundedSolutionException
. Документы говорят:
открытый класс UnboundedSolutionException extends MathIllegalStateException Этот класс представляет исключения, создаваемые оптимизаторами, когда решение уходит в бесконечность.
Но я решил эту проблему оптимизации с помощью графического интерфейса LPSolve, и это дает мне решение x=0; y=240; f(x,y)=9600
. Так что я предполагаю, что я делаю что-то не так.
1) Любая идея, что я делаю неправильно?
2) Я прочитал этот сообщение, которое было 4 года назад и было написано с использованием математической библиотеки Commons (не math3). Есть ли сейчас возможность сказать, что некоторые переменные решения должны быть целыми, бинарными и т.д.? В противном случае я бы запрограммировал Branch and Bound -appoach вручную, чтобы архивировать это.
Буду очень рад вашей помощи и любым идеям.
Большое спасибо :-)