otimização linear - DComp

Propaganda
Otimização Linear
Teoria dos Grafos & Fluxos em Redes
_______________________________________________________________________________________________________________
DEPARTAMENTO DE TELEMÁTICA
FACULDADE DE ENGENHARIA ELÉTRICA E DE COMPUTAÇÃO
UNIVERSIDADE ESTADUAL DE CAMPINAS
OTIMIZAÇÃO LINEAR
“Teoria dos Grafos e Fluxos em Redes”
Autor: Tiago Agostinho de Almeida
__________________________________________________________________________________________________________
1
Otimização Linear
Teoria dos Grafos & Fluxos em Redes
_______________________________________________________________________________________________________________
I. FUNDAMENTAÇÃO TEÓRICA
1. Grafos
1.1. O que é um grafo?
Quando analisamos um conjunto de elementos de dados (não necessariamente dados
computacionais), podemos estar preocupados com o seu conteúdo ou com as relações existentes
entre eles. A Teoria dos Grafos preocupa-se com o estudo das relações existentes entre diversos
objetos de análise, podendo ser utilizada em qualquer área que necessite de organização de dados:
sociologia, pesquisa operacional, química, etc.
O grafo propriamente dito é uma representação gráfica das relações existentes entre elementos
de dados. Ele pode ser descrito num espaço euclidiano de n dimensões como sendo um conjunto V
de vértices e um conjunto A de curvas contínuas (arestas).
Um vértice é representado por um círculo e uma curva é representada pela representação gráfica
plana característica, ou seja, um segmento de reta. Quando uma curva possui indicação de sentido
(uma seta), ela é chamada de arco , caso contrário é chamada de linha .
As principais características desta estrutura são:
1. toda curva fechada de A tem apenas um ponto de V ;
2. toda curva aberta de A tem exatamente dois pontos de V ;
3.
as
•
curvas
de
A
não
têm
pontos
comuns
exceto
os
elementos
do
conjunto
V.
Quando um grafo possui arcos, o mesmo denomina-se grafo dirigido ou dígrafo.
Ex.:
•
Quando um elemento do conjunto A (curvas) tem o mesmo elemento do conjunto V (vértices)
como ponto inicial e final, dizemos que este elemento é um laço.
Ex.:
__________________________________________________________________________________________________________
2
Otimização Linear
Teoria dos Grafos & Fluxos em Redes
_______________________________________________________________________________________________________________
1.2. O que podemos fazer com um grafo?
Nós podemos aplicar operações sobre um grafo para que ele melhor represente as operações
que sofrem os seus componentes: os dados.
1.2.1.
Operações elementares
São elas:
•
inserção de uma curva ou vértice;
•
retirada de curvas e/ou vértices;
•
rotação ou redesignação dos vértices pela troca entre eles num dos sentidos;
•
fusão ou junção de dois vértices em um;
__________________________________________________________________________________________________________
3
Otimização Linear
Teoria dos Grafos & Fluxos em Redes
_______________________________________________________________________________________________________________
•
inversão ou troca do sentido dos arcos.
1.2.2.
Operações binárias
São operações como as realizadas na Teoria dos Conjuntos. Seu objetivo é fazer operações
sobre os elementos dos grafos (vértices e arestas).
Sejam os grafos G1(V1, A1), G2(V2, A2) e G3(V3, A3), onde V1, V2 e V3 são os conjuntos de
vértices e A1, A2 e A3 são os conjuntos de arestas dos grafos.
Sobre eles serão realizadas as seguintes operações:
A. União
É a junção de dois grafos através de vértices em comum, se existentes.
G'(V', A') U G"(V", A") = G(V, A), V = V' U V" e A = A' U A".
Ex.:
B. Intersecção
Tem como resultado os elementos em comum entre dois grafos.
G'(V', A')
Ex.:
G"(V", A") = G(V, A), V = V'
G1
G2:
G1
V" e A = A'
A".
G3: Ø
C. Diferença
É a retirada de elementos comuns do primeiro grafo em relação ao segundo.
G'(V', A') - G"(V", A") = G(V, A), V = V' - V" e A = A' - A".
Ex.:
__________________________________________________________________________________________________________
4
Otimização Linear
Teoria dos Grafos & Fluxos em Redes
_______________________________________________________________________________________________________________
1.3. Como melhor podemos caracterizar os grafos?
Para podermos discernir melhor as características dos grafos, temos um conjunto de conceitos
que expressam a peculiaridade de cada grafo.
1.3.1 Cardinalidade
A cardinalidade de um conjunto de vértices é igual à quantidade de seus elementos. É também
chamada de ORDEM.
Ex.:
C(V) = 4
A cardinalidade de um conjunto de curvas é igual ao número e elementos que o compõe. Ex.:
Para G(V, A) do exemplo anterior: C(A) = 4.
1.3.2 Vértices Adjacentes
Dois vértices são adjacentes se existir uma curva entre eles. Dado dois nós x e y, a
representação de uma linha é dada por xy e de um arco por xy.
1.3.3 Vértices Conexos
Dois vértices são conexos se são adjacentes ou possuem uma relação de adjacência, ou
seja, dados dois vértices x e y, existe um nodo x1 que é adjacente a x, outro x2 que é adjacente a x1,
e assim sucessivamente.
Ex.: No grafo ao lado, C é conexo a D
1.3.4
Cadeia
É um conjunto qualquer de linhas de um grafo. Ex.: Para o exemplo anterior, são cadeias
DAB, CB.
1.3.5 Ciclo
É uma cadeia fechada, onde a extremidade inicial e final coincidem.
__________________________________________________________________________________________________________
5
Otimização Linear
Teoria dos Grafos & Fluxos em Redes
_______________________________________________________________________________________________________________
Ex.: Os ciclos ABCDA e CBADC foram retirados do grafo
1.3.6 Caminho
É um conjunto qualquer de arcos de um grafo.
Ex.: Para o grafo são caminhos DA e BCDA.
1.3.7 Número Cromático
É o menor valor de cores necessárias para colorir os vértices de um grafo, sem que vértices
adjacentes tenham a mesma cor.
Ex.:
número de cores (n) = 2
e n=4
1.4. Que tipos de grafos existem?
1.4.1. Grafo parcial:
Se G2 é um grafo parcial de G1, então G2 possui um mesmo conjunto de vértices, mas não o
mesmo de arestas, do grafo G1.
Ex.:
G1,
Ex.:
1.4.2. Subgrafo:
Se o grafo G2 é um subgrafo de G1, então G2 possui um número de vértices inferior aos de
embora
mantendo
o
número
de
curvas
entre
os
vértices
existentes.
__________________________________________________________________________________________________________
6
Otimização Linear
Teoria dos Grafos & Fluxos em Redes
_______________________________________________________________________________________________________________
1.4.3. Subgrafo parcial
Se o grafo G2 é um subgrafo parcial de G1, então G2 é um subgrafo que não mantém todas
as curvas entre os vértices existentes.
Ex.:
1.4.4. Grafo valorado
É o grafo que possui valores nos vértices e nas curvas.
Ex.:
1.4.5. Multigrafo
É o grafo que possui ao menos um par de vértices ligados por duas ou mais curvas.
Ex.:
1.4.6. Grafo denso
É o grafo que possui alta cardinalidade de vértice ou curva.
1.4.7. Grafo pouco povoado
É o grafo que possui baixa cardinalidade de vértice ou curva.
1.4.8. Grafo conexo
É aquele onde qualquer par de vértice for conexo.
__________________________________________________________________________________________________________
7
Otimização Linear
Teoria dos Grafos & Fluxos em Redes
_______________________________________________________________________________________________________________
Ex.:
Contra-exemplo:
1.4.9
Grafo-árvore
É aquele que possui uma das seguintes características:
1. é conexo e sem ciclos;
2. é conexo e tem n vértices e n-1 linhas;
3. sem ciclos e tem n vértices e n-1 linhas;
4. sem ciclos e, inserindo uma nova linha, é possível formar um ciclo.
Ex.:
1.4.10 Grafo planar
É aquele que permite a representação no plano sem que as linhas se cruzem.
Ex.:
1.4.11 Grafo de Kuratowski
É um tipo de grafo aceito como não-planar.
Exs.:
1.4.12 Rede de PERT
É um grafo dirigido valorado que possui uma entrada, uma saída e não tem laços nem ciclos.
A entrada é o vértice que serve como extremidade final para arcos e saída é o vértice que serve
apenas como extremidade inicial para arcos.
__________________________________________________________________________________________________________
8
Otimização Linear
Teoria dos Grafos & Fluxos em Redes
_______________________________________________________________________________________________________________
Este tipo de grafo é utilizado na análise de eventos temporais, que necessitam do acompanhamento
do fluxo de dados em relação ao tempo.
Ex.: Uma fábrica possui cinco módulos de processamento robotizado. Cada módulo possui uma
identificação e uma função específica. A rede de PERT ao lado representa o tempo de uma peça
sendo processada entre os módulos.
1.5. Como podemos representar os grafos?
Há diversas formas de representação de grafos em estruturas de dados: podemos representar as
adjacências entre os vértices, as arestas, e assim por diante. A seguir vamos analisar a forma de
representação através da matriz de adjacências e lista de adjacências , onde descreve-se a relação
entre os vértices.
1.5.1. Matriz de Adjacências
Podemos representar um grafo através de uma matriz de dimensão C(V) x C(V), onde o
conteúdo poderá ser de números binários (0;1) ou inteiros (-1;0;1).
Para exemplificarmos, analisemos o grafo G :
A cardinalidade de vértices do grafo G é 6, portanto, para sua representação, deveremos ter
uma matriz de adjacências 6x6. Utilizando valores binários, podemos representar desta forma:
ma[i,j] =
Conforme observamos, a matriz de adjacências ao lado foi formada seguindo a regra: ma[i,j]
= 1, se i é adjacente a j, 0 caso contrário . Como estamos trabalhando com um dígrafo, devemos
estabelecer qual é a origem e qual é o destino. No exemplo apresentado, a origem está definida pela
letra indicadora de linha. Por exemplo, A está conectado com B , mas não o contrário, por isso
ma[A,B] é 1 e ma[B,A] é 0.
Para resolvermos isso, podemos fazer uma representação alternativa: ma[i,j] = -1 se i é
origem da adjacência com j, 1 se i é o destino da adjacência com j e 0 para os demais vértices
não envolvidos na adjacência . Isso é sintetizado na seguinte matriz:
ma[i,j] =
__________________________________________________________________________________________________________
9
Otimização Linear
Teoria dos Grafos & Fluxos em Redes
_______________________________________________________________________________________________________________
Como exemplo, observemos o elemento ma[A,B] , ma[A,C] e ma[A,D] , que possuem valor -1.
Isto indica que A é origem de arcos para C , D e E . Também observemos ma[F,D] e ma[F,E] , com
valor 1, indicando que F recebe os arcos de D e E . Apesar da metodologia empregada, observa-se
que a dada aplicação que necessite de alteração de grafo, seria inadequada a representação através
de estruturas fixas, exigindo, então, estrutura dinâmica.
1.5.2. Lista de Adjacências
Para que seja possível a remodelagem de um grafo em tempo de execução, torna-se
necessária a alocação dinâmica de sua representação. Por isso, a representação de adjacências
entre vértices pode ser feita através de listas lineares.
Sua constituição é realizada por um vetor dinâmico ou lista encadeada formando um índice de
vértices. De cada elemento de índice parte uma lista encadeada descrevendo os vértices adjacentes
conectados.
Como exemplo, para o grafo G apresentado na seção anterior, visualizaremos a seguinte
representação:
A lista encadeada é formada por nodos que contém o dado do vértice (letra) e o ponteiro para
o vértice adjacente ao indicado no índice (vetor descritor dos vértices). Eventualmente os nodos
poderão exigir outros campos, tais como marcação de visita ao vértice, dados adicionais para
processamento da seqüência do grafo, etc.
Esta é a forma de representação mais flexível para a representação de grafos. Obviamente
que aplicações específicas permitirão o uso de outras formas de representação. Cabe aqui salientar
que é possível a descrição de grafos através de suas arestas, o que pode exigir uma matriz para sua
descrição.
1.5.3. Matriz de Incidência
Este tipo de matriz representa um grafo a partir de suas arestas. Como exige muitas vezes a
alocação de uma matriz maior do que no método da matriz de adjacências, não é tão utilizada quanto
aquela. A matriz alocada deverá ter dimensões C(V) x C(A).
O princípio desta representação está na regra: mi[i,j] = 1 se o vértice i incide com a aresta
j, 0 caso contrário . Exemplificando a partir do grafo G anteriormente apresentado, teremos uma
matriz:
i[i,j] =
2. Algoritmos
2.1. Dijkstra:
O método de Dijkstra é um método muito eficiente. Basta colocar os dados (no caso do
problema apresentado, os dados são as distâncias entre as cidades) e o método retorna o caminho
que deverá ser percorrido de modo que a distância seja mínima. Um problema desse método, é que
__________________________________________________________________________________________________________
10
Otimização Linear
Teoria dos Grafos & Fluxos em Redes
_______________________________________________________________________________________________________________
ele torna-se muito complicado de ser resolvido manualmente, o que torna indispensável o uso do
computador
O algoritmo de Dijkstra identifica, a partir de um vértice do grafo, qual é o custo mínimo
entre esse vértice e todos os demais vértices do grafo. No início, o conjunto S contém somente esse
vértice, chamado origem. Seleciona-se, a cada passo, dentre os vértices não pertencentes S (vértices
temporários), aquele que apresentar menor custo de deslocamento até a origem. A seguir, este nó é
identificado como permanente (incluído no conjunto S) e todas as distâncias são atualizadas.
2.2. Ford – Moore – Bellman:
O algoritmo de Ford-Moore-Bellman tem a mesma finalidade que o algoritmo de Dijkstra, porém,
diferentemente do primeiro, este algoritmo trabalha com vetor distância. Sua principal característica é
a avaliação e reavaliação dos custos de cada um dos nós ao nó raiz; o algoritmo chega ao fim,
quando a variação entre a avaliação atual e a anterior é nula para todos os nós. Assim, o algoritmo
pode convergir em menos n iterações, ao passo que para o algoritmo de Dijkstra o número de
iterações é sempre n.
2.3. Prim:
O objetivo deste algoritmo é gerar a árvore mínima para cada instância fornecida. A cada
iteração, busca-se a aresta de menor custo ainda não contida na árvore mínima e que não forme ciclo
com as arestas já escolhidas como parte da árvore mínima. O nó raiz é fornecido, e a partir dele,
gera-se a árvore mínima (de custo mínimo).
2.4. Prim Colorido:
Este procedimento é essencialmente o mesmo apresentado na seção 2.3, com a diferença de
que, neste algoritmo a árvore mínima é colorida de azul, os arcos examinados são coloridos de verde
e os nós que formam ciclos e que apresentam custo alto se comparados aos vizinhos são coloridos
de vermelho, não sendo mais sondados. Segue o fluxograma deste algoritmo.
2.5. Kruskal:
Este algoritmo é aplicado a grafos cujas ligações são todas unidirecionais e tem como base
a seguinte metodologia:
• Escolhe-se o arco de menor custo do grafo e inicia-se a construção da árvore;
• A partir daí, busca-se iterativamente o próximo arco de menor custo, incluindo-os
sucessivamente na árvore;
• O passo anterior é repetido até que todos os nós estejam incluídos na árvore, isto
é, até que se forme a árvore mínima, evitando-se sempre a formação de ciclos.
2.6. Boruϋska:
Este algoritmo trabalha de forma similar ao algoritmo de Kruskal. Mas ao contrário do primeiro, o
algoritmo de Boruvska identifica o arco de menor custo fora de todos os componentes conectados
pela face. Isto elimina a necessidade de classificação dos arcos, imposta pelo algoritmo de Kruskal.
Este é um algoritmo extremamente rápido e capaz de ser executado em paralelo.
Os passos que compõem este algoritmo são: 1) Para cada vértice escolher o seu arco com peso
mínimo. Pode-se dar o caso de, ao executarmos este passo, ficarmos com dois grafos "nao
conected". Seguidamente consideramos cada par de vértices (ou conjunto de vértices no caso de
estarem ligados vários vértices, como um vértice só e 2) executar de novo o passo 1. Este algoritmo
também pode ser recursivo. O algoritmo acaba quando só temos 1 vértice.
__________________________________________________________________________________________________________
11
Otimização Linear
Teoria dos Grafos & Fluxos em Redes
_______________________________________________________________________________________________________________
II. APRESENTAÇÃO DOS RESULTADOS
1.1. Exercício 1:
No exercício 1, foram implementados os programas para executarem os algoritmos de árvore
mínima[1]. Estes algoritmos são os de Dijkstra e Ford-Moore-Bellman, os quais são apresentados no
apêndice, no final deste relatório.
O objetivo é encontrar o menor caminho de um ponto a outro em um grafo conexo, de acordo
com o que é realizado pelo algoritmo.
Para tal implementação foram utilizados dois grafos. O Grafo 1, possui 20 nós e 25 arcos e o
Grafo 2 possui 20 nós e 48 arcos. Em seguida são apresentados os arquivos de dados de entrada
para os grafos, contendo três vetores: noorigem, nodestino e Custos, os quais são apresentados
abaixo:
Grafo (20 Nós e 25 arcos)
NoOrigem
noorigem=[
1
12
1
12
2
13
2
13
2
14
3
15 ]
3
4
5
5
6
6
7
7
4
16
9
15
4
16 ]
5
7
6
12
7
8
10
14
8
9
10 11
11
9 11
11 13
15
NoDestino
nodestino=[
2
13
5
15
3
14
Custos
Custos=[ 75 120 75 120 300 75 120 150 60 300 75 60 150 300 60 60 105 75 120
60 120 120 75 60 120 ]
Grafo 2 (20 nós e 48 arcos)
NoOrigem
noorigem=[
1 2 1 1 2 3 4 2 3 3 3 4 4 4 5 6 7 8 6
6 7 7 7 8 8 8 9 9 10 11 12 10 10 11 11 12 12 13
13 14 15 15 16 16 17 18 18 19 ]
NoDestino
nodestino=[
2 3 4 5 3 4 5 6 6 7 8 7 8 9 9 7 8 9 10
11 10 11 12 11 12 13 12 13 11 12 13 14 15 15 16 15 16 13
17 18 18 19 18 19 19 19 20 20 ]
Custos
__________________________________________________________________________________________________________
12
Otimização Linear
Teoria dos Grafos & Fluxos em Redes
_______________________________________________________________________________________________________________
Custos=[
1
7
12
4
5
8
2
6
8
6
8
7
2
3
5
8
5
4
9
1
2
3 10
2 6
8 10
7 4 9 6
8 10 14 10
8]
8
9
1
5
8
8
9 10 12
9 5 1
Assim, com os dados de entrada inseridos nos programas para o exercício 1, foram obtidos
os resultados apresentados nas tabelas, para os algoritmo Dijkstra e Ford-Moore-Bellman.
1.1.1. DIJKSTRA E FORD – MOORE – BELLMAN:
Arquivo de entrada: Grafo1_Dados (25 arcos)
Tabela 1: Resultados das implementações com o
algoritmo de Dijkstra
Ford-Moore-Bellman
Djkstra
Nó
Tabela 2: Resultados das implementações com o
algoritmo de Ford-Moore-Bellman
Nó
Valor do
Caminho
0
1
0
Origem de Valor do
Rotulação Caminho
1
1
2
1
75
2
75
3
2
150
3
150
4
2
195
4
195
5
1
120
5
120
6
5
180
6
180
7
6
255
7
255
8
6
240
8
240
9
8
300
9
300
10
7
405
10
405
11
9
360
11
360
12
5
420
12
420
13
11
435
13
435
14
15
540
14
555
15
11
480
15
480
16
13
510
16
510
Tempo de
execução:
170 ms
Tempo de
execução:
170 ms
Número de iterações: 16
Número de iterações: 2
__________________________________________________________________________________________________________
13
Otimização Linear
Teoria dos Grafos & Fluxos em Redes
_______________________________________________________________________________________________________________
Arquivo de entrada: Grafo2_Dados (48 arcos)
Tabela 3: Resultados das implementações com o
algoritmo de Dijkstra
Ford-Moore-Bellman
Dijkstra
Nó
Tabela 4: Resultados das implementações com o
algoritmo de Ford-Moore-Bellman
Origem de Valor do
Rotulação Caminho
Nó
Valor do
Caminho
1
1
0
1
0
2
1
1
2
1
3
2
3
3
3
4
1
2
4
2
5
1
6
5
6
6
2
4
6
4
7
3
10
7
10
8
3
7
8
7
9
5
7
9
7
10
7
15
10
15
11
8
10
11
10
12
9
9
12
9
13
8
8
13
8
14
10
25
14
25
15
11
15
15
15
16
12
14
16
14
17
13
20
17
20
18
16
19
18
19
19
16
18
19
18
20
19
26
20
26
Tempo de
execução:
40 ms
Tempo de
execução:
40 ms
Número de iterações: 20
Número de iterações: 2
__________________________________________________________________________________________________________
14
Otimização Linear
Teoria dos Grafos & Fluxos em Redes
_______________________________________________________________________________________________________________
1.2. Exercício 2:
No exercício 2, o objetivo foi implementar os programas para executarem os algoritmos de
caminho mínimo[2]. Estes algoritmos são os de Prim, Prim-Colorido, Kruskal e Boruϋka, os quais são
apresentados no apêndice, no final deste relatório.
Os resultados foram obtidos implementando os mesmos arquivos de entrada, como apresentado
na seção 1.1, ou seja, foi utilizado o mesmo arquivo de dados do Exercício acima. Os resultados
estão apresentados nas tabelas 5 e 6.
Arquivo de entrada: Grafo1_Dados (25 arcos)
Tabela 5: Resultados apresentados para o Grafo 1
Prim
Tempo de
execução:
Número de
iterações:
Prim-Colorido
Kruskal
Boruvka
Nó Origem
Nó Destino
Nó Origem
Nó Destino
Nó Origem
Nó Destino
1
2
1
2
5
6
1
2
2
3
1
5
6
8
3
2
3
4
2
3
8
9
4
3
1
5
3
4
9
11
5
6
5
6
5
6
12
13
7
6
6
8
6
7
14
15
8
6
8
9
6
8
3
4
9
8
9
11
8
9
1
2
10
11
6
7
9
11
11
13
11
9
11
13
10
11
6
7
12
13
13
12
11
13
2
3
14
15
13
16
11
15
13
16
16
13
11
10
12
13
10
11
3
5
11
15
13
16
1
5
11
13
15
14
14
15
13
14
14
13
20 ms
15
270 ms
15
110 ms
24
Nó Origem Nó Destino
170 ms
2
__________________________________________________________________________________________________________
15
Otimização Linear
Teoria dos Grafos & Fluxos em Redes
_______________________________________________________________________________________________________________
Arquivo de entrada: Grafo2_Dados (48 arcos)
Tabela 6: Resultados apresentados para o Grafo 2
Prim
Tempo de
execução:
Número de
iterações:
Prim-Colorido
Kruskal
Boruvka
Nó Origem
Nó Destino
Nó Origem
Nó Destino
Nó Origem
Nó Destino
Nó Origem Nó Destino
1
2
1
2
1
2
1
2
1
4
1
4
5
9
3
2
2
3
2
3
8
13
4
1
2
6
2
6
2
3
5
9
3
8
3
8
9
12
6
2
8
13
5
9
1
4
7
10
8
11
7
10
17
19
8
13
8
12
7
11
8
11
11
8
12
9
8
11
2
6
12
9
9
5
8
12
16
19
14
18
11
15
8
13
3
8
15
11
12
16
9
12
11
15
16
19
16
19
11
15
12
16
17
19
19
17
12
16
16
18
18
16
16
18
14
18
7
10
20
19
11
7
16
18
8
12
3
8
7
10
16
19
7
11
7
11
19
20
17
19
14
18
12
8
18
14
19
20
19
20
16
12
20 ms
19
220 ms
19
80 ms
45
20 ms
2
__________________________________________________________________________________________________________
16
Otimização Linear
Teoria dos Grafos & Fluxos em Redes
_______________________________________________________________________________________________________________
1.3. Exercício 3:
O exercício 3, proposto segue o seguinte enunciado:
Uma empresa que produz fogões instalou duas fábricas - uma em São Paulo e outra em
Campinas - dois depósitos - um em Bauru e outro em Ribeirão-Preto. A Fábrica de São Paulo produz
1500 unidades por mês e a Fábrica de Campinas produz 1000 unidades por mês. Toda produção é
enviada aos depósitos, para depois ser distribuída para Franca, Araçatuba e Ourinhos, com
demandas de 950, 1000 e 1220, respectivamente. Transferência entre os depósitos é limitada em 50
unidades por mês, sem custo. Os custos de transporte estão apresentados na tabela 1 conforme é
apresentado na tabela 7, relacionada abaixo:
Tabela 7: Custos de transportes entre os depósitos e fábricas.
De/Para
Bauru
Ribeirão-Preto
Franca
São Paulo
7
8
Campinas
4
7
Bauru
7
Ribeirão-Preto
8
Araçatuba
5
7
Ourinhos
6
9
O problema apresentado acima segue a seguinte forma matricial:
min fo = c ' x
⎧ Ax = b
s.a
⎨
⎩ x = {xi }| xi ≥ 0 ∀ i
Desta forma, a formulação do problema apresentado foi realizada conforme é apresentado
abaixo:
Os dados de entrada no método simplex utilizado para resolução do problema, são
apresentados abaixo:
A=[
1
1
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
1
1
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
1
0
0
1
0
0
0
0
0
0
0
0
0
0
0
0
0
1
0
0
1
0
0
0
0
0
0
0
0
0
0
0
0
0
1
0
0
1
0
0
0
0
0
0
-1
0
-1
0
1
1
1
0
0
0
1
-1
1
0
0
0
0
-1
0
-1
0
0
0
1
1
1
-1
1
0
1
0
0
0
0
0
0
0
0
0
0
0
0
1
0
0
0
1
0
0
0
0
0
0
0
0
0
0
0
0
1
0
0
0
1
]
b=[ 1500 1000 950 1000 1220
0
0
50
50 ]
c=[
-5
-6
-8
8
-7
-9
0
0
0
0
0
]
-7
-8
-4
-7
-7
__________________________________________________________________________________________________________
17
Otimização Linear
Teoria dos Grafos & Fluxos em Redes
_______________________________________________________________________________________________________________
Para resolução deste exercício foram utilizados dois métodos. Primeiro utilizou-se o algoritmo
baseado no método simplex. Os resultados obtidos com o algoritmo para resolução do método estão
apresentados na tabela 8, relacionada abaixo:
Tabela 8: Resultados do método simplex
RESULTADOS DO MÉTODO SIMPLEX
X= [1500 0 1000 0 950 1000 1220 0 0 0 0 0 550 0 50 50]
Função Objetivo: 33470
A resolução do exercício 3, baseada em fluxo em redes é apresentado em anexo, no final deste
relatório.
III. COMENTÁRIOS:
EXERCÍCIO 1:
Os programas implementados neste exercício, mostram a extrema semelhança entre os
algoritmos de Dijkstra e Ford-Moore-Bellman, tanto no tempo de execução, como nos resultados
apresentados nas tabelas citadas acima.
No número de iterações, contatou-se que o algoritmo de Ford_Moore-Bellman apresentou
melhores resultados que o de Dijkstra, tanto para ambos arquivos de entrada com Grafos de 25 e 48
arcos..
EXERCÍCIO 2:
Os programas implementados neste exercício, apresentaram que os algoritmos Prim e
Boruvska possuem melhores resultados, quanto ao tempo de execução e número de iterações. Para
redes maiores (20 nós e 48 arcos), o tempo de simulação do algoritmo Prim Colorido apresentou
resultados bem superiores que os demais.
EXERCÍCIO 3:
No Exercício 3, o valor da função-objetivo é igual a 33470. Importante destacar que, se, a
título de simulação retirarem-se os fluxos entre os armazéns, o valor da função-objetivo não muda,
uma vez que o custo de transporte entre 3 e 4 é nulo.
IV. CONCLUSÃO:
Podemos dizer que os algoritmos implementados, apresentaram resultados satisfatórios
comparados com a teoria apresentada. A implementação dos mesmos se deu de forma bastante
simples apresentando as principais características entre algoritmos de caminho mínimo e de geração
de árvore mínima.
Os vários problemas apresentados no dia-dia , como fluxo em redes, encaminhamento de
chamadas/serviços, tráfego telefônico, problemas de comunicação e conexões entre outros, foram
um estimulo a mais para estudos mais avançados no intuito de resolução desses algoritmos .
V. REFERÊNCIAS BIBLIOGRÁFICAS:
[1] Goldbarg M. C., Luna H. P. L., “Otimização Combinatória e Programação Linear”, Ed.
Campus, 2000.
[2] Bazaraa, Jarvis, Sherali – Linear Programming and Network flows, J. Willey and sons, 1990.
__________________________________________________________________________________________________________
18
Otimização Linear
Teoria dos Grafos & Fluxos em Redes
_______________________________________________________________________________________________________________
VI. APÊNDICE 1 - FLUXOGRAMAS:
Fluxograma de Dijkstra
INICIO
Definir matriz com as
distancias que ligam os
nós da rede.
INICIALIZAR AS
VARIAVELS
d ← ∝ , d(Ni) ← 0, A ← (N)
F ← φ, Rot ← 0, t = 1
Fluxograma de Ford-Moore-Bellman
INICIO
Definir matriz com as
distancias que ligam os
nós da rede.
INICIALIZAR AS
VARIAVELS
L (i,k) ← D ( Ni. i)
L (i,k) < ∝
Ant ( i ) ←
T< N
R ← xi, tal que dNi,i ← Min ⎨ dNi,i ⎬
F ← F ∪ ⎨r⎬
A ← A \ ⎨r⎬
V ← A ∩ Γ+( r)
Ant ( i ) ← 0
L (j,k-1) ≠ L(j,k)
L (j,k+1) ← Min ⎨ L(j,k), L (i,k) + D(i,j) ⎬
I ≠ Ni ; j = 1,2,3,...N
K←k+1
Para todo i ∈ V
P ← Min ⎨d(Ni , i), d(Ni , r) + d(r , i)⎬
Se P < d(Ni , i)
d(Ni , i) ← P
Rot ← r
FIM
FIM
Fluxograma de Prim
Fluxograma de Prim Colorido
INICIO
INICIO
Definir matriz com as
distancias que ligam os
nós da rede.
INICIALIZAR AS
VARIAVELS
S←0
I é o vértice inicia escolhida
T←i
V←N\⎨i⎬
Definir matriz com as
distancias que ligam os
nós da rede.
INICIALIZAR AS
VARIAVELS
N ← vértice inicial escolhido
T←N
i←0
Colorir de “x” as arestas que
contem vértice origem Ni
Para | T | ≠ N
_________________________________________________________________________
_________________________________
Para I < N-1
Procurar a aresta menor (j,k) ∈ A tal que
19
Otimização Linear
Teoria dos Grafos & Fluxos em Redes
_______________________________________________________________________________________________________________
Fluxograma de Kruskal
INICIO
Definir matriz D com as
distancias que ligam os
nós da rede.
Ordenar as arestas
no vector H
INICIALIZAR AS
VARIAVELS
T ← hi
Fluxograma de Boruvska
INICIO
Definir matriz com as
distancias que ligam os
nós da rede.
Definir a floresta inicial Tj,
j = 1,2,3,...N com N subarvores
INICIALIZAR AS
VARIAVELS
F←φ
L (j,k-1) ≠ L(j,k)
|T|<N
Tomar a próxima aresta na orem H (hi+1)
se T ← T ∪ hi+1é um grafo cíclico
(arvore) então T ← T ∪ hi
FIM
Para cada Tj ;
Determinar a menor aresta (xa, ya )
Onde xa ∈ Ti
e
Ya ∉ Ti (suponha ya ∈ Tj )
F ← F ∪ (xa, ya)
Aglutinar as duas sub arvores
Ti e Tj
FIM
__________________________________________________________________________________________________________
20
Otimização Linear
Teoria dos Grafos & Fluxos em Redes
_______________________________________________________________________________________________________________
VII. APÊNDICE 2- CÓDIGO FONTE DOS PROGRAMAS
1.1) DJKSTRA
% ------------------------------------------------------------------------%
DJKSTRA
%-------------------------------------------------------------------------% Inicio
function Djkstra;
clear all;
clc;
% Carregando o arquivo de dados
load('Grafo1_Dados');
% Inicializando de valores
tic; % Marcando o tempo
NumArcos = length(noorigem);
vtc = union(noorigem(:),nodestino(:));
n = length(vtc);
S = zeros(n);
V = zeros(n,1); V(1) = 1;
A = ones(n,1);
F = zeros(n,1);
rot = A;
% Montagendo a matriz de custos
for k = 1:NumArcos,
S(nodestino(k),noorigem(k)) = 1;
S(noorigem(k),nodestino(k)) = 1;
custos(noorigem(k),nodestino(k)) = Custos(k);
custos(nodestino(k),noorigem(k)) = Custos(k);
end;
% Fazendo dl = inf, e dl(1) = 0
d1(1) = 0;
__________________________________________________________________________________________________________
21
Otimização Linear
Teoria dos Grafos & Fluxos em Redes
_______________________________________________________________________________________________________________
for i = 2:n,
d1(i) = inf;
end;
p = find(noorigem == 1);
d1(nodestino(p)) = Custos(p);
% Calculando r - no que vai ser fechado
contador = 0;
for t = 1:n
g = inf;
for k = 1:n
if((A(k) == 1)&(g > d1(k)))
g = d1(k);
r = k;
end
end
F(r) = 1;
A(r) = 0;
for k = 1:n
if((S(r,k) == 1)&(A(k) == 1))
V(k) = 1;
end
end
for i = 1:n
if(V(i) == 1)
if(d1(i) > (d1(r) + custos(r,i)))
p = d1(r) + custos(r,i);
else
p = d1(i);
end
if(p < d1(i))
d1(i) = p;
rot(i) = r;
end
end
end
for i = 1:n
V(i) = 0;
end
contador = contador + 1;
end
tempo = toc; % Travando Cronometro
% Exibindo os resultados
__________________________________________________________________________________________________________
22
Otimização Linear
Teoria dos Grafos & Fluxos em Redes
_______________________________________________________________________________________________________________
fprintf('\n')
fprintf('\n
fprintf('\n
fprintf('\n
fprintf('\n
fprintf('\n
for i = 1:n
fprintf('\n
end
fprintf('\n');
fprintf('\n
fprintf('\n
fprintf('\n
fprintf('\n
fprintf('\n
fprintf('\n');
_________________________________________________');
|
Algoritmo - DJKSTRA
|');
_________________________________________________');
No Origem da Rotulacao
Valor do Caminho');
____ _____________________ _________________');
%d
%d
%d
',i,rot(i),d1(i));
_________________________________________________');
Tempo gasto(ms) = %.4f',tempo * 1000);
_________________________________________________');
Numero de iteracoes = %d',contador);
_________________________________________________');
1.2) FORD-MOORE-BELLMAN
% ------------------------------------------------------------------------%
FORD-MOORE-BELLMAN
%-------------------------------------------------------------------------% Inicio
function FordMooreBellman;
clear all;
clc;
% Carregando o arquivo de dados
load('Grafo1_Dados');
% Inicializando de valores
tic; % Comecando a marcar o tempo
NumArcos = length(noorigem);
vtc = union(noorigem(:),nodestino(:));
n = length(vtc);
A = zeros(n);
S = zeros(n);
custo = inf*ones(n);
% Montando a matriz de custos
for j = 1:NumArcos
S(noorigem(j),nodestino(j)) = 1;
custo(noorigem(j),nodestino(j)) = Custos(j);
end
k = 1;
j = 1;
__________________________________________________________________________________________________________
23
Otimização Linear
Teoria dos Grafos & Fluxos em Redes
_______________________________________________________________________________________________________________
lj(1) = 0;
for i = 2:n
lj(i) = custo(1,i);
end
Ls(1) = custo(1,j);
for i = 1:n
for j = 1:n
if (S(i,j) == 1)
ANT(i,j) = i;
end
end
end
contador = 0;
fim = 0;
k = 1;
while((fim == 0)&(k <= n))
fim = 1;
for j = 2:n
menor = lj(j);
for i = 1:n
if((S(i,j) == 1)&(menor > (lj(i) + custo(i,j)))&(i ~= j))
menor = lj(i) + custo(i,j);
end
end
if(menor < lj(j))
fim = 0;
lj(j) = menor;
end
end
k = k + 1;
contador = contador + 1;
end
tempo = toc; %Travando Cronometro
% Exibindo os resultados
fprintf('\n')
fprintf('\n
__________________________________');
fprintf('\n
| Algoritmo - Ford-Moore-Bellman |');
fprintf('\n
__________________________________');
fprintf('\n
No
Valor do Caminho ');
fprintf('\n
____
___________________ ');
for i=1:n
fprintf('\n
%d
%d
',i,lj(i));
end
fprintf('\n');
fprintf('\n
__________________________________');
fprintf('\n
Tempo gasto(ms) = %.4f',tempo * 1000);
__________________________________________________________________________________________________________
24
Otimização Linear
Teoria dos Grafos & Fluxos em Redes
_______________________________________________________________________________________________________________
fprintf('\n
__________________________________');
fprintf('\n
Numero de iteracoes = %d',contador);
fprintf('\n
__________________________________');
fprintf('\n');
1.3) PRIM
% ------------------------------------------------------------------------%
PRIM
%-------------------------------------------------------------------------% Inicio
function prim;
clear all;
clc;
% Carregando o arquivo de dados
load('Grafo1_Dados');
% Inicializando de valores
NumArcos = length(noorigem);
vtc = union(noorigem(:),nodestino(:));
n = length(vtc);
caminho = zeros(1,n);
custo = inf * ones(n);
S = zeros(n);
% Escolhendo o no inicial:
fprintf('\n');
fprintf('\n Com qual no deseja comecar?');
fprintf('\n');
Ni = input('--->');
tic; % Marcando o tempo
T = [];
T(1) = Ni; % No inicial da arvore minima
V = (1:n);
V = V(V ~= Ni);
S = [];
% Montando a matriz de custos
for j = 1:NumArcos
custo(noorigem(j),nodestino(j)) = Custos(j);
custo(nodestino(j),noorigem(j)) = Custos(j);
end
contador = 0;
while length(T) < n
% Encontrando a menor aresta
__________________________________________________________________________________________________________
25
Otimização Linear
Teoria dos Grafos & Fluxos em Redes
_______________________________________________________________________________________________________________
aresta = inf;
for k =1 : length(T)
for i = 1: length(V)
i1 = T(k);
i2 = V(i);
atual = custo(i1,i2);
if (atual < aresta)
aresta = atual;
novo = V(i);
entra = T(k);
end
end
end
T = [T novo];
V = V(V ~= novo);
S = [S entra novo];
contador = contador + 1;
end
tempo = toc; % Travando o cronometro
% Exibindo os resultados
fprintf('\n')
fprintf('\n
____________________________');
fprintf('\n
| Algoritmo - PRIM |');
fprintf('\n
____________________________');
j = 2;
for i = 1:2:length(S)
fprintf('\n
%d - %d
',S(i),S(j));
j = j + 2;
end
fprintf('\n');
fprintf('\n
_____________________________');
fprintf('\n
Tempo gasto(ms) = %.4f',tempo * 1000);
fprintf('\n
_____________________________');
fprintf('\n
Numero de iteracoes = %d',contador);
fprintf('\n
_____________________________');
fprintf('\n');
1.4) PRIM-COLORIDO
% ------------------------------------------------------------------------%
PRIM-COLORIDO
%-------------------------------------------------------------------------% Inicio
function PrimColorido;
clear all;
clc;
__________________________________________________________________________________________________________
26
Otimização Linear
Teoria dos Grafos & Fluxos em Redes
_______________________________________________________________________________________________________________
% Carregando o arquivo de dados
load('Grafo1_Dados');
% Inicializando de valores
tic; % Marcando o tempo
NumArcos = length(noorigem);
% Setando as cores
verde = 0;
azul = 1;
vermelho = 2;
corArc = Inf*ones(NumArcos,1);
Vert = union(noorigem(:),nodestino(:));
Nver = size(Vert,1);
V = Vert;
dist = Inf*ones(Nver,NumArcos);
for i = 1:length(noorigem)
if noorigem(i) == nodestino(i)
Custos(i) = inf;
end
end
% Montando a matriz custos
for i = 1:NumArcos
dist(noorigem(i),i) = Custos(i);
dist(nodestino(i),i) = Custos(i);
end
i = 0;
T = 1;
[xxx, ind] = min(dist(T,:));
corArc(ind) = verde;
contador = 0;
while (i < (Nver-1))
sel = find(corArc == verde);
[xxx, ind] = min(Custos(sel));
corArc(sel(ind)) = azul;
T = union(T,noorigem(sel(ind)));
T = union(T,nodestino(sel(ind)));
sel = find(corArc == verde);
corArc(sel) = Inf;
for j = 1:length(T)
k = T(j);
for l = 1:NumArcos
if ((dist(k,l) ~= Inf)&(corArc(l) ~= azul)&(corArc(l) ~= vermelho))
if (k == noorigem(l))
no2 = nodestino(l);
else
no2 = noorigem(l);
__________________________________________________________________________________________________________
27
Otimização Linear
Teoria dos Grafos & Fluxos em Redes
_______________________________________________________________________________________________________________
end
exis = 0;
arc2 = 0;
for m = 1:NumArcos
if ((dist(no2,m) ~= Inf)&(corArc(m) ~= azul)&(corArc(m) ~= vermelho) & (m
~= l))
if (corArc(m) == verde),
exis = 1;
arc2 = m;
end
end
end
if (exis == 0)
corArc(l) = verde;
else
if Custos(l) < Custos(arc2)
corArc(arc2) = vermelho;
corArc(l) = verde;
else
corArc(l) = vermelho;
corArc(arc2) = verde;
end
end
end
end
end
i = i + 1;
contador = contador + 1;
end
tempo = toc; % Travando o Cronometro
% Exibindo os resultados
fprintf('\n')
fprintf('\n
_______________________________');
fprintf('\n
| Algoritmo - PRIM-COLORIDO |');
fprintf('\n
_______________________________');
for i = 1:NumArcos
if corArc(i) == 1
fprintf('\n
%d - %d %d ',noorigem(i),nodestino(i),Custos(i));
end
end
fprintf('\n');
fprintf('\n
_______________________________');
fprintf('\n
Tempo gasto(ms) = %.4f',tempo * 1000);
fprintf('\n
_______________________________');
fprintf('\n
Numero de iteracoes = %d',contador);
fprintf('\n
_______________________________');
fprintf('\n');
__________________________________________________________________________________________________________
28
Otimização Linear
Teoria dos Grafos & Fluxos em Redes
_______________________________________________________________________________________________________________
1.5) KRUSKAL
% ------------------------------------------------------------------------%
KRUSKAL
%-------------------------------------------------------------------------% Inicio
function Kruskal;
clear all;
clc;
% Carregando o arquivo de dados
load('Grafo1_Dados');
% Inicializando os valores
vtc = union(noorigem(:),nodestino(:));
n = length(vtc);
NumArcos = length(noorigem);
caminho = zeros(1,n);
NoInic = 1;
tic; % Comecando a marcar o tempo
custo = inf * ones(n);
% Montagendo a matriz de custos
for j = 1:NumArcos,
custo(noorigem(j),nodestino(j)) = Custos(j);
custo(nodestino(j),noorigem(j)) = Custos(j);
end;
MS = triu(custo,1);
[C1 C2] = find(MS ~= 0 & MS ~= Inf);
H = [C1 C2];
for i = 1: length(H)
Dist(i) = custo(H(i, 1), H(i, 2));
end
for i = 1 : length(Dist)-1,
for j = i + 1:length(Dist),
if Dist(i) > Dist(j)
aux = Dist(i); Dist(i) = Dist(j); Dist(j) = aux;
aux = H(i,1); H(i,1) = H(j,1); H(j,1) = aux;
aux = H(i,2); H(i,2) = H(j,2); H(j,2) = aux;
end
end
end
T = [H(1,1) H(1,2)];
No = T;
NT(1) = 2;
__________________________________________________________________________________________________________
29
Otimização Linear
Teoria dos Grafos & Fluxos em Redes
_______________________________________________________________________________________________________________
H( 1 , : ) = [];
Dist( 1 ) = [];
contador = 0;
while length(T) < 2*(NumArcos - 1)
if isempty(H) == 1
break;
end
[L1 C1] = find(No == H(1,1));
[L2 C2] = find(No == H(1,2));
% Funcao que verifica se existe ciclagem
[No, NT, T] = Ver_Ciclagem(L1, L2, No, H, NT, T);
H(1 , :) = [];
Dist( 1 ) = [];
contador = contador + 1;
end
tempo = toc; % Travando o cronometro
% Exibindo os resultados
fprintf('\n')
fprintf('\n
______________________________');
fprintf('\n
| Algoritmo - KRUSKAL |');
fprintf('\n
______________________________');
j = 2;
for i = 1:2:length(T)
fprintf('\n
%d - %d
',T(i),T(j));
j = j + 2;
end
fprintf('\n');
fprintf('\n
______________________________');
fprintf('\n
Tempo gasto(ms) = %.4f',tempo * 1000);
fprintf('\n
______________________________');
fprintf('\n
Numero de iteracoes = %d',contador);
fprintf('\n
______________________________');
fprintf('\n');
1.6) BORUVKA
% ------------------------------------------------------------------------%
BORUVKA
%-------------------------------------------------------------------------% Inicio
function Boruvka;
clear all;
__________________________________________________________________________________________________________
30
Otimização Linear
Teoria dos Grafos & Fluxos em Redes
_______________________________________________________________________________________________________________
clc;
% Carregando o arquivo de dados
load('Grafo1_Dados');
tic; %Comecando a marcar o tempo
NumArcos = length(noorigem);
vtc = union(noorigem(:),nodestino(:));
n = length(vtc);
caminho = zeros(1,n);
% Inicializando o vetor de custos
custo = inf*ones(n);
for j = 1:NumArcos
custo(noorigem(j),nodestino(j)) = Custos(j);
custo(nodestino(j),noorigem(j)) = Custos(j);
end;
for i = 1 : n
T(i,1) = i;
NT(i) = 1;
end
contador = 0;
F = [];
while length(F) < 2*(n-1)
V = [];
net = size(T,1);
for i = 1 : net
min = inf;
for k = 1 : NT(i),
for j = 1 : net
if i ~= j
for m = 1 : NT(j),
if custo(T(i,k),T(j,m)) < min
min = custo(T(i,k),T(j,m));
no = T(i,k);
nd = T(j,m);
end
end
end
end
end
V = [V no nd];
end
for i = 1 : 2 : length(V),
[Lin1 Col1] = find(T == V(i));
[Lin2 Col2] = find(T == V(i+1));
if Lin1 ~= Lin2
for j = 1 : NT(Lin2),
NT(Lin1) = NT(Lin1) + 1;
__________________________________________________________________________________________________________
31
Otimização Linear
Teoria dos Grafos & Fluxos em Redes
_______________________________________________________________________________________________________________
T( Lin1, NT(Lin1) ) = T( Lin2, j);
end
T( Lin2 , : ) = [];
NT( Lin2 ) = [];
F = [F V(i) V(i+1)];
end
end
contador = contador + 1;
end
tempo = toc; % Travando o cronometro
% Exibindo os resultados
fprintf('\n')
fprintf('\n
_____________________________');
fprintf('\n
| Algoritmo - BORUVKA
|');
fprintf('\n
_____________________________');
j = 2;
for i = 1:2:length(F)
fprintf('\n
%d - %d
',F(i),F(j));
j = j + 2;
end
fprintf('\n');
fprintf('\n
_____________________________');
fprintf('\n
Tempo gasto(ms) = %.4f',tempo * 1000);
fprintf('\n
_____________________________');
fprintf('\n
Numero de iteracoes = %d',contador);
fprintf('\n
_____________________________');
fprintf('\n');
__________________________________________________________________________________________________________
32
Otimização Linear
Teoria dos Grafos & Fluxos em Redes
_______________________________________________________________________________________________________________
VIII. APÊNDICE 3
EXERCÍCIO 3: FLUXO EM REDES
O problema apresentado no trabalho pode ser representado pela figura abaixo:
São Paulo
b1=1500
1
[7]
[7]
Franca
b5=-950
5
[8]
[0, 50, 0]
[8]
Araçatuba
Bauru 3
b3=0
[5]
[7]
6
4
b6=-100
[0, 50, 0]
[6]
Ourinhos
7
Ribeirão Preto
b4=0
[9]
b7=-1220
[4]
[7]
2
b2=1000
Campinas
Existe um desbalanceamento igual a 670 entre a oferta (São Paulo, nó 1; e Campinas, nó 2) e
a demanda (Franca, nó 5; Araçatuba, nó 6; e Ourinhos, nó 7). Assim, foi necessária a introdução de
um novo nó (balanceamento de carga, nó 8) ao grafo do problema.
__________________________________________________________________________________________________________
33
Otimização Linear
Teoria dos Grafos & Fluxos em Redes
_______________________________________________________________________________________________________________
São Paulo
b1=1500
1
[7]
[7]
Franca
b5=-950
5
[8]
[0, 50, 0]
[8]
Araçatuba
[5]
Bauru 3
b3=0
[7]
6
4
b6=-1000
[0, 50, 0]
[6]
Ourinhos
7
Ribeirão Preto
b4=0
8
b =670
3
[9]
Nó de Balanceamento
b7=-1220
[7]
[4]
2
b2=1000
Campinas
Para que o processo iterativo seja iniciado, a introdução de um novo nó (nó artificial, nó 9) foi
necessária. A conexão do nó artificial aos demais nós do grafo, de maneira adequada, fornece uma
solução inicial básica factível. Desta forma, considerando-se que os custos dos arcos artificiais sejam
do tipo M-grande e que o nó 9 seja o nó raiz (w9=0), tem-se:
1
0
1500
5
950
9
0
1000
3
6
4
1220
7
1000
670
2
8
As iterações seguintes têm como primeiro objetivo a eliminação de todos os arcos artificiais
introduzidos no grafo original do sistema. Por fim, deve-se concluir o processo de otimização do
problema de transporte.
__________________________________________________________________________________________________________
34
Otimização Linear
Teoria dos Grafos & Fluxos em Redes
_______________________________________________________________________________________________________________
Custos relativos:
cˆ13 = 7
cˆ14 = 8
cˆ35 = 7 − 2 M
cˆ45 = 8 − 2 M
cˆ34 = 0
cˆ36 = 5 − 2 M
cˆ46 = 7 − 2 M
cˆ43 = 0
cˆ37 = 6 − 2 M
cˆ47 = 9 − 2 M
cˆ24 = 7
cˆ23 = 4
cˆ85 = −2 M
cˆ86 = −2 M
cˆ87 = −2 M
⇒ Entra arco (8,5)
⇐ sai arco (8,9)
Custos relativos:
cˆ13 = 7
cˆ14 = 8
cˆ35 = 7 − 2 M
cˆ45 = 8 − 2 M
cˆ34 = 0
cˆ36 = 5 − 2 M
cˆ46 = 7 − 2 M
__________________________________________________________________________________________________________
cˆ43 = 0
cˆ37 = 6 − 2 M
35
Otimização Linear
Teoria dos Grafos & Fluxos em Redes
_______________________________________________________________________________________________________________
⇒ Entra arco (3,6)
⇐ sai arco (3,9)
Custos relativos:
cˆ13 = 12 − 2 M
cˆ14 = 8
cˆ35 = 2
cˆ45 = 8 − 2 M
cˆ34 = −5 + 2 M
cˆ46 = 7 − 2 M
cˆ43 = 5 − 2 M
cˆ37 = 1
cˆ47 = 9 − 2 M
cˆ24 = 7
cˆ23 = 9 − 2 M
__________________________________________________________________________________________________________
cˆ86 = 0
cˆ87 = 0
36
Otimização Linear
Teoria dos Grafos & Fluxos em Redes
_______________________________________________________________________________________________________________
⇒ Entra arco (4,3)
⇐ sai arco (4,9)
Custos relativos:
cˆ13 = 12 − 2 M
cˆ14 = 13 − 2 M
cˆ35 = 2
cˆ45 = 3
cˆ34 = 0
cˆ46 = 2
cˆ37 = 1
cˆ47 = 4
cˆ24 = 12 − 2 M
cˆ23 = 9 − 2 M
cˆ86 = 0
cˆ87 = 0
⇒ Entra arco (2,3)
⇐ sai arco (9,6)
__________________________________________________________________________________________________________
37
Otimização Linear
Teoria dos Grafos & Fluxos em Redes
_______________________________________________________________________________________________________________
Custos relativos:
cˆ13 = 3
cˆ14 = 4
cˆ35 = 11 − 2 M
cˆ45 = 12 − 2 M
cˆ34 = 0
cˆ46 = 2
cˆ37 = 10 − 2 M
cˆ47 = 13 − 2 M
cˆ24 = 3
cˆ86 = −9 + 2 M
cˆ87 = 0
⇒ Entra arco (3,7)
⇐ sai arco (2,9)
__________________________________________________________________________________________________________
38
Otimização Linear
Teoria dos Grafos & Fluxos em Redes
_______________________________________________________________________________________________________________
Custos relativos:
cˆ13 = 13 − 2 M
cˆ14 = 14 − 2 M
cˆ35 = 1
ĉ45 = 2
ĉ34 = 0
ĉ46 = 2
ĉ47 = 3
ĉ24 = 3
cˆ86 = 1
ĉ87 = 0
⇒ Entra arco (1,3)
⇐ sai arco (9,7)
__________________________________________________________________________________________________________
39
Otimização Linear
Teoria dos Grafos & Fluxos em Redes
_______________________________________________________________________________________________________________
Custos relativos:
cˆ14 = 1
cˆ35 = 14 − 2 M
cˆ45 = 15 − 2 M
cˆ34 = 0
cˆ46 = 2
cˆ47 = 3
cˆ24 = 3
cˆ86 = −12 + 2 M
cˆ87 = −12 + 2 M
⇒ Entra arco (3,5)
⇐ sai arco (9,5)
__________________________________________________________________________________________________________
40
Otimização Linear
Teoria dos Grafos & Fluxos em Redes
_______________________________________________________________________________________________________________
Término da Fase I
Fase II :
Custos relativos:
cˆ14 = 1
cˆ45 = 1
cˆ34 = 0
cˆ46 = 2
cˆ47 = 3
cˆ24 = 3
cˆ86 = 2
cˆ87 = 1
__________________________________________________________________________________________________________
41
Otimização Linear
Teoria dos Grafos & Fluxos em Redes
_______________________________________________________________________________________________________________
Solução ótima
Esta última iteração representa a solução ótima para o problema, pois os custos relativos
reduzidos, relacionados a todos os arcos são não positivos. Portanto, a partir do grafo ótimo, foram
obtidos os seguintes resultados:
x * = [x13
x 23
x35
x36
x37
x 43
x85
x* = [1500 1000 280 1000 1220 0 670
]'
]'
__________________________________________________________________________________________________________
42
Download