Tamsayılı Doğrusal Programlama


21

Giriş

Tamsayılı doğrusal programlama için bir çözücü yaz .

Meydan okuma

Göreviniz tamsayılı doğrusal programlama (ILP) için bir çözücü yazmaktır. ILP'de, bilinmeyenler dizisinin (tümü tam sayı olan) doğrusal eşitsizlikleri verilir ve amaç, doğrusal bir işlevin minimum veya maksimumunu bulmaktır.

Örneğin, eşitsizlikler için ( Karışık Tamsayılı Doğrusal Programlama'dan alınan örnek )

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

ve amaç fonksiyonu 3x+2y, amaç fonksiyonunun azami değeri 12( x=2,y=3), asgari 0( x=y=0) olmalıdır .

Girdi, 2d dizisi (veya standart özellikleri takip eden herhangi bir eşdeğer) olarak verilir; her satır, son satır hariç, bir eşitsizliğe karşılık gelir. Dizideki sayılar katsayılardır ve ≤0kısım daima ihmal edilir. Varsa nher satırda elemanları, orada demektir n-1bilinmeyenler.

Dizinin son satırı doğrusal fonksiyona karşılık gelir. Katsayılar listelenir.

Örneğin, yukarıdaki sorunun giriş dizisi

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

Çıktı, makul herhangi bir biçimde verilen minimum ve maksimum olmalıdır.

Aşağıdaki problem için (kısıtlamalardan iki tanesi yukarıdaki problemden uzaklaştırılmıştır):

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

Maksimum değer hala var 12, ancak minimum mevcut değil ve amaç işlevi keyfi (mutlak değer anlamında) negatif değerlere sahip olabilir. Bu durumda, programın 12cevaplayıcı tarafından karar verilen sahte bir değeri takiben çıktı vermesi gerekir . Başka bir örnek ise, örneğin hiçbir çözüm bulunmamasıdır.

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

Bu durumda, sahte değerler de verilmelidir. Amaç işlevi için "optimal değer" in sonsuzluk olduğu durumunun ve çözüm bulunmadığı durumun anlaşılması iyi olur, ancak bu gerekli değildir.

Girdi yalnızca hem eşitsizlikler hem de amaç işlevi için tamsayı katsayıları içerir. Tüm bilinmeyenler de tam sayıdır. Eşitsizliklerin katsayısı matrisinin tam dereceye sahip olması garanti edilir.

Test Kılıfları

@KirillL'e teşekkür ederiz. Orijinal test setinde bir hata bulmak ve ILP sorunlarını anlamamı derinleştirmek için.

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]

gözlük

  • İstisna işleme konusunda endişelenmenize gerek yok.

  • Bu , en düşük bayt sayısı kazanır.

  • Bilinmeyenlerin Maksimal sayısı: 9. Eşitsizliklerin Maksimal sayısı: 12.

  • Herhangi bir standart form aracılığıyla girdi alabilir ve çıktı alabilirsiniz ve formatı seçmekte özgürsünüz.

  • Her zamanki gibi burada varsayılan boşluklar geçerlidir.



Görev tanımında açıkça belirtmediniz, ancak algoritmanın orijinal uygulamalarını aradığınızdan şüpheleniyorum, mevcut kütüphaneleri kullanan bazı sıkıcı kodlar değil mi? Yine de, R'deki test durumlarınızla oynamıştım ve sonuçları tam olarak çoğaltamadım.Eg, [55, inf] durumu yalnızca değişkenler negatif olma zorunluluğu olduğunda işe yarar. Fakat sonra [-inf, 12] durumu da normal sonuçlar doğurur [0, 12]. Öte yandan, alt sınır -inf olduğunda [55, inf] durumu hem minimum hem de maksimum senaryolarda çözülememektedir.
Kirill L.

Evet orijinal uygulamaları arıyorum.
Weijun Zhou

@KirillL. Test durumundaki fonksiyonun [55, inf] 55'ten küçük bir değer verdiği bir vektör verebilir misiniz? Çevrimiçi bir çözücüye karşı kontrol ettim ve durum iyi görünüyor. Bu test vakasını yaparken aşağıdaki akıl yürütmelere sahibim: İlk kısıtlama, tüm serbest değişkenlerin toplamının geq 8 olmasını gerektirir, ikincisi ise, son serbest bırakma sıfırı olan son hariç tümlerin toplamını gerektirir. Hedef, ilk 4 serbest değişkenden herhangi birini azaltarak, nihai değişkenin aynı miktarda arttırılmasını ve dolayısıyla hedef için daha büyük bir değer olmasını gerektirecektir.
Weijun Zhou

İşte snippet'im , eksik kütüphaneden dolayı TIO'da çalışmaz. Bu 55 verir, ancak set.bounds satırını açmadan "model sınırsız" ile çıkar. Oldukça muhtemel, hata olsa benim tarafımda. Online çözücüye bir link verebilir misiniz?
Kirill L.

Yanıtlar:


2

Python 3 , 534 bayt

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

Çevrimiçi deneyin!

genel bakış

Origodan başlayarak yinelemeli bir algoritmadır. Komşu pozisyonları toplar ve potansiyel bir fonksiyon atar: pozisyon x:(a,b)nerede x, pozisyonun aher doğrusal eşitsizliğin yarı boşluklarından uzaklığının toplamıdır, pozisyondaki bamacın değeridir.

x:(a,b) < y:(c,d)iff a<cveyaa=c and b<d

Yineleme ne zaman durur:

  • Potansiyelin ilk koordinatı düşmedi ve olumlu değildi: sistem mümkün değil
  • her yarım alandan uzaklık, tıpkı amaç gibi azalmıştır: sistem sınırsızdır.
  • önceki hiçbiri ve potansiyel düşmedi: en uygun değer bu.

1

Matlab, 226 bayt

YASAL UYARI : "Orijinal" bir uygulama değil, sadece eğlence için.

İşlevden yararlanan basit çözüm 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

Sorunun sınırsız olması durumunda en uygun değerleri, eğer mümkün değilse nan (nf) döndürür.

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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.