Codificação enxuta de modelos simples de otimização linear ou ferramentas em Python

Em um post anterior no módulo ortools do Google em Python resolvi o problema de otimização linear indicado abaixo:

O código escrito no meu post anterior pode ser reduzido a menos linhas de código, resultando em código enxuto. Neste post vou compartilhar uma versão mais enxuta do meu script ortools anterior.

Novamente, começo importando pywraplp de ortools.linear_solver:

from ortools.linear_solver import pywraplp

Em seguida, crio uma instância de solucionador (usando o solucionador GLOP) e armazeno sua referência em um manipulador de referência:

solver = pywraplp.Solver.CreateSolver('linear_programming_examples', 'GLOP')

Agora tenho que declarar variáveis ​​de otimização relevantes. Neste exemplo, as variáveis ​​de otimização são x, y e z:

x = solver.NumVar(0, solver.infinity(), "x")

y = solver.NumVar(0, solver.infinity(), "y")

z = solver.NumVar(0, solver.infinity(), "z")

Agora posso modelar o problema especificando as funções objetivo e todas as restrições relevantes. Nas linhas de código a seguir isso é realizado de uma maneira muito enxuta:

solver.Maximize(x+2*y+3*z)

solver.Add(2*x+y+z <= 20)
solver.Add(x+y+z <= 15)
solver.Add(x-y-z >= 0)
<ortools.linear_solver.pywraplp.Constraint; proxy of <Swig Object of type 'operations_research::MPConstraint *' at 0x000001B9AEC956C0> >

O modelo agora está completo e pode ser resolvido:

solver.Solve()

A solução ótima para x é exibida abaixo:

print("x_opt: ", x.solution_value())
x_opt: 6.666666666666667

A solução ótima para y é apresentada abaixo:

print("y_opt: ", y.solution_value())
y_opt: 0,0

A solução ótima para z é apresentada abaixo:

print("z_opt: ", z.solution_value())
z_opt: 6.666666666666667

O valor ótimo da função objetivo é gerado abaixo:

print("valor ideal: " + str(x.solution_value()+2*y.solution_value()+3*z.solution_value()))
valor ideal: 26,666666666666668

You May Also Like

Leave a Reply

Leave a Reply

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

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