Em vários outros posts sobre o módulo ortools do Google em Python, já resolvi o problema de otimização linear declarado abaixo. O problema é um problema contínuo, pois todas as variáveis de otimização são de um espaço de solução contínua.
Eu poderia pensar em um problema semelhante, mas com variáveis de otimização inteiras. Isso tornaria o problema um problema de otimização de número inteiro (com um espaço de solução discreto). Eu reafirmei o problema e adicionei uma declaração matemática indicando que todas as variáveis de otimização são inteiras:
O fluxo de trabalho para resolver esse problema com ortools em Python é muito semelhante ao apresentado em postagens anteriores.
Começo importando o pywraplp de ortools.linear_solver:
from ortools.linear_solver import pywraplp
Em seguida, crio uma instância do solver e armazeno sua referência em um manipulador de referência. Desta vez, não uso o GLOP, mas sim o solucionador CBC:
solver = pywraplp.Solver.CreateSolver('linear_programming_examples', 'CBC')
Agora tenho que declarar variáveis de otimização relevantes. Neste exemplo, as variáveis de otimização são x, y e z e, ao declará-las, defino os limites inferior e superior de acordo com a declaração do problema matemático. Além disso, declaro as variáveis de otimização como inteiros usando o construtor IntVar () em vez do construtor NumVar ():
# declara a variável x, com limite inferior 0 e sem limite superior - é um inteiro (IntVar) x = solver.IntVar(0, solver.infinity(), "x") # declara a variável y, com limite inferior 0 e não limite superior - é um inteiro (IntVar) y = solver.IntVar(0, solver.infinity(), "y") # declara a variável z, com limite inferior 0 e sem limite superior - é um inteiro (IntVar) z = solver.IntVar(0, solver.infinity(), "z")
O fluxo de trabalho agora é o mesmo da postagem mais recente contendo o problema contínuo. Eu modelo o problema adicionando a função objetivo e as restrições ao solucionador:
# declara como problema de maximização e define o 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 0x000001D4F116CFC0> >
Depois de ter concluído o modelo, agora posso resolver o problema:
solver.Solve()
0
A solução ideal para x é produzida abaixo:
print("x_opt:", x.solution_value ())
x_opt: 7.0
A solução ideal para y é produzida abaixo:
print("y_opt:", y.solution_value ())
y_opt: 0.0
A solução ideal para z é produzida abaixo:
print("z_opt:", z.solution_value ())
z_opt: 6.0
O valor ideal da função objetivo é gerado abaixo:
print("valor ideal:" + str (x.solution_value() + 2 * y.solution_value() + 3 * z.solution_value()))
valor ideal: 25,0
Como você pode ver, os valores ideais são inteiros. Você também pode ver que o valor da função objetivo ideal diminuiu, uma vez que a restrição adicional de variáveis sendo do espaço de solução discreta limita a gama de possibilidades para maximizar o objetivo. No caso contínuo, o resultado ideal foi de 26,66. Agora, o resultado ideal é 25,0.
Cientista de dados com foco em simulação, otimização e modelagem em R, SQL, VBA e Python
Leave a Reply