Otimização linear contínua em PuLP (Python)

Em um post anterior demonstrei como resolver um problema de otimização linear em Python, usando SciPy.optimize com a função linprog. Neste post eu quero fornecer um exemplo de codificação em Python, usando o módulo PuLP para resolver o problema abaixo:

Este problema é linear e pode ser resolvido usando Pulp em Python . A sintaxe de modelagem é bem diferente de SciPy.optimize , como você pode ver no exemplo de codificação abaixo:

# importando PuLP (pode ser instalado com pip install, por exemplo, no prompt do anaconda)
import pulp

# use a função LpProblem para inicializar uma declaração do nosso problema de otimização linear
linearProblem = pulp.LpProblem("some title",pulp.LpMaximize) # we maximize, and thus use LpMaximize as parameter

# usando as variáveis ​​de otimização do módulo PuLP devem ser declaradas com a função LpVariable
x1 = pulp.LpVariable("x1",lowBound = 0) # x1 has only lower bound, no upper bound
x2 = pulp.LpVariable("x2",lowBound = 0) # x2 has only lower bound, no upper bound

# usando o operador += podemos adicionar a função objetivo ao problema declarado
linearProblem += 2*x1 + 3*x2 

# mesma abordagem é válida para adicionar restrições
linearProblem += x1 + x2 <= 10
linearProblem += 2*x1 + x2 <= 15

# podemos revisar nosso problema agora
linearProblem
some_title:
MAXIMIZE
2*x1 + 3*x2 + 0
SUBJECT TO
_C1: x1 + x2 <= 10

_C2: 2 x1 + x2 <= 15

VARIABLES
x1 Continuous
x2 Continuous

Como podemos ver, a função objetivo é 2 X1 + 3 X2, conforme documentado na declaração do problema matemático inicial em sintaxe escalar. As restrições são marcadas com _C1 e _C2. Eles também são consistentes com a declaração do problema matemático no início deste post. Além disso, é correto que X1 e X2 sejam variáveis ​​de otimização contínuas e não discretas.

Agora podemos resolver o problema, usando Pulp em Python :

# resolve o problema, usando o solver PuLP padrão para problemas de otimização linear contínua
solution = linearProblem.solve()

# veja se a execução da otimização foi bem sucedida, usando LpStatus do módulo PuLP
pulp.LpStatus[solution]
'Optimal'

The solution is optimal. Let us see the optimal objective function value:

# o valor ótimo da função objetivo é acessado com a função valor da seguinte maneira
pulp.value(linearProblem.objective)
30.0
# a solução ótima para x1 também é acessada com a função value (mas já temos x1 como manipulador)
pulp.value(x1)
0.0
# por último, abaixo mostro a solução ideal para x2
pulp.value(x2)
10.0

No meu blog você também pode encontrar posts demonstrando programação linear em R, usando lpSolve e FuzzyLP (ex. com crispLP ou FCLP.sampledBeta ). Além disso, forneci exemplos de otimização quadrática com quadprog em R e cvxopt em Python. Por fim, resolvi problemas de otimização não linear com gradiente descendente em R , usando o pacote nloptr .

Leave a Reply

Deixe um comentário

O seu endereço de e-mail não será publicado.

Esse site utiliza o Akismet para reduzir spam. Aprenda como seus dados de comentários são processados.

Close

Meta