Introducción
Escriba un solucionador para la programación lineal entera .
Reto
Su tarea es escribir un solucionador para la programación lineal de enteros (ILP). En ILP, se dan las desigualdades lineales de un conjunto de incógnitas (todas las cuales son enteras), y el objetivo es encontrar el mínimo o el máximo de una función lineal.
Por ejemplo, para las desigualdades (ejemplo tomado de la Programación lineal de enteros mixtos )
4x+2y-15≤0
x+2y- 8≤0
x+ y- 5≤0
- x ≤0
- y ≤0
y la función objetivo 3x+2y
, el máximo de la función objetivo debería ser 12
( x=2,y=3
), mientras que el mínimo debería ser 0
( x=y=0
).
La entrada se proporciona como una matriz 2D (o cualquier equivalente que siga las especificaciones estándar), cada fila corresponde a una desigualdad, con la excepción de la fila final. Los números en la matriz son los coeficientes, y la ≤0
parte siempre se omite. Si hay n
elementos en cada fila, significa que hay n-1
incógnitas.
La última fila de la matriz corresponde a la función lineal. Los coeficientes están listados.
Por ejemplo, la matriz de entrada para el problema anterior es
[[4,2,-15],[1,2,-8],[1,1,-5],[-1,0,0],[0,-1,0],[3,2,0]].
El resultado debe ser el mínimo y el máximo, dado en cualquier forma razonable.
Para el siguiente problema (dos de las restricciones se eliminan del problema anterior):
[[4,2,-15],[1,2,-8],[1,1,-5],[3,2,0]].
El máximo es todavía 12
, pero el mínimo no existe y la función objetivo puede tener valores negativos arbitrariamente grandes (en el sentido del valor absoluto). En este caso, el programa debería salir 12
, siguiendo un valor falso que es decidido por el respondedor. Otro caso es que no hay ninguna solución, por ejemplo,
[[4,2,-15],[-1,-2,7],[-1,0,3],[0,1,0],[3,2,0]].
En este caso, los valores falsos también se deben generar. Sería bueno discernir el caso donde el "valor óptimo" para la función objetivo es el infinito y el caso donde no hay soluciones, pero esto no es necesario.
La entrada solo contiene coeficientes enteros tanto para las desigualdades como para la función objetivo. Todas las incógnitas también son enteros. Se garantiza que la matriz de coeficientes de las desigualdades tiene rango completo.
Casos de prueba
Crédito a @KirillL. por encontrar un error en el conjunto de pruebas original y profundizar mi comprensión de los problemas de 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]
Especificaciones
No necesita preocuparse por el manejo de excepciones.
Este es el código de golf , gana el menor número de bytes.
Máximo número de incógnitas:
9
. Número máximo de desigualdades:12
.Puede tomar entrada y proporcionar salida a través de cualquier formulario estándar , y puede elegir el formato.
Como de costumbre, las lagunas predeterminadas se aplican aquí.
fuente
Respuestas:
Python 3 , 534 bytes
Pruébalo en línea!
Visión general
Es un algoritmo iterativo, que comienza desde el origo. Recoge las posiciones vecinas y asigna una función potencial:
x:(a,b)
dóndex
está la posición,a
es la suma de las distancias de la posición desde los medios espacios de cada desigualdad lineal,b
es el valor del objetivo en esa posición.x:(a,b) < y:(c,d)
sia<c
oa=c and b<d
La iteración se detiene cuando:
fuente
Matlab, 226 bytes
DESCARGO DE RESPONSABILIDAD : No es una implementación "original", solo por diversión.
Solución simple aprovechando la
intlinprog
función:Devuelve los valores óptimos, o inf (-inf) si el problema no tiene límites o nan si no es factible.
fuente