Lập trình tuyến tính Integer


21

Giới thiệu

Viết một bộ giải cho lập trình tuyến tính số nguyên .

Thử thách

Nhiệm vụ của bạn là viết một bộ giải cho lập trình tuyến tính số nguyên (ILP). Trong ILP, các bất đẳng thức tuyến tính của một tập hợp các ẩn số (tất cả đều là số nguyên) được đưa ra và mục tiêu là tìm mức tối thiểu hoặc tối đa của hàm tuyến tính.

Ví dụ: đối với các bất đẳng thức (ví dụ được lấy từ Lập trình tuyến tính số nguyên hỗn hợp )

 4x+2y-15≤0
  x+2y- 8≤0
  x+ y- 5≤0
- x      ≤0
   - y   ≤0

và hàm mục tiêu 3x+2y, mức tối đa của hàm mục tiêu phải là 12( x=2,y=3), trong khi mức tối thiểu phải là 0( x=y=0).

Đầu vào được đưa ra dưới dạng mảng 2d (hoặc bất kỳ tương đương nào theo thông số kỹ thuật tiêu chuẩn), mỗi hàng tương ứng với một bất đẳng thức, ngoại trừ hàng cuối cùng. Các số trong mảng là các hệ số và ≤0phần luôn bị bỏ qua. Nếu có ncác phần tử trong mỗi hàng, điều đó có nghĩa là có những n-1ẩn số.

Hàng cuối cùng của mảng tương ứng với hàm tuyến tính. Các hệ số được liệt kê.

Ví dụ, mảng đầu vào cho vấn đề trên là

[[4,2,-15],[1,2,-8],[1,1,-5],[-1,0,0],[0,-1,0],[3,2,0]].

Đầu ra phải là tối thiểu và tối đa, được đưa ra dưới bất kỳ hình thức hợp lý nào.

Đối với vấn đề sau (hai trong số các hạn chế được lấy ra từ vấn đề trên):

[[4,2,-15],[1,2,-8],[1,1,-5],[3,2,0]].

Tối đa vẫn còn 12, nhưng tối thiểu không tồn tại và hàm mục tiêu có thể có các giá trị âm lớn tùy ý (theo nghĩa giá trị tuyệt đối). Trong trường hợp này, chương trình sẽ xuất ra 12, theo giá trị sai lệch được quyết định bởi người trả lời. Một trường hợp khác là không có giải pháp nào cả, ví dụ,

[[4,2,-15],[-1,-2,7],[-1,0,3],[0,1,0],[3,2,0]].

Trong trường hợp này, giá trị giả cũng nên được xuất ra. Sẽ rất tốt nếu phân biệt trường hợp "giá trị tối ưu" cho hàm mục tiêu là vô cùng và trường hợp không có giải pháp nào cả, nhưng điều này là không cần thiết.

Đầu vào chỉ chứa các hệ số nguyên cho cả bất đẳng thức và hàm mục tiêu. Tất cả những điều chưa biết cũng là số nguyên. Ma trận hệ số của các bất đẳng thức được đảm bảo có thứ hạng đầy đủ.

Các trường hợp thử nghiệm

Tín dụng cho @KirillL. để tìm một lỗi trong bộ kiểm tra gốc và hiểu sâu hơn về các vấn đề 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]

Thông số kỹ thuật

  • Không cần phải lo lắng về việc xử lý ngoại lệ.

  • Đây là , số byte thấp nhất sẽ thắng.

  • Số lượng tối đa của ẩn số : 9. Số lượng bất đẳng thức tối đa : 12.

  • Bạn có thể nhận đầu vào và cung cấp đầu ra thông qua bất kỳ hình thức tiêu chuẩn nào và bạn có thể tự do chọn định dạng.

  • Như thường lệ, sơ hở mặc định áp dụng ở đây.



Bạn đã không đề cập rõ ràng đến nó trong phần mô tả nhiệm vụ, nhưng tôi nghi ngờ bạn đang tìm kiếm các triển khai ban đầu của thuật toán và không phải là một số mã nhàm chán sử dụng các thư viện hiện có? Tuy nhiên, tôi đã chơi với các trường hợp thử nghiệm của bạn trong R và không thể sao chép chính xác kết quả. Trường hợp, [55, inf] chỉ hoạt động khi các biến được giới hạn là không âm. Nhưng trường hợp [-inf, 12] cũng cho kết quả bình thường [0, 12]. Mặt khác, khi giới hạn dưới là -inf, trường hợp [55, inf] không thể giải quyết trong cả hai kịch bản tối thiểu và tối đa.
Kirill L.

Có tôi đang tìm kiếm triển khai ban đầu.
Weijun Zhou

@KirillL. Bạn có thể cung cấp một vectơ trong đó hàm trong trường hợp thử nghiệm [55, inf] cho giá trị nhỏ hơn 55 không? Tôi chỉ kiểm tra nó với một người giải quyết trực tuyến và vụ việc có vẻ ổn. Tôi có lý do sau đây khi thực hiện trường hợp thử nghiệm này: Hạn chế đầu tiên yêu cầu tổng của tất cả các biến miễn phí là geq 8, nhưng biến thứ hai yêu cầu tổng của tất cả ngoại trừ cuối cùng là leq 0. Nếu chúng ta cố gắng giảm mục tiêu bằng cách giảm bất kỳ var miễn phí đầu tiên nào, nó sẽ yêu cầu var cuối cùng được tăng thêm cùng một lượng do đó giá trị lớn hơn cho mục tiêu.
Weijun Zhou

Đây là đoạn trích của tôi , mặc dù nó không hoạt động trên TIO do thiếu thư viện. Điều này mang lại 55, nhưng thoát với "mô hình là không giới hạn" khi tôi bỏ ghi chú dòng set.bound. Mặc dù có thể, lỗi là ở phía tôi. Bạn cũng có thể cung cấp một liên kết đến người giải quyết trực tuyến?
Kirill L.

Câu trả lời:


2

Python 3 , 534 byte

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

Hãy thử trực tuyến!

Tổng quan

Nó là một thuật toán lặp, bắt đầu từ origo. Nó thu thập các vị trí lân cận và gán một chức năng tiềm năng:x:(a,b) nơi xlà vị trí, alà tổng khoảng cách của vị trí từ nửa không gian của mỗi bất bình đẳng tuyến tính, blà giá trị của mục tiêu ở vị trí đó.

x:(a,b) < y:(c,d)iff a<choặca=c and b<d

Lặp lại dừng, khi:

  • tọa độ đầu tiên của tiềm năng đã không giảm và tích cực: hệ thống là không thể
  • khoảng cách từ mỗi nửa không gian đã giảm giống như mục tiêu: hệ thống không bị ràng buộc.
  • không có gì trước đây và tiềm năng không giảm: đó là giá trị tối ưu.

1

Matlab, 226 byte

TUYÊN BỐ TỪ CHỐI : Không phải là một triển khai "ban đầu", chỉ để cho vui.

Giải pháp đơn giản tận dụng intlinprogchức năng:

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

Nó trả về các giá trị tối ưu, hoặc inf (-inf) nếu sự cố không bị chặn hoặc nan nếu không thể thực hiện được.

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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.