Programação linear inteira com ferramentas do Google em Python

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.

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