Você está na página 1de 32

Aula 04: Modelagem e Python-MIP

Otimização Linear e Inteira

Túlio A. M. Toffolo
http://www.toffolo.com.br

BCC464/PCC174 – 2018/2
Departamento de Computação – UFOP
Previously...

Aulas anteriores:

Breve histórico
Exemplos básicos de Modelagem
Método gráfico e definições

2 / 30 Túlio Toffolo – Otimização Linear e Inteira – Aula 04: Modelagem e Python-MIP


Aula de hoje

1 Dicas de modelagem

2 Exemplo 1: Fábrica de brinquedos

3 Exemplo 2: Transporte

4 Aula prática

5 Exercícios

3 / 30 Túlio Toffolo – Otimização Linear e Inteira – Aula 04: Modelagem e Python-MIP


Aula de hoje

1 Dicas de modelagem

2 Exemplo 1: Fábrica de brinquedos

3 Exemplo 2: Transporte

4 Aula prática

5 Exercícios

3 / 30 Túlio Toffolo – Otimização Linear e Inteira – Aula 04: Modelagem e Python-MIP


Passo-a-passo para modelar um problema:

1 Elabore um esquema do problema.

2 Encontre e escreva uma solução qualquer para o problema.

3 Olhando para a solução, defina as variáveis de decisão.

4 Observando as variáveis de decisão, defina a função objetivo, ou


seja, o que deve ser maximizado ou minimizado.

5 Finalmente, defina as restrições do problema.

4 / 30 Túlio Toffolo – Otimização Linear e Inteira – Aula 04: Modelagem e Python-MIP


Aula de hoje

1 Dicas de modelagem

2 Exemplo 1: Fábrica de brinquedos

3 Exemplo 2: Transporte

4 Aula prática

5 Exercícios

5 / 30 Túlio Toffolo – Otimização Linear e Inteira – Aula 04: Modelagem e Python-MIP


Exemplo 1: Fábrica de brinquedos

Fonte: [1] Luís Herique Rodrigues et al. (2014), Pesquisa Operacional -


Programação Linear Passo a Passo, Editora Unisinos.

Uma pequena oficina de brinquedos produz dois tipos de brinquedos: caminhão


de madeira e boneca de pano. O lucro do caminhão é de R$ 10,00 por unidade e
da boneca de pano é de R$ 8,00 por unidade. São necessárias seis pessoas
para fazer um lote de dez caminhões por dia e quatro pessoas para fazer um lote
de 14 bonecas por dia. Há 18 pessoas disponíveis para produzir os itens,
podendo ser alocadas em qualquer um dos dois, em qualquer etapa. Devido à
demanda existente é necessário fazer ao menos um lote de caminhões e um lote
de bonecas por dia.

Formule um modelo de Programação Linear que maximize a lucratividade diária.

6 / 30 Túlio Toffolo – Otimização Linear e Inteira – Aula 04: Modelagem e Python-MIP


Passo 1: Esquema
Lucro: R$ 100,00 por lote (10 caminhões) Lucro: R$ 112,00 por
lote (14 bonecas)

Figura 3 – Esquema simplificado do problema 1 – Oficina de brinquedos.


Figura: Esquema (imagem extraída de Rodrigues et. al [1])
Nessa Figura é possível observar que, conforme tomamos a decisão de fazer mais
ou menos
7 / 30
lotes de caminhões ou bonecas, precisaremos alocar mais ou menos pessoas
Túlio Toffolo – Otimização Linear e Inteira – Aula 04: Modelagem e Python-MIP
Passo 2: Solução

Qual seria uma solução para o problema?

Produzir 1 lote de caminhões e 1 lote de bonecas?


Utilizaríamos neste caso 10 pessoas (6 + 4)
Lucraríamos R$ 212,00 (R$ 100,00 + R$ 112,00)
Solução parece ok... não utilizamos mais de 18 pessoas e
atendemos à demanda mínima de fazer ao menos um lote de
caminhões e um lote de bonecas.
Solução viável!

8 / 30 Túlio Toffolo – Otimização Linear e Inteira – Aula 04: Modelagem e Python-MIP


Passo 3: Variáveis

Solução: 1 lote de caminhões e 1 lote de bonecas!

Qual decisão foi tomada?

Número de lotes de caminhões: x1


Número de lotes de bonecas: x2

9 / 30 Túlio Toffolo – Otimização Linear e Inteira – Aula 04: Modelagem e Python-MIP


Passo 4: Função objetivo

O que estamos minimizando/maximizando?

Maximizando o lucro!
Ou seja: max 100x1 + 112x2

10 / 30 Túlio Toffolo – Otimização Linear e Inteira – Aula 04: Modelagem e Python-MIP


Passo 5: Restrições

Quais são as restrições?


1 Há 18 pessoas disponíveis:
6x1 + 4x2 ≤ 18
2 Devemos produzir no mínimo 1 lote de caminhões:
x1 ≥ 1
3 Devemos produzir no mínimo 1 lote de bonecas:
x2 ≥ 1

11 / 30 Túlio Toffolo – Otimização Linear e Inteira – Aula 04: Modelagem e Python-MIP


Modelo

Logo, devemos resolver o modelo de programação linear a seguir:

max 100x1 + 112x2


s.a. 6x1 + 4x2 ≤ 18
x1 ≥ 1
x2 ≥ 1

12 / 30 Túlio Toffolo – Otimização Linear e Inteira – Aula 04: Modelagem e Python-MIP


Modelo x2

Método12gráfico
11
O modelo
10
pode ser facilmente resolvido pelo método gráfico:
Logo, devemos resolver o modelo de programação linear a seguir:
9
x2
8
max 100x1 + 112x2
127
s.a. 6x1 + 4x2  18
116
x1 1
105
x2 1
94
83
72
61
5 x1 x1
2 3 4 51 6 17 28 39 10
4 11
5 12
6 7 8 9 10 11 12
12 / 23 Túlio Toffolo
4 – Otimização Linear e Inteira – Aula 04: Modelagem e Python-MIP
1
3
2
13 / 30 Túlio Toffolo – Otimização Linear e Inteira – Aula 04: Modelagem e Python-MIP
Aula de hoje

1 Dicas de modelagem

2 Exemplo 1: Fábrica de brinquedos

3 Exemplo 2: Transporte

4 Aula prática

5 Exercícios

14 / 30 Túlio Toffolo – Otimização Linear e Inteira – Aula 04: Modelagem e Python-MIP


Exemplo 2:o Transporte
Onde custo é: custo de transporte da fábrica i para o mercado j multiplicado
pela quantidade de unidades de produto produzidos na fábrica i a ser enviado para o
mercado j.
Fonte: [1] Luís Herique Rodrigues et al. (2014), Pesquisa Operacional -
Programação Linear Passo a Passo, Editora Unisinos.
Passo 5 – Identificando classes de restrições

Você possui três fábricas localizadas em regiões geográficas distintas, e precisa


saber Ao observar
quanto deveoproduzir
quadro que apresenta para
e transportar os dados do diferentes
quatro problema, mercados
identificam-se duas
a um
classes de restrições, destacadas a seguir:
custo mínimo. As informações do custo de transporte unitário entre as fábricas e
os mercados estão no quadro a seguir.
Quadro 9 – Classes de restrições do problema 3 – transporte
Mercados
Custo de transporte Capacidade Produtiva
1 2 3 4
A $ 0,90/un $ 1,00/un $ 1,80/un $ 1,05/un 22.500 un
Fábricas B $ 2,10/un $ 0,80/un $ 0,70/un $ 1,15/un 21.000 un
C $ 1,10/un $ 1,00/un $ 1,20/un $ 1,50/un 19.500 un
Demanda mínima 10.000un 15.000un 11.000un 10.000un

Demanda mínima: Para cada um dos mercados deve ser expedido uma quantidade
15 / 30 Túlio Toffolo – Otimização Linear e Inteira – Aula 04: Modelagem e Python-MIP
Passo 1: Esquema

Deve-se definir quantos produtos de cada fábrica devem ser enviados a


cada mercado, considerando capacidade e demanda mínima...

Figura 6 – Esquema do Problema 3 – Transporte.

Figura: Esquema (imagem extraída de Rodrigues et. al [1])


Passo 2 – Definindo uma solução para o problema

16 / 30 Túlio Toffolo – Otimização Linear e Inteira – Aula 04: Modelagem e Python-MIP


Figura 6 – Esquema do Problema 3 – Transporte.
Passo 2: Solução
Passo 2 – Definindo uma solução para o problema

Uma Umasolução devede


proposta indicar quantas
solução para ounidades
problema de
deveproduto
indicar devem
quantas ser
unidades de
produto devem ser enviadas de cada fábrica para cada mercado, atendendo
enviadas de cada fábrica para cada mercado, respeitando as capacidades tanto às
capacidades produtivas máximas quanto às demandas mínimas de cada mercado. Uma
produtivas
solução e atendendo
possível as demandas
para o problema é evidenciadamínimas
no Quadrode8. cada mercado.

Eis uma solução possível:


Quadro 8 – Solução para o problema 3 – transporte
Para o mercado...
Unidades enviadas
1 2 3 4
A 5000 5000 5000 5000
Da Fábrica... B 5000 5000 5000 5000
C 4000 5000 4000 4000

Passo 3 – Definindo variáveis de decisão

Ao definirmos quantas unidades devem ser enviadas de cada fábrica para cada
mercado, deparamo-nos com a própria variável de decisão, que pode ser expressa da
Túlio Toffolo – Otimização Linear e Inteira – Aula 04: Modelagem e Python-MIP
17 / 30
seguinte maneira:
Passo 3: Variáveis

Estamos decidindo quanto enviar de cada fábrica para cada mercado...

Seja F o conjunto de fábricas


Seja M o conjunto de mercados

Variáveis:
xi,j : quantidade a enviar da fábrica i ∈ F para o mercado j ∈ M .

18 / 30 Túlio Toffolo – Otimização Linear e Inteira – Aula 04: Modelagem e Python-MIP


Passo 4: Função objetivo

Devemos minimizar o custo de transporte...

Seja ci,j o custo de enviar uma unidade do produto produzido na


fábrica i ∈ F para o mercado j ∈ M

Função objetivo:
XX
min ci,j xi,j
i∈F j∈M

19 / 30 Túlio Toffolo – Otimização Linear e Inteira – Aula 04: Modelagem e Python-MIP


Ao observar o quadro que apresenta os dados do problema, identificam-se duas
classes de restrições, destacadas a seguir:
Passo 5: Restrições
Quadro 9 – Classes de restrições do problema 3 – transporte
Mercados
Custo de transporte Capacidade Produtiva
1 2 3 4
A $ 0,90/un $ 1,00/un $ 1,80/un $ 1,05/un 22.500 un
Fábricas B $ 2,10/un $ 0,80/un $ 0,70/un $ 1,15/un 21.000 un
C $ 1,10/un $ 1,00/un $ 1,20/un $ 1,50/un 19.500 un
Demanda mínima 10.000un 15.000un 11.000un 10.000un

Seja pDemanda
i a capacidade produtiva
mínima: Para dados
cada um fábrica i ∈ deve
mercados F ser expedido uma quantidade
X
∀i ∈ F : xi,j ≤ pi
j∈M

Seja dj a demanda mínima do mercado j ∈ M


X
∀j ∈ M : xi,j ≥ dj
i∈F

20 / 30 Túlio Toffolo – Otimização Linear e Inteira – Aula 04: Modelagem e Python-MIP


Exemplo 2: Transporte

Eis o modelo de programação linear:

XX
min ci,j xi,j
i∈F j∈M
X
s.a. xi,j ≤ pi ∀i ∈ F
j∈M
X
xi,j ≥ dj ∀j ∈ M
i∈F
xi,j ≥ 0 ∀i ∈ F, ∀j ∈ M

21 / 30 Túlio Toffolo – Otimização Linear e Inteira – Aula 04: Modelagem e Python-MIP


Aula de hoje

1 Dicas de modelagem

2 Exemplo 1: Fábrica de brinquedos

3 Exemplo 2: Transporte

4 Aula prática

5 Exercícios

22 / 30 Túlio Toffolo – Otimização Linear e Inteira – Aula 04: Modelagem e Python-MIP


Python-MIP

Vamos utilizar o Python-MIP para implementar os dois modelos vistos


nesta aula.

Requisitos:
Linguagem Python 3.5 ou mais recente
Framework Python-MIP, desenvolvido por Túlio Toffolo e Haroldo
Santos (projeto apoiado pela COIN-OR)

Mais informações: http:// www.python-mip.com

23 / 30 Túlio Toffolo – Otimização Linear e Inteira – Aula 04: Modelagem e Python-MIP


Exemplo 1

1 from mip.model import *


2
3 model = Model("Exemplo 1", MAXIMIZE)
4
5 # criando variáveis
6 x1 = model.add_var()
7 x2 = model.add_var()
8
9 # criando a função objetivo
10 model += 100*x1 + 112*x2
11
12 # adicionando as restrições
13 model += 6*x1 + 4*x2 <= 18
14 model += x1 >= 1
15 model += x2 >= 1
16
17 # resolvendo o modelo
18 model.optimize()
19
20 # imprimindo a solução
21 print("x1 = {x1.x}, x2 = {x2.x}".format(**locals()))

24 / 30 Túlio Toffolo – Otimização Linear e Inteira – Aula 04: Modelagem e Python-MIP


Exemplo 1 (alternativo)

1 from mip.model import *


2
3 model = Model("Exemplo 1", MAXIMIZE)
4
5 # criando variáveis
6 x1 = model.add_var()
7 x2 = model.add_var()
8
9 # criando a função objetivo
10 model.objective = 100*x1 + 112*x2
11
12 # adicionando as restrições
13 model.add_constr(6*x1 + 4*x2 <= 18)
14 model.add_constr(x1 >= 1)
15 model.add_constr(x2 >= 1)
16
17 # resolvendo o modelo
18 model.optimize()
19
20 # imprimindo a solução
21 print("x1 = {x1.x}, x2 = {x2.x}".format(**locals()))

25 / 30 Túlio Toffolo – Otimização Linear e Inteira – Aula 04: Modelagem e Python-MIP


Exemplo 2 (I)

1 from mip.model import *


2
3 model = Model("Exemplo 2")
4
5 # dados de entrada
6 F = [ 0, 1, 2 ]
7 M = [ 0, 1, 2, 3 ]
8 c = [ [ 0.90, 1.00, 1.80, 1.05 ],
9 [ 2.10, 0.80, 0.70, 1.15 ],
10 [ 1.10, 1.00, 1.20, 1.50 ] ]
11 p = [ 22500, 21000, 19500 ]
12 d = [ 10000, 15000, 11000, 10000 ]
13
14 # criando variáveis
15 x = [ [ model.add_var() for j in M ] for i in F ]
16
17 # poderíamos escrever, alternativamente:
18 x = []
19 for i in F:
20 x.append([])
21 for j in M:
22 x[i].append(model.add_var())

26 / 30 Túlio Toffolo – Otimização Linear e Inteira – Aula 04: Modelagem e Python-MIP


Exemplo 2 (II)

1 ...
2
3 # criando a função objetivo
4 model += xsum(c[i][j]*x[i][j] for i in F for j in M)
5
6 # adicionando as restrições
7 for i in F:
8 model += xsum(x[i][j] for j in M) <= p[i]
9 for j in M:
10 model += xsum(x[i][j] for i in F) >= d[j]
11
12 # resolvendo o modelo
13 model.optimize()
14
15 # imprimindo a solução
16 print("\n-----------------------------------")
17 print("Solução ótima com custo: {}\n".format(model.objective_value))
18 for i in F:
19 for j in M:
20 print("x({},{}) = {}".format(i, j, x[i][j].x))
21 print("-----------------------------------\n")

27 / 30 Túlio Toffolo – Otimização Linear e Inteira – Aula 04: Modelagem e Python-MIP


28 / 30 Túlio Toffolo – Otimização Linear e Inteira – Aula 04: Modelagem e Python-MIP
Aula de hoje

1 Dicas de modelagem

2 Exemplo 1: Fábrica de brinquedos

3 Exemplo 2: Transporte

4 Aula prática

5 Exercícios

29 / 30 Túlio Toffolo – Otimização Linear e Inteira – Aula 04: Modelagem e Python-MIP


Exercícios

Exercício 1
Um sapateiro é capaz de fazer 6 sapatos por hora ou 5 cintos por hora.
Ele gasta 2 unidades de couro para fabricar um sapato e uma unidade de
couro para fabricar um cinto. Tem-se um total de 6 unidades disponíveis
de couro. O lucro unitário do sapato é de 5 unidades monetárias e o do
cinto é de 2 unidades monetárias.
Ajude o sapateiro a lucrar o máximo que ele puder por dia (considere que
o dia tem 8 horas): formule um Programa Linear (PL) e, em seguida:
Implemente e resolva a formulação utilizando o Python-MIP e CBC.
Resolva também utilizando o método gráfico.

30 / 30 Túlio Toffolo – Otimização Linear e Inteira – Aula 04: Modelagem e Python-MIP


Perguntas?

/ 12

Você também pode gostar