Com a evolução das aplicações de Python para resolver problemas de programação linear e suas variações, os analistas de Supply Chain e ou Pesquisa Operacional tem acesso a inúmeros pacotes e ferramentas que suportam a tomada de decisão, baseando-se nisso vamos demonstrar a aplicação de PLI em uma indústria automotiva.
A programação linear trata da maximização (ou minimização) de uma função objetivo linear, sujeita a restrições lineares, onde todas as variáveis de decisão são contínuas. Ou seja, nenhuma variável discreta é permitida. O objetivo linear e as restrições devem consistir em expressões lineares.
Formulação programação linear
Já a programação inteira pode ser entendida como uma caso específico da programação linear, onde as variáveis devem ser inteiras (ou ao menos, parte destas variáveis).
Formulação programação inteira
Neste paragrafo, você analisará um problema de produção simples em termos de variáveis de decisão, função objetivo e restrições. Apenas para conhecimento acadêmico esse problema trata-se de alocação de recursos. Devido as caracteristicas dos output necessitarem ser variaveis inteiras torna o problema abaixo, uma variação da programação linear, conhecida como programação inteira. Todos os dados usados nesse problema são fictícios, mas podem ser adaptados para problemas reais.
Descrição do problema
Uma pequena manufatura produz dois modelos, standard e luxo, de um certo produto. Cada unidade do modelo standard exige 1 hora de lixação e 1 hora de polimento. Cada unidade do modelo luxo exige 1 hora de lixação e 4 horas de polimento. A fábrica dispõe de 2 lixadoras e 3 polidoras, cada um trabalhando 40 horas semanais. As margens de lucro são R$ 24 e R$ 34, respectivamente, para cada unidade standard e luxo. Não existem restrições de demanda para ambos os modelos. Vamos calcular a produção semanal que maximiza a margem total de lucro do fabricante. ANDRADE, E. L. Introdução à Pesquisa Operacional – métodos e modelos para análise de decisão. LTC editora. 2ª edição. 2002
Informações
Em primeiro lugar, para chegar a um modelo descritivo, consideremos as seguintes questões:
- Quais são as variáveis de decisão?
- Qual é o objetivo?
- Quais são as restrições?
Variáveis de decisão
x1 = carro standard
x2 = carro luxo
Objetivo: Maximizar o lucro
Lucro Máximo = 24 * X1 + 34 * X2
Em segundo lugar, vamos realizar a instalação dos pacotes CPLEX(solver) e DOCPLEX , para ser possível a execução do nosso modelo de programação inteira:
Importando o pacote Docplex e o Solver Cplex da IBM
!pip install cplex !pip install docplex
Além disso, após o carregamento dos pacotes precisamos criar uma instancia com o nome do modelo a ser resolvido:
from docplex.mp.model import Model # creando uma instancia com o nome: m = Model(name='carro_producao')
Esse é um ponto importante para resolução deste modelo, a declaração das variáveis deve ser feita como inteiras.
# por padrão todas as variaveis do Docplex tem limite inferior 0 e superior infinito x1 = m.integer_var(name='Standard') x2 = m.integer_var(name='Luxo')
Restrições
1 * x1 + 1 * x2 <= 80 (40h semanais 2 lixadoras)
1 * x1 + 4 * X2 <= 120 (40 h semanais * 2 polidoras)
# incluindo as restrições # restrição #1: Limite Lixadora ct_prod = m.add_constraint( 1 * x1 + 1 * x2 <= 80) # 40h semanais x 2Lixadoras # restrição #4: Limite Polidora ct_prod = m.add_constraint( 1 * x1 + 4 * x2 <= 120) # 40h semanais x 3 Polidoras
Objetivo
Sobre tudo, como dito no começo, nosso objetivo principal é maximizar o lucro, através da alocação correta dos recursos, para decidir quanto produzir de cada modelo de veículo, após rodarmos o codigo abaixo, termos informações importantes tais como, nome do modelo, quantidade de variaveis de decisão, tipo de variavel, numero de restrições e objetivo do modelo.
m.maximize(24 * x1 + 34 * x2) m.print_information()
Model: carro_producao - number of variables: 2 - binary=0, integer=2, continuous=0 - number of constraints: 2 - linear=2 - parameters: defaults - objective: maximize - problem type is: MILP
Resolução do modelo
Em conclusão, com a resolução do modelo vimos que para garantir o ganho máximo de R$2050 é necessário produzir 67 carros do modelo standard e 13 do modelo de luxo.
s = m.solve() m.print_solution()
objective: 2050 Standard=67 Luxo=13
Em trabalhos futuros, explorarei outras variações dos problemas de programação lienar buscando resolver problemas ligados ao gerenciamento da cadeia de suprimentos.
Engenheiro de Produção e Segurança do Trabalho, possui experiência em melhoria continua, estatística de processos e pesquisa operacional. Consultor nas áreas de I&CP e Supply Chain and Operations, nos segmentos de mineração, metalurgia, construção civil e financeiro.
Leave a Reply