introduzione
Scrivi un solutore per la programmazione lineare intera .
Sfida
Il tuo compito è scrivere un risolutore per la programmazione lineare intera (ILP). Nell'ILP vengono fornite le disuguaglianze lineari di un insieme di incognite (che sono tutti numeri interi) e l'obiettivo è trovare il minimo o il massimo di una funzione lineare.
Ad esempio, per le disuguaglianze (esempio tratto dalla Programmazione lineare di numeri interi misti )
4x+2y-15≤0
x+2y- 8≤0
x+ y- 5≤0
- x ≤0
- y ≤0
e la funzione obiettivo 3x+2y
, il massimo della funzione obiettivo dovrebbe essere 12
( x=2,y=3
), mentre il minimo dovrebbe essere 0
( x=y=0
).
L'input è dato come un array 2d (o qualsiasi equivalente secondo le specifiche standard), ogni riga corrisponde a una disuguaglianza, ad eccezione dell'ultima riga. I numeri nella matrice sono i coefficienti e la ≤0
parte viene sempre omessa. Se ci sono n
elementi in ogni riga, significa che ci sono n-1
incognite.
L'ultima riga dell'array corrisponde alla funzione lineare. I coefficienti sono elencati.
Ad esempio, l'array di input per il problema sopra è
[[4,2,-15],[1,2,-8],[1,1,-5],[-1,0,0],[0,-1,0],[3,2,0]].
L'output dovrebbe essere il minimo e il massimo, dato in qualsiasi forma ragionevole.
Per il seguente problema (due delle restrizioni sono state rimosse dal problema precedente):
[[4,2,-15],[1,2,-8],[1,1,-5],[3,2,0]].
Il massimo è ancora 12
, ma il minimo non esiste e la funzione obiettivo può avere valori negativi arbitrariamente grandi (nel senso del valore assoluto). In questo caso, il programma dovrebbe essere emesso 12
, seguendo un valore errato che viene deciso dal risponditore. Un altro caso è che non esiste alcuna soluzione, ad esempio,
[[4,2,-15],[-1,-2,7],[-1,0,3],[0,1,0],[3,2,0]].
In questo caso, dovrebbero essere emessi anche valori falsi. Sarebbe bello discernere il caso in cui il "valore ottimale" per la funzione obiettivo è l'infinito e il caso in cui non esistono soluzioni, ma ciò non è necessario.
L'input contiene solo coefficienti interi sia per le disuguaglianze sia per la funzione obiettivo. Tutte le incognite sono anche numeri interi. La matrice dei coefficienti delle disuguaglianze è garantita per avere il grado completo.
Casi test
Ringraziamo @KirillL. per trovare un bug nella suite di test originale e approfondire la mia comprensione dei problemi 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]
Specifiche
Non è necessario preoccuparsi della gestione delle eccezioni.
Questo è code-golf , vince il numero più basso di byte.
Numero massimo di incognite:
9
. Numero massimo di disuguaglianze:12
.Puoi prendere input e fornire output attraverso qualsiasi modulo standard e sei libero di scegliere il formato.
Come al solito, qui si applicano scappatoie predefinite .