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 .
Cientista de dados com foco em simulação, otimização e modelagem em R, SQL, VBA e Python
Leave a Reply