pengantar
Tulis sebuah solver untuk pemrograman linear integer .
Tantangan
Tugas Anda adalah menulis solver untuk integer linear programming (ILP). Dalam ILP, ketidaksetaraan linear dari set yang tidak diketahui (semuanya adalah bilangan bulat) diberikan, dan tujuannya adalah untuk menemukan minimum atau maksimum dari fungsi linear.
Misalnya, untuk ketidaksetaraan (contoh diambil dari Mixed Integer Linear Programming )
4x+2y-15≤0
x+2y- 8≤0
x+ y- 5≤0
- x ≤0
- y ≤0
dan fungsi objektif 3x+2y
, fungsi objektif maksimum harus 12
( x=2,y=3
), sedangkan minimum harus 0
( x=y=0
).
Input diberikan sebagai array 2d (atau yang setara mengikuti spesifikasi standar), setiap baris sesuai dengan satu ketidaksetaraan, dengan pengecualian dari baris terakhir. Angka dalam array adalah koefisien, dan ≤0
bagian tersebut selalu dihilangkan. Jika ada n
elemen di setiap baris, itu berarti ada yang n-1
tidak diketahui.
Baris terakhir dari array berhubungan dengan fungsi linear. Koefisien terdaftar.
Misalnya, array input untuk masalah di atas adalah
[[4,2,-15],[1,2,-8],[1,1,-5],[-1,0,0],[0,-1,0],[3,2,0]].
Outputnya harus minimum dan maksimum, diberikan dalam bentuk apa pun yang wajar.
Untuk masalah berikut (dua batasan diambil dari masalah di atas):
[[4,2,-15],[1,2,-8],[1,1,-5],[3,2,0]].
Maksimum masih 12
, tetapi minimum tidak ada dan fungsi objektif dapat memiliki nilai negatif yang besar (dalam arti nilai absolut). Dalam hal ini, program harus menampilkan 12
, mengikuti nilai palsu yang diputuskan oleh penjawab. Kasus lain adalah bahwa tidak ada solusi sama sekali, misalnya,
[[4,2,-15],[-1,-2,7],[-1,0,3],[0,1,0],[3,2,0]].
Dalam hal ini, nilai-nilai palsu juga harus menjadi output. Akan lebih baik untuk membedakan kasus di mana "nilai optimal" untuk fungsi objektif adalah tak terbatas dan kasus di mana tidak ada solusi sama sekali, tetapi ini tidak perlu.
Input hanya berisi koefisien integer baik untuk ketidaksetaraan dan untuk fungsi tujuan. Semua yang tidak diketahui juga bilangan bulat. Matriks koefisien dari ketidaksetaraan dijamin memiliki peringkat penuh.
Uji Kasus
Kredit ke @ KirillL. untuk menemukan bug di test suite asli dan memperdalam pemahaman saya tentang masalah 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]
Spesifikasi
Tidak perlu khawatir tentang penanganan pengecualian.
Ini adalah kode-golf , jumlah byte terendah yang menang.
Jumlah maksimal yang tidak diketahui:
9
. Jumlah maksimal ketidaksetaraan:12
.Anda dapat mengambil input dan memberikan output melalui formulir standar apa pun , dan Anda bebas memilih format.
Seperti biasa, celah default berlaku di sini.
sumber
Jawaban:
Python 3 , 534 byte
Cobalah online!
Ikhtisar
Ini adalah algoritma berulang, mulai dari yang asli. Ini mengumpulkan posisi tetangga dan menetapkan fungsi potensial: di
x:(a,b)
manax
posisi,a
adalah jumlah jarak posisi dari setengah ruang dari setiap ketidaksetaraan linear,b
adalah nilai dari tujuan pada posisi itu.x:(a,b) < y:(c,d)
iffa<c
ataua=c and b<d
Iterasi berhenti, ketika:
sumber
Matlab, 226 byte
PENOLAKAN : Bukan implementasi "asli", hanya untuk bersenang-senang.
Solusi sederhana memanfaatkan
intlinprog
fungsi:Ini mengembalikan nilai-nilai optimal, atau inf (-inf) jika masalahnya tidak terikat atau nan jika tidak layak.
sumber