Целочисленное линейное программирование


21

Вступление

Напишите решатель для целочисленного линейного программирования .

Вызов

Ваша задача - написать решатель для целочисленного линейного программирования (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.

  • Вы можете принять ввод и предоставить вывод через любую стандартную форму , и вы можете выбрать формат.

  • Как обычно, здесь применяются лазейки по умолчанию .



Вы явно не упомянули об этом в описании задачи, но я подозреваю, что вы ищете оригинальные реализации алгоритма, а не какой-то скучный код, который использует существующие библиотеки? Тем не менее, я играл с вашими тестами в R и не смог точно воспроизвести результаты. Например, [55, inf] case работает только тогда, когда переменные ограничены, чтобы быть неотрицательными. Но тогда случай [-inf, 12] также дает нормальные результаты [0, 12]. С другой стороны, когда нижняя граница равна -inf, случай [55, inf] не может быть решен как в минимальном, так и в максимальном сценариях.
Кирилл Л.

Да, я ищу оригинальные реализации.
Вейцзюнь Чжоу

@KirillL. Можете ли вы указать вектор, в котором функция в тестовом примере [55, inf] дает значение меньше 55? Я только что проверил это с помощью онлайн решателя, и дело, кажется, в порядке. У меня есть следующие соображения при создании этого теста: первое ограничение требует, чтобы сумма всех свободных переменных была равна geq 8, а второе требует, чтобы сумма всех значений, кроме последней, была равна leq 0. Если мы когда-нибудь попытаемся уменьшить Цель, уменьшив любой из первых 4-х свободных переменных, потребует увеличения конечной переменной на ту же величину, следовательно, большее значение для цели.
Вейцзюнь Чжоу

Вот мой фрагмент , хотя он не будет работать на TIO из-за отсутствия библиотеки. Это дает 55, но выходит с «модель неограничена», когда я раскомментирую строку set.bounds. Вполне возможно, что ошибка на моей стороне, хотя. Не могли бы вы также дать ссылку на онлайн-решатель?
Кирилл Л.

Ответы:


2

Python 3 , 534 байта

import itertools as t
import operator as o
I=float("inf")
e=lambda p,A:sum([i[0]*i[1]for i in zip(p,A[:-1])])+A[-1]
def w(x,j):
	d=len(x[0])-1;C=[0]*d;v,w=I,I
	while 1:
		L={(*n,):(sum([0 if e(n,A)<=0 else e(n,A)for A in x[:-1]]),j*e(n,x[-1]))for n in [[sum(a) for a in zip(C,c)]for c in t.product(*[[-1,0,1]]*d)]};C,P=min(L.items(),key=o.itemgetter(1))[0],C;v,w,p,q=L[C][0],L[C][1],v,w
		if(all([e(C,A)<=e(P,A)for A in x[:-1]]))*(j*(e(C,x[-1])-e(P,x[-1]))<0)+(p==v>0):return I
		if(p==v)*(q<=w):return j*q
f=lambda x:(w(x,1),w(x,-1))

Попробуйте онлайн!

обзор

Это итеративный алгоритм, начиная с оригинального. Он собирает соседние позиции и назначает потенциальную функцию: x:(a,b)где xпозиция, aсумма сумм расстояний позиции от полупространств каждого линейного неравенства, bэто значение цели в этой позиции.

x:(a,b) < y:(c,d)если a<cилиa=c and b<d

Итерация останавливается, когда:

  • первая координата потенциала не уменьшилась и не стала положительной: система неосуществима
  • расстояние от каждого полупространства уменьшилось так же, как цель: система не ограничена.
  • ничего из предыдущего и потенциал не уменьшился: это оптимальное значение.

1

Matlab, 226 байт

ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ : Не «оригинальная» реализация, только для удовольствия.

Простое решение с использованием intlinprogфункции:

function r=f(a);b=-1*a(1:end-1,end);p=a(end,1:end-1);c=a(1:end-1,1:end-1);[~,f,h]=intlinprog(p,1:size(a,2)-1,c,b);[~,g,i]=intlinprog(-p,1:size(a,2)-1,c,b);s=[inf,nan,f];t=[inf,nan,g];r=a(end,end)+[s(4-abs(h)) -t(4-abs(i))];end

Он возвращает оптимальные значения или inf (-inf), если проблема не ограничена, или nan, если это невозможно.

a = [4 2 -15; 1 2 -8; 1 1 -5; -1 0 0; 0 -1 0; 3 2 1]
b = [4 2 -15; 1 2 -8; 1 1 -5; 3 2 0]
c = [4 2 -15; -1 -2 7; -1 0 3; 0 1 0; 3 2 0]
d = [-1 -1 -1 -1 -1 8;  1 1 1 1 0 0; 0 0 0 0 0 4]
e = [4 2 -15; -1 -2 7; -1 0 3; 0 1 0; 0 0 4]

>> f(a)
ans =

     1    13

>> f(b)
ans =

   Inf    12

>> f(c)
ans =

   NaN   NaN

>> f(d)
ans =

     4     4

>> f(e)
ans =

   NaN   NaN
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.