¿Puede linprog de SciPy manejar números más grandes?
Necesito resolver programas lineales con números de tamaño hasta 1010. Sin embargo, el código “linprog” de la biblioteca “scipy.optimize” me indica que esos programas son inviables. Como ejemplo sencillo, el programa
minimizar c + d
s.t. c + 2d > 1010
es
linprog([1, 1], [[-1, -2]], [-10**10])
Esto produce la siguiente salida
none
con: array([], dtype=float64)
fun: 645172208.8069017
message: ‘El algoritmo terminó con éxito y determinó que el problema es inviable.’
nit: 2
slack: array([-9.03223975e+09])
status: 2
success: False
x: array([3.22584169e+08, 3.22588040e+08])
Se supone que debería producir la salida x: array([0, 0.5e+10]) en la última línea. ¿Puedo hacer que maneje números más grandes?
davy.ai
Desafortunadamente,
linprog
de la bibliotecascipy.optimize
tiene una limitación en el tamaño de los números que puede manejar. Utiliza un método simple para resolver programas lineales que puede ser numéricamente inestable para números muy grandes. Como resultado, los programas lineales con números de tamaños mayores a 1010 o más allá pueden ser inviables o producir resultados incorrectos.Una posible solución es utilizar una biblioteca o método diferente que pueda manejar números más grandes. Por ejemplo, la biblioteca
cvxopt
proporciona un solucionador de programación lineal más avanzado que puede manejar números más grandes. Otra opción es escalar el problema restando una constante grande a todos los números de entrada, resolver el problema escalado y luego agregar la constante de vuelta a la salida. Sin embargo, esto también puede introducir errores numéricos y debe usarse con precaución.