Вступление
Напишите решатель для целочисленного линейного программирования .
Вызов
Ваша задача - написать решатель для целочисленного линейного программирования (ILP). В ILP даны линейные неравенства для набора неизвестных (все из которых являются целыми числами), и цель состоит в том, чтобы найти минимум или максимум линейной функции.
Например, для неравенств (пример взят из смешанного целочисленного линейного программирования )
4x+2y-15≤0
x+2y- 8≤0
x+ y- 5≤0
- x ≤0
- y ≤0
и целевая функция 3x+2y
, максимум целевой функции должен быть 12
( x=2,y=3
), а минимум должен быть 0
( x=y=0
).
Входные данные задаются в виде двумерного массива (или любого другого аналога, соответствующего стандартным спецификациям), каждая строка соответствует одному неравенству, за исключением последней строки. Числа в массиве являются коэффициентами, а ≤0
часть всегда опускается. Если n
в каждой строке есть элементы, значит, есть n-1
неизвестные.
Последняя строка массива соответствует линейной функции. Коэффициенты указаны.
Например, входной массив для указанной выше проблемы
[[4,2,-15],[1,2,-8],[1,1,-5],[-1,0,0],[0,-1,0],[3,2,0]].
Вывод должен быть минимальным и максимальным, заданным в любой разумной форме.
Для следующей задачи (два ограничения сняты с задачи выше):
[[4,2,-15],[1,2,-8],[1,1,-5],[3,2,0]].
Максимум остается 12
, но минимум не существует, и целевая функция может иметь произвольно большие (в смысле абсолютной величины) отрицательные значения. В этом случае программа должна выводить данные 12
, следуя ложному значению, которое определил ответчик. Другой случай, что нет решения вообще, например,
[[4,2,-15],[-1,-2,7],[-1,0,3],[0,1,0],[3,2,0]].
В этом случае также должны быть выведены ложные значения. Было бы хорошо разглядеть случай, когда «оптимальным значением» для целевой функции является бесконечность, и случай, когда вообще нет решений, но это необязательно.
Вход содержит только целочисленные коэффициенты как для неравенств, так и для целевой функции. Все неизвестные также являются целыми числами. Матрица коэффициентов неравенств гарантированно имеет полный ранг.
Тестовые случаи
Кредит @KirillL. за нахождение ошибки в исходном тестовом наборе и углубление моего понимания проблем ILP.
Input
Output
[[4,2,-15],[1,2,-8],[1,1,-5],[-1,0,0],[0,-1,0],[3,2,1]]
[1,13]
[[4,2,-15],[1,2,-8],[1,1,-5],[3,2,0]]
[-inf, 12]
[[4,2,-15],[-1,-2,7],[-1,0,3],[0,1,0],[3,2,0]]
[NaN, NaN]
[[-1,-1,-1,-1,-1,8],[1,1,1,1,0,0],[5,5,5,5,6,7]]
[55, inf]
[[-1,-1,-1,-1,-1,8],[1,1,1,1,0,0],[0,0,0,0,0,4]]
[4, 4]
[[4,2,-15],[-1,-2,7],[-1,0,3],[0,1,0],[0,0,4]]
[NaN, NaN]
Спекуляции
Не нужно беспокоиться об обработке исключений.
Это код-гольф , выигрывает наименьшее количество байтов.
Максимальное число неизвестных:
9
. Максимальное число неравенств:12
.Вы можете принять ввод и предоставить вывод через любую стандартную форму , и вы можете выбрать формат.
Как обычно, здесь применяются лазейки по умолчанию .