Цілісне лінійне програмування


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).

Вхід подається у вигляді 2d масиву (або будь-якого еквівалента, що відповідає стандартним специфікаціям), кожен рядок відповідає одній нерівності, за винятком кінцевого рядка. Числа в масиві є коефіцієнтами, а ≤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] випадок працює лише тоді, коли змінні обмежуються негативними. Але тоді [-inf, 12] випадок також дає нормальні результати [0, 12]. З іншого боку, коли нижня межа є -inf, випадок [55, inf] не вдається вирішити як в min, так і в max сценаріях.
Кирило Л.

Так, я шукаю оригінальні реалізації.
Вейджун Чжоу

@KirillL. Чи можете ви надати вектор, де функція в тестовому випадку [55, inf] дає значення, менше 55? Я щойно перевірив це в Інтернеті, і справа, здається, добре. Я маю наступні міркування при складанні цього тестового випадку: Перше обмеження вимагає, щоб сума всіх вільних змінних становила geq 8, але для другого потрібна сума всіх, крім останньої, що буде leq 0. Якщо ми коли-небудь намагатимемося зменшити мета за рахунок зменшення будь-якого з перших чотирьох вільних вар, знадобиться збільшити остаточну вару на стільки ж, отже, і більше значення для мети.
Вейджун Чжоу

Ось мій фрагмент , хоча він не працюватиме в 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)iff a<cабоa=c and b<d

Ітерація припиняється, коли:

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

1

Матлаб, 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.