Optimización con restricciones en Python
Cotas y restricciones, y el atajo de la programación lineal.
import numpy as np
from scipy import optimize
# minimiza -(3x + 2y) sujeto a x + y <= 4 y x <= 3
resultado = optimize.minimize(
lambda v: -(3 * v[0] + 2 * v[1]),
x0=np.array([0.0, 0.0]),
bounds=[(0, 3), (0, None)],
constraints=[{"type": "ineq", "fun": lambda v: 4 - v[0] - v[1]}],
)
print(resultado.x.round(3), round(-resultado.fun, 3))
lineal = optimize.linprog(c=[-3, -2], A_ub=[[1, 1]], b_ub=[4],
bounds=[(0, 3), (0, None)])
print(lineal.x.round(3), round(-lineal.fun, 3), lineal.status)
Cómo funciona
boundses una lista de (low, high) por variable.- Un dict de restricción da el tipo y la función.
linproges más rápido cuando todo es lineal.
Palabras clave y builtins usados aquí
aslambdaprintround
El intento, en números
- Líneas
- 15
- Caracteres a escribir
- 492
- Tokens
- 192
- Ritmo de tres estrellas
- 110 tpm
Al ritmo de tres estrellas de 110 tokens por minuto, este intento toma unos 105 segundos.
Paso 2 de 4 en Optimización; paso 11 de 23 en Computación científica con SciPy.