#java #apache #solver #linear-programming #simplex
#java #apache #решатель #линейное программирование #симплекс
Вопрос:
Как задать типы переменных принятия решений, такие как двоичные, int
, double
в Apache Commons Math SimplexSolver
? Результат приведенной ниже программы выглядит следующим образом:
332.6666666666667
1.0
8331.666666666668
Я хочу, чтобы переменные решения были типа int
not double
; выходные данные должны быть 333, 0, 8325
, если они решаются как целочисленные переменные решения.
public static void testSample() throws OptimizationException {
LinearObjectiveFunction f = new LinearObjectiveFunction(new double[]{25, 15}, 0);
Collection<LinearConstraint> constraints = new ArrayList<LinearConstraint>();
constraints.add(new LinearConstraint(new double[]{5, 8}, Relationship.LEQ, 5000));
constraints.add(new LinearConstraint(new double[]{1, 4}, Relationship.LEQ, 1500));
constraints.add(new LinearConstraint(new double[]{3, 2}, Relationship.LEQ, 1000));
constraints.add(new LinearConstraint(new double[]{1, 0}, Relationship.GEQ, 1));
constraints.add(new LinearConstraint(new double[]{0, 1}, Relationship.GEQ, 1));
SimplexSolver solver = new SimplexSolver();
RealPointValuePair solution = solver.optimize(f, constraints, GoalType.MAXIMIZE, true);
System.out.println(solution.getPoint()[0]);
System.out.println(solution.getPoint()[1]);
System.out.println(solution.getValue());
}
Ответ №1:
NumberFormat
удобно для этого:
NumberFormat nf = NumberFormat.getIntegerInstance();
System.out.println(nf.format(solution.getPoint()[0]));
System.out.println(nf.format(solution.getPoint()[1]));
System.out.println(nf.format(solution.getValue()));
Консоль:
333 1 8,332
Дополнение: этот подход предполагает, что симплексный алгоритм применяется с использованием действительных чисел, а результат (ы) округляется до целого числа. Пакет, содержащий SimplexSolver
, org.apache.commons.math.optimization.linear
, не предлагает никакой другой реализации. В качестве альтернативы рассмотрите другой подход или Maxtrix<Rational>
, доступный в JScience
.
Комментарии:
1. Привет, спасибо за ответ. В вашем ответе вы просто форматируете число, которое не имеет ничего общего с оптимизацией. 333 1 8332 не является оптимизированным ответом, оптимизированное решение — 333 0 8325. Установив тип переменной решения, мы можем получить реальную оптимизацию. Есть ли кто-нибудь, кто знает, как это сделать?
2. Ах, я неправильно понял; подробнее выше. Извините, что я отредактировал ваш вопрос по ошибке.