typestar

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

  1. bounds es una lista de (low, high) por variable.
  2. Un dict de restricción da el tipo y la función.
  3. linprog es más rápido cuando todo es lineal.

Palabras clave y builtins usados aquí

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.

Escribe este fragmento

Paso 2 de 4 en Optimización; paso 11 de 23 en Computación científica con SciPy.

← Anterior Siguiente →