Я хочу решить следующую модель с помощью математики 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 -подход вручную для его архивирования.

Буду очень рад за вашу помощь и любые идеи.

Большое спасибо :-)

0
Andy 28 Май 2017 в 22:28

2 ответа

Лучший ответ

Никогда не использовал эту библиотеку, но документы говорят вам это:

public NonNegativeConstraint (логическое ограничение)

Параметры:

limited - если true, все переменные должны быть положительными.

И вы делаете с точностью до наоборот:

NonNegativeConstraint nonNegativeConstraint = new NegativeConstraint(false);

Читая документы, я сильно склоняюсь к Целочисленное программирование не поддерживается .

1
Community 20 Июн 2020 в 09:12

Вы неправильно настроили NonNegativeConstraint, вы должны передать «true» его конструктору, если хотите, чтобы x, y оба были положительными

1
Alexei Kovalev 28 Май 2017 в 20:06