정수 선형 프로그래밍


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) 이어야합니다 .

입력은 2 차원 배열 (또는 표준 사양에 준하는 동등 물)로 제공되며 각 행은 최종 행을 제외하고 하나의 불평등에 해당합니다. 배열의 숫자는 계수이며 ≤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에서 테스트 케이스를 가지고 놀았고 결과를 정확하게 재현 할 수 없었습니다. 그러나 [-inf, 12] 경우에도 정상적인 결과가 나타납니다 [0, 12]. 반면, 하한이 -inf 인 경우 [55, inf] 사례는 최소 및 최대 시나리오에서 해결되지 않습니다.
Kirill L.

예, 원래 구현을 찾고 있습니다.
Weijun Zhou

@KirillL. 테스트 케이스 [55, inf]의 함수가 55보다 작은 값을 제공하는 벡터를 제공 할 수 있습니까? 방금 온라인 솔버와 비교하여 확인한 결과가 정상인 것 같습니다. 이 테스트 사례를 만들 때 다음과 같은 추론이 있습니다. 첫 번째 제한은 모든 사용 가능한 변수의 합계가 geq 8이어야하지만 두 번째는 마지막을 제외한 모든 합계가 leq 0이 필요합니다. 처음 4 개의 무료 변수 중 하나를 줄이면 목표가 같은 값만큼 최종 변수를 증가시켜야합니다.
Weijun Zhou

누락 된 라이브러리로 인해 TIO에서 작동하지 않지만 스 니펫 은 다음과 같습니다 . 이것은 55를 제공하지만 set.bounds 줄의 주석을 해제하면 "model is unbounded"로 종료됩니다. 아마도 오류는 내 편입니다. 온라인 솔버에 대한 링크도 제공 할 수 있습니까?
Kirill L.

답변:


2

파이썬 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))

온라인으로 사용해보십시오!

개요

origo에서 시작하는 반복 알고리즘입니다. 이웃 위치를 수집하고 잠재적 인 기능을 할당합니다. x:(a,b)위치 x는 어디 a입니까, 각 선형 불평등의 반 공간에서 위치의 거리의 합은 해당 위치의 b목표 값입니다.

x:(a,b) < y:(c,d)iff 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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.