introduction
Écrivez un solveur pour la programmation linéaire entière .
Défi
Votre tâche consiste à écrire un solveur pour la programmation linéaire entière (ILP). En ILP, les inégalités linéaires d'un ensemble d'inconnues (qui sont toutes des entiers) sont données, et le but est de trouver le minimum ou le maximum d'une fonction linéaire.
Par exemple, pour les inégalités (exemple tiré de la programmation linéaire mixte en nombres entiers )
4x+2y-15≤0
x+2y- 8≤0
x+ y- 5≤0
- x ≤0
- y ≤0
et la fonction objectif 3x+2y
, le maximum de la fonction objectif devrait être 12
( x=2,y=3
), tandis que le minimum devrait être 0
( x=y=0
).
L'entrée est donnée sous la forme d'un tableau 2D (ou tout équivalent suivant les spécifications standard), chaque ligne correspond à une inégalité, à l'exception de la dernière ligne. Les nombres dans le tableau sont les coefficients et la ≤0
partie est toujours omise. S'il y a des n
éléments dans chaque ligne, cela signifie qu'il y a des n-1
inconnues.
La dernière ligne du tableau correspond à la fonction linéaire. Les coefficients sont répertoriés.
Par exemple, le tableau d'entrée pour le problème ci-dessus est
[[4,2,-15],[1,2,-8],[1,1,-5],[-1,0,0],[0,-1,0],[3,2,0]].
La sortie doit être le minimum et le maximum, donnés sous toute forme raisonnable.
Pour le problème suivant (deux des restrictions sont supprimées du problème ci-dessus):
[[4,2,-15],[1,2,-8],[1,1,-5],[3,2,0]].
Le maximum est encore 12
, mais le minimum n'existe pas et la fonction objectif peut avoir des valeurs négatives arbitrairement grandes (au sens de valeur absolue). Dans ce cas, le programme doit sortir 12
, suivant une valeur de falsification qui est décidée par le répondeur. Un autre cas est qu'il n'y a pas de solution du tout, par exemple,
[[4,2,-15],[-1,-2,7],[-1,0,3],[0,1,0],[3,2,0]].
Dans ce cas, les valeurs de falsification doivent également être sorties. Ce serait bien de discerner le cas où la "valeur optimale" pour la fonction objectif est l'infini et le cas où il n'y a pas du tout de solution, mais ce n'est pas nécessaire.
L'entrée ne contient que des coefficients entiers à la fois pour les inégalités et pour la fonction objectif. Toutes les inconnues sont également des nombres entiers. La matrice des coefficients des inégalités est garantie d'avoir un rang complet.
Cas de test
Nous remercions @KirillL. pour avoir trouvé un bogue dans la suite de tests d'origine et approfondi ma compréhension des problèmes 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]
Spécifications
Pas besoin de vous soucier de la gestion des exceptions.
C'est le code-golf , le plus petit nombre d'octets gagne.
Nombre d'inconnues Maximal:
9
. Nombre maximal d'inégalités:12
.Vous pouvez prendre des entrées et fournir des sorties sous n'importe quelle forme standard , et vous êtes libre de choisir le format.
Comme d'habitude, les failles par défaut s'appliquent ici.
la source
Réponses:
Python 3 , 534 octets
Essayez-le en ligne!
Présentation
Il s'agit d'un algorithme itératif, à partir de l'origo. Il recueille les positions voisines et attribue une fonction potentielle:
x:(a,b)
oùx
est la position,a
est la somme des distances de la position par rapport aux demi-espaces de chaque inégalité linéaire,b
est la valeur de l'objectif à cette position.x:(a,b) < y:(c,d)
ssia<c
oua=c and b<d
L'itération s'arrête lorsque:
la source
Matlab, 226 octets
AVERTISSEMENT : Pas une implémentation "originale", seulement pour le plaisir.
Solution simple tirant parti de la
intlinprog
fonction:Il renvoie les valeurs optimales, ou inf (-inf) si le problème est illimité ou nan s'il est irréalisable.
la source