Você está na página 1de 8

O

Problema do Transporte

Alguns problemas de programação linear merecem um tratamento específico. Um destes é problema de
transporte que consiste em distribuir bens e serviços de várias fontes de suprimento (como fábricas, por
exemplo) para várias localizações de demanda, como armazéns ou centos distribuidores. Em problemas
deste tipo, a quantidade disponível de bens em cada fonte de suprimento é fixa ou limitada. Cada destino,
tem também uma demanda especificada.

Nitidamente existe um problema de decisão envolvido: quais rotas devem ser escolhidas para o envio dos
produtos levando em consideração que cada rota tem um custo associado. Além disso, deve-se satisfazer
a demanda de cada destino e minimizar o custo total de transporte.

Exemplo

Existem três fontes de suprimento de um dado produto identificadas dom F1, F2, F3, com as seguintes
capacidades mensais de produção: 10000 (F1), 15000 (F2) e 5000 (F3), totalizando 30000 unidades
disponíveis por mês. As fontes devem suprir as necessidades de 4 armazéns com as seguintes demandas:

D1: 8000 unidades
D2: 4000 unidades
D3: 7000 unidades
D4: 11000 unidades

totalizando 30000 unidades de produto demandas por mês. Podemos representar o problema com o
modelo a seguir:



Cada aresta que conecta uma fonte a um destino possui um custo, que representa o custo de enviar uma
unidade do produto da fonte ao destino correspondente. A tabela a seguir mostra o custo de transporte
(R$/unidade):

D1 D2 D3 D4
F1 13 8 9 12
F2 12 9 10 14
F3 8 8 9 6

Podemos formular esse problema como um problema de programação linear com função objetivo e
restrições. O problema completo seria dado como:

Um problema de minimizar Z, onde

Z = 13X11 + 8x12 + 9x13 + 12x14 + 12x21 + 9x22 + 10x23 + 14x24 + 8x31 + 8x32 + 9x33 + 6x34

Sujeito a:

X11 + x12 + x13 + x14 <= 10000
X21 + x22 + x23 + x24 <= 15000
X31 + x32 + x33 + x34 <= 5000
X11 + x21 + x31 = 8000
X12 + x22 + x31 = 4000
X13 + x23 + x33 = 7000
X14 + x24 + x34 = 11000

Como visto em aulas passadas, podemos resolver um problema de programação linear utilizando o
método simplex. No entanto, esse é um problema complexo que envolve 12 variáveis de decisão e sete
restrições. Além de complicado, a solução desse problema é custosa.

Algoritmo para o Problema do Transporte

Tais problemas podem ser resolvidos utilizando o método Simplex, no entanto existem algoritmos
especiais para resolver tal problema. Esses algoritmos especiais são interessantes porque: (a) seus tempos
de computação, em geral, são cem vezes menores que os tempos do Simplex e (b) requerem menos
memória de computador, permitindo a solução de problemas maiores.

Para o problema do transporte devemos realizar dois passos: obter uma primeira solução (aproximada) e
então prosseguir com o algoritmo para melhor a solução temporária até obter a solução ótima. Existem
diversos algoritmos para tais passos na literatura. Vamos aplicar o Método de Aproximação de Vogel
(VAM) para o primeiro passo e o método MODI para a segunda etapa.

O Método de Aproximação Vogel (VAM – Vogel Aproximation Method), é uma rotina de cálculos que
permite obter uma solução aproximada ao Problema do Transporte. Esse método permite encontrar uma
solução muito próxima da solução ótima. Isso faz com que, muito provavelmente, realizemos menos
iterações na segunda etapa.

Vamos considerar a matriz de transporte a seguir:

D1 D2 D3 D4 Suprimento
F1 3 2 2 3 4000
F2 4 4 5 5 8000
F3 7 7 6 4 13000
Demanda 9000 8000 3000 5000 25000

A primeira etapa do método consiste em calcular uma penalidade para cada linha e cada coluna da matriz
de transporte. Esse método procurar alocar cargas nas células que contribuem menos para o custo do
transporte. A penalidade é calculada a partir da diferença entre os dois menores custos para cada linha e
cada coluna. Por exemplo, na primeira linha, os dois menores custos são F1D3 e F1D3, ambos com custo
2. Sendo assim, a penalidade para essa linha é igual a zero. A penalidade é sempre um valor positivo ou
nulo.

Desta forma, podemos reescrever a matriz de transporte com as penalidades inseridas:

D1 D2 D3 D4 Suprimento Penalidade
F1 3 2 2 3 4000 0

F2 4 4 5 5 8000 0

F3 7 7 6 4 13000 2

Demanda 9000 8000 3000 5000 25000 -
Penalidade 1 2 3 1 - -

O passo seguinte consiste em identificar aquela linha ou coluna que possui a maior penalidade. Em outras
palavras, aquela onde a diferença da célula de menor custo com a próxima é maior. No nosso exemplo,
isso acontece na coluna D3, onde a penalidade foi igual a 3. Em caso de várias linhas ou colunas com o
mesmo valor de penalidade, escolhe-se uma delas. Dentro da linha e da coluna de maior penalidade,
deve-se escolher aquela célula que possui o menor custo. Em seguida, faz-se a alocação de carga, segundo
a necessidade do destino ou a possibilidade de fornecimento da fonte, na célula escolhida. No nosso
exemplo, a célula escolhida é a F1D3. Observe que F1 produz 4000, mas D3 só demanda 3000. Sendo
assim, serão alocados 3000 nessa célula. Perceba, que ao alocar tal valor, o destino D3 não pode receber
mais produtos de nenhuma outra fonte porque ela já atingiu a sua necessidade de demanda. Sendo assim,
essa coluna é excluída dos cálculos posteriores.

Os cálculos da penalidade são reiniciados (considerando que D3 não faz mais parte do modelo). Desta
forma, a nova tabela com as penalidades seria dada por (o valor em parênteses indica quanto foi alocado
na célula):

D1 D2 D3 D4 Suprimento Penalidade
F1 3 2 2 3 4000 1
(3000)
F2 4 4 5 5 8000 0
(-)
F3 7 7 6 4 13000 3
(-)
Demanda 9000 8000 3000 5000 25000 -
Penalidade 1 2 - 1 - -

Utilizando a mesma regra de escolha da penalidade, selecionamos a linha F3 e, dentro dessa linha,
pegamos a célula de menor custo. Neste caso, F3D4. Observe que a fonte 3 produz 13000, no entanto a
demanda para D4 é de 5000. Logo serão alocados apenas 5000 produtos nesta célula. Essa ação faz com
que a coluna D4 atinja seu limite de demanda. A coluna D4 é então retirada dos cálculos posteriores.
Recalculando as penalidades e alocando a carga temos a tabela a seguir:

D1 D2 D3 D4 Suprimento Penalidade
F1 3 2 2 3 4000 1
(3000) (-)
F2 4 4 5 5 8000 0
(-) (-)
F3 7 7 6 4 13000 0
(-) (5000)
Demanda 9000 8000 3000 5000 25000 -
Penalidade 1 2 - - - -

A coluna com maior penalidade é a D2 que tem a célula F1D2 como a de menor custo. Desta forma,
devemos alocar o máximo possível em tal célula. Observe que a demanda de D2 é de 8000, mas a fábrica
F1 só consegue produzir mais 1000 unidades do produto (lembre-se que 3000 já foram alocados para D3).
Sendo assim, o máximo de carga que a célula pode receber é de 1000. Ao alocar tal carga, a linha F1 fica
inutilizada já que F1 produz toda a quantidade de suprimento disponível. Recalculando as penalidades e
alocando as cargas, temos:

D1 D2 D3 D4 Suprimento Penalidade
F1 3 2 2 3 4000 -
(-) (1000) (3000) (-)
F2 4 4 5 5 8000 0
(-) (-)
F3 7 7 6 4 13000 0
(-) (5000)
Demanda 9000 8000 3000 5000 25000 -
Penalidade 3 3 - - - -

Analisando novamente as penalidades, temos que D1 e D2 possuem as penalidades mais altas. Neste
caso, podemos escolher qualquer uma delas. Para esse exemplo, vamos selecionar a coluna D1. Dentro
da coluna, a célula F2D1 é a que possui o menor custo. O máximo que podemos alocar nesta célula é de
8000 unidades do produto. Alocando a caga na célula e recalculando as penalidades temos:

D1 D2 D3 D4 Suprimento Penalidade
F1 3 2 2 3 4000 -
(-) (1000) (3000) (-)
F2 4 4 5 5 8000 0
(8000) (-) (-) (-)
F3 7 7 6 4 13000 0
(-) (5000)
Demanda 9000 8000 3000 5000 25000 -
Penalidade 3 3 - - - -

Observe que essa ação inutilizou a linha F2. Desta forma, não podemos mais calcular penalidades, dada a
configuração da tabela. Para este caso, podemos alocar diretamente as cargas nas células restantes
respeitando os valores de demanda e suprimento.

O resultado final da matriz de transporte para o exemplo é dado por:








D1 D2 D3 D4 Suprimento
F1 3 2 2 3 4000
(-) (1000) (3000) (-)
F2 4 4 5 5 8000
(8000) (-) (-) (-)
F3 7 7 6 4 13000
(1000) (7000) (-) (5000)
Demanda 9000 8000 3000 5000 25000

Essa tabela representa a solução inicial cujo valor se aproxima da solução ótima. O próximo passo consiste
em otimizar tal valor, se necessário.

Para saber se essa é a solução ótima precisamos analisar cada célula vazia e verificar se vale a pena
transferir cargas para esta célula. O processo é simples:

Para cada célula preenchida calculamos Li + Kj = Cij, onde:

Li = Linha i
Kj = Colula j
Cij = Custo na célula i, j

Para cada célula vazia, devemos calcular:

Cij – Li – Kj

Para cada célula vazia, podemos encontrar 3 valores possíveis:
• Valor positivo: isso indica que qualquer transferência para essa célula vai implicar no aumento do
custo. Logo, isso implica que já foi encontrada a solução ótima.
• Valor zero: isso indica que qualquer transferência para essa célula não vai alterar o custo. Logo,
também já atingimos a solução ótima.
• Valor negativo: isso indica que qualquer transferência para esta célula vai implicar na redução do
custo. Logo, a solução encontrada não é a solução ótima.

Vamos analisar cada caso no exemplo. Segue a tabela da solução ótima encontrada:

D1 D2 D3 D4 Suprimento
F1 3 2 2 3 4000
(-) (1000) (3000) (-)
F2 4 4 5 5 8000
(8000) (-) (-) (-)
F3 7 7 6 4 13000
(1000) (7000) (-) (5000)
Demanda 9000 8000 3000 5000 25000

Células preenchidas: F1D2, F1D3, F2D1, F3D1, F3D2, F3D4
Células vazias: F1D1, F1D4, F2D2, F2D3, F2D4, F3D3

Para as células preenchidas, temos:


L1 + K2 = 2
L1 + K3 = 2
L2 + K1 = 4
L3 + K1 = 7
L3 + K2 = 7
L3 + K4 = 4

Faz-se L1 = 0 e temos L1 + K2 è 0 + K2 = 2 è K2 = 2
L1 + K3 = 2 è 0 + K3 = 2 è K3 = 2
L3 + K2 = 7 è L3 + 2 = 7 è L3 = 5
L3 + K1 = 7 è 5 + K1 = 7 è K1 = 2
L2 + K1 = 4 è L2 + 2 = 4 è L2 = 2
L3 + K4 = 4 è 5 + K4 = 4 è K4 = -1

Para as células vazias, temos:

L1K1: 3 – L1 – K1 = 3 – 0 – 2 = 1
L1K4: 3 – L1 – K4 = 3 – 0 – (-1) = 4
L2K2: 4 – L2 – K2 = 4 – 2 – 2 = 0
L2K3: 5 – L2 – K3 = 5 – 2 – 2 = 1
L2K4: 5 – L2 – K4 = 5 – 2 – (-1) = 4
L3K3: 6 – L3 – K3 = 6 – 5 – 2 = -1 ççç

Observe que das células analisadas apenas a L3K3 teve resultado negativo. Isso significa que se
transferirmos cargas para essa célula vai reduzir o custo em 1 unidade para cada produto transferido. Isso
indica que não chegamos na solução ótima.

O passo seguinte é fazer essa transferência de cargas para a célula que permite a redução do custo. Essa
transferência é feita por meio de um anel de realocação, que deve se formado entre a célula que vai
receber a carga e outras células preenchidas. Vale ressaltar que o anel de realocação só tem uma célula
vazia.

A tabela a seguir indica as células que fazem parte do anel de realocação. Essas células estão marcadas
com os sinais de + e -. As células que estão marcadas com + são aquelas que irão receber cargas e as que
estão marcadas com – são aquelas que irão perder dados.

D1 D2 D3 D4 Suprimento
F1 3 2 2 3 4000
(-) (1000) (3000) (-)
+ -
F2 4 4 5 5 8000
(8000) (-) (-) (-)
F3 7 7 6 4 13000
(1000) (7000) (-) (5000)
- +
Demanda 9000 8000 3000 5000 25000

Observe que essa troca é necessária para que garanta os valores de demanda e suprimento.

Uma vez identificado o anel de realocação, a transferência é simples. Identifica a célula que tem o maior
valor negativo (no caso, o menor valor em módulo). No nosso exemplo, essa célula é F1D3 que tem carga
de 3000. Sendo assim, as células com sinal + ganhará 3000 em carga. As células com sinal de – perderá
3000 em cargas. Fazendo essa troca, temos a seguinte tabela:

D1 D2 D3 D4 Suprimento
F1 3 2 2 3 4000
(-) (4000) (-) (-)
+ -
F2 4 4 5 5 8000
(8000) (-) (-) (-)
F3 7 7 6 4 13000
(1000) (4000) (3000) (5000)
- +
Demanda 9000 8000 3000 5000 25000

Essa tabela representa a segunda solução possível. O passo seguinte é analisar se essa é a solução ótima.
O processo é o mesmo que aplicamos anteriormente:
Para cada célula preenchida calculamos Li + Kj = Cij
Para cada célula vazia, devemos calcular Cij – Li – Kj

Esse cálculo é realizado levando em consideração a última tabela encontrada:

D1 D2 D3 D4 Suprimento
F1 3 2 2 3 4000
(-) (4000) (-) (-)
+ -
F2 4 4 5 5 8000
(8000) (-) (-) (-)
F3 7 7 6 4 13000
(1000) (4000) (3000) (5000)
- +
Demanda 9000 8000 3000 5000 25000

Para cada célula preenchida, temos:

L1 + K2 = 2
L2 + K1 = 4
L3 + K1 = 7
L3 + K2 = 7
L3 + K3 = 6
L3 + K4 = 4

Fazendo L1 = 0, L1 + K2 = 2 è 0 + K2 = 2
L3 + K2 = 7 è L3 + 2 = 7 è L3 = 5
L3 + K1 = 7 è 5 + K1 = 7 è K1 = 2
L2 + K1 = 4 è L2 + 2 = 4 è L2 = 2
L3 + K3 = 6 è 5 + K3 = 6 è K3 = 1
L3 + K4 = 4 è 1 + K4 = 4 è K4 = 3

Para cada célula vazia temos:

L1K1: 3 – L1 – K1 = 3 – 0 – 2 = 1
L1K3: 2 – L1 – K3 = 2 – 0 – 1 = 1
L1K4: 3 – L1 – K4 = 3 – 0 – 3 = 0
L2K2: 4 – L2 – K2 = 4 – 2 – 2 = 0
L2K3: 5 – L2 – K3 = 5 – 2 – 1 = 2
L2K4: 5 – L2 – K4 = 5 – 2 – 3 = 0

Nenhuma célula vazia indicou valor negativo. Isso significa que qualquer movimentação de cargas ou vai
manter o custo ou vai aumenta-lo. Sendo assim, a solução encontrada é ótima.

Você também pode gostar