Você está na página 1de 40

UNIVERSIDADE DO ESTADO DE MINAS GERAIS

FACULDADE DE ENGENHARIA
CAMPUS JOÃO MONLEVADE

PESQUISA OPERACIONAL

Caio Veloso
Dante Silva
Gustavo Amora
Marcelo Viana
Matheus Barbosa
Matheus Cardoso
PESQUISA OPERACIONAL

Trabalho apresentado ao Professor Geraldo Paulino


como parte da disciplina Pesquisa Operacional,
referente ao 10º período do curso de Engenharia de
Minas.

João Monlevade
2013
1. Fluxo Custo Mínimo

1.1 - Estudo:
Este problema possui papel principal entre os modelos de otimização, uma vez que este engloba uma enorme
quantidade de aplicações e pode ser resolvido de maneira extremamente eficiente. O Problema de Fluxo de Custo Mínimo
é um Problema de Programação Linear, logo o Simplex pode ser utilizado para sua resolução.
Considerações:
1. A rede é representada por um Dígrafo (orientada) e conectada.
2. No mínimo um dos nós é um “nó de fornecimento” (origem).
3. No mínimo um dos nós é um “nó de demanda” (destino).
4. Todos os nós restantes são “nós Transshipment” (entreposto, intermediário).
5. A rede possui arcos, tanto quanto forem necessários, com capacidade suficiente para habilitar todos os fluxos
gerados nos nós de fornecimento para alcançar os nós de demanda.
6. O custo do fluxo através de cada arco é proporcional a quantidade daquele fluxo, onde o custo por
unidade de fluxo é conhecido.
7. O objetivo é minimizar o custo total de enviar o fornecimento disponível através da rede para satisfazer a demanda
dada (um objetivo alternativo é maximizar o lucro total para fazer isto).
1.2 – Modelo:
Considere um Dígrafo conectado, onde nos n nós incluem-se no mínimo um nó de fornecimento e no mínimo um nó de
demanda. As variáveis de decisão (de controle) são xij = fluxo no arco (i,j). As informações necessárias são:

cij = custo por unidade de fluxo no arco (i,j)

uij = capacidade de fluxo no arco (i,j)

b = fluxo na rede gerado no nó i; b < 0 se o nó i é um nó de demanda; bi = 0 se o nó i é um nó transshipment


i i
bi > 0 se o nó i é um nó de fornecimento
1.3– Exemplo:
1.4 – Código Matlab
>> Z = [2; 4; 9; 3; 1; 3; 2;]

Z=

2
4
9
3
1
3
2
>> A = [1 1 1 0 0 0 0; -1 0 0 1 0 0 0; 0 -1 0 -1 1 0 0; 0 0 -1 0 0 1 -1; 0 0 0 0 -1 -1 1; 1 0 0 0 0 0 0; 0 0 0 0 1 0 0]

A=

1 1 1 0 0 0 0
-1 0 0 1 0 0 0
0 -1 0 -1 1 0 0
0 0 -1 0 0 1 -1
0 0 0 0 -1 -1 1
1 0 0 0 0 0 0
0 0 0 0 1 0 0

>> b = [50; 40; 0; -30; -60; 10; 80]

b=

50
40
0
-30
-60
10
80

>>lb = zeros(7,1)

lb =

0
0
0
0
0
0
0
>> [x, vf, i1, i2, i3] = linprog(Z, A, b, [], [], lb)

Optimization terminated.

x=

0.0000
40.0000
10.0000
40.0000
80.0000
0.0000
20.0000

vf =

490.0000

i1 =

i2 =

iterations: 6
algorithm: 'large-scale: interior point'
cgiterations: 0
message: 'Optimization terminated.'
constrviolation: 3.4319e-012

i3 =

ineqlin: [7x1 double]


eqlin: [0x1 double]
upper: [7x1 double]
lower: [7x1 double]
2 – Caminho Mais Curto

2.1 - Definição:

Os problemas de caminho mais curto com um só objetivo são fundamentais e frequentes quando se estudam problemas em
redes, por exemplo de transportes ou de comunicações. Este problema surge quando se pretende determinar o caminho
mais curto, mais barato ou mais viável, entre um ou vários pares de nós de uma rede.
Estes problemas surgiram a partir de adaptações a uma grande variedade de problemas práticos, não só como modelos
únicos mas também como subproblemas de problemas mais complexos. Por exemplo, surgiram nas indústrias de
telecomunicações e de transportes sempre que se pretendia enviar uma mensagem, ou um veículo, entre dois locais
geograficamente distantes, o mais rápido ou o mais barato possível.
O planeamento do tráfego urbano fornece um outro exemplo importante : os modelos utilizados para o cálculo do fluxo de
tráfego padrão são problemas de optimização não linear, ou modelos de equilíbrio complexos. Contudo, a maioria das
abordagens algorítmicas para determinar tráfegos urbanos padrão consiste, sob hipóteses simplificadoras, em resolver um
grande número de problemas de caminho mais curto como subproblemas (um para cada par de nós origem−destino na rede)
[1].
Existem três tipos de problemas de caminho mais curto :
• de um nó para outro,
• de um nó para todos os outros (árvore dos caminhos mais curtos),
• entre todos os pares de nós.
2.2 - Modelo genérico

2.3 - Soluções

Uma fábrica de artigos de decoração, localizada em Lambari (MG), deve entregar uma grande quantidade de peças na
cidade de Baependi (MG). A empresa quer saber qual o caminho que seu caminhão de entregas deve fazer para minimizar a
distância total percorrida. A figura a seguir, extraída de Lachtermacher (2004), representa, na forma de rede, as ligações
entre as cidades da região.
Solução:
(a) Variáveis de decisão:
X ij =1; se o arco (i; j) pertencer ao caminho;0; caso contrário.
(b) Função objetivo:
min f(x) = 41x12 + 44x13 + 50x15 + 37x24 + 27x35 + 45x46 + 4x56
(c) Restrições:
c.1) Equilíbrio de fluxo nos nós:

c.2) Integralidade e não-negatividade:


Considere os seguintes parâmetros de entrada:
V : Conjunto dos vértices (nós)
dij : Distância do vértice i ao vértice j
n : Cardinalidade do conjunto de vértices, isto é, n = /V/

Considerando o nó 1 como o nó origem e n como o nó destino, pode-se modelar o problema de caminho mínimo
genericamente como:

2.4 - Matlab

>> C= [ 41 ; 44; 50; 37; 27; 45; 4]

C=

41
44
50
37
27
45
4
>> A= [ 1 1 1 0 0 0 0 ; 1 0 0 -1 0 0 0; 0 1 0 0 -1 0 0; 0 0 0 1 0 -1 0 ; 0 0 1 0 1 0 -1; 0 0 0 0 0 1 1]

A=

1 1 1 0 0 0 0
1 0 0 -1 0 0 0
0 1 0 0 -1 0 0
0 0 0 1 0 -1 0
0 0 1 0 1 0 -1
0 0 0 0 0 1 1

>> b= [1; 0 ;0 ;0 ;0; 1]

b=

1
0
0
0
0
1

>> lb=zeros(6,1)

lb =

0
0
0
0
0
0

>> [X,vf,i1,i2]=bintprog (C,[],[],A,b)


Optimization terminated.

X=

0
0
1
0
0
0
1

vf =

54

i1 =
1

i2 =

iterations: 0
nodes: 1
time: 0.8268
algorithm: 'LP-based branch-and-bound'
branchStrategy: 'maximum integer infeasibility'
nodeSrchStrategy: 'best node search'
message: 'Optimization terminated.'
3 – Designação:

3.1: Estudo:
Um caso especial do modelagem é aquele em que cada origem tem uma unidade disponível e cada destino necessita também
de uma unidade. É o caso de escalar vendedores para regiões de vendas, máquinas para diversos locais etc. Essa
característica torna o algoritmo de soluções bastante simples. Antes de aplicá-lo, devemos verificar se o modelo está
equilibrado. No modelo de designação, o número de origens deve ser igual ao número de destinos devido a sua característica.
Caso isso não ocorra, devemos construir origens ou destinos auxiliares, com custo de transferência zero.

Roteiro para resolução de Problemas de Designação:


1) O número de linhas dever ser igual ao de colunas. Se não for acrescentar linhas ou
colunas fantasmas, ou seja, seus valores deverão ser igual a Zero.
2) Subtrair o menor elemento de cada linha pelos restantes da mesma linha.
3) Do quadro resultante subtrair o menor elemento de cada coluna pelos outros elementos
desta mesma coluna.
4) Fazer o teste de otimidade.
a) Traçar um número mínimo de retas que cubra todos os zeros do quadro.
b) As retas devem ser horizontais ou verticais
c) Se o número de retas traçadas for menor que o número de linhas ou colunas então ir
para o item 5, caso contrário se o número de retas for igual ao número de linhas ou
colunas então é a Solução Ótima ir para item 6.
5) Tomar o menor elemento não coberto pelas retas traçadas e subtrai-los dos demais
elementos não cobertos pelas retas. Somar esse elemento aos que se encontram na
intersecção das retas. Todos os demais permanecem inalterados. Voltar ao item 4.
6) Para encontrar a designação ótima substituir os zeros pelos valores dispostos no primeiro
quadro. Informar o custo ou lucro total.
3.2 – Modelo:

3.3 – Exemplo:

Deseja-se designar quatro operários para quatro tarefas, de maneira que o número total de homens-hora seja mínimo. Cada
homem desempenha cada tarefa em um determinado número de horas, conforme indicam os dados da matriz de custos da
figura 1:
Figura 1: Matriz de custos

Na seqüência, determinam-se os menores números de cada linha, indicados ao lado da matriz de custos da figura 1, e efetua-
se a subtração destes de todos os elementos das linhas correspondentes, obtendo-se a Matriz de Custos Modificada da Figura
2.

Figura 2:Identificação dos Menores Números de cada Linha

Figura 3: Matriz de Custos Modificada

Agora se deve identificar o menor número em cada coluna, conforme a Figura 3, e pela subtração destes em cada coluna tem-
se a nova Matriz de Custos Modificada da Figura 4.
Figura 4: Identificação dos Menores Números de cada Coluna

Figura 5: Segunda Matriz de Custos Modificada


Nesta segunda Matriz de Custos Modificada é possível identificar, por inspeção, uma designação viável que utiliza as posições
em que o custo associado é nulo, ou seja, é possível achar a designação ótima dada na Figura 6.
Figura 6: Designação Ótima
Assim, a designação ótima a partir da matriz de custos modificada da Figura 6 é:

A Matriz das Variáveis de Decisão será:

O tempo total a ser gasto é determinado pelo produto da matriz de custos inicial pela matriz X:
T = 5.1 + 3.1 + 9.1 + 3.1 = 20 horas.
O mesmo valor pode ser obtido somando-se as constantes que foram subtraídas de cada linha e cada coluna.
3.4 - Matlab:

m_custos = [ 5 24 13 7; 10 25 3 23; 28 9 8 5; 10 17 15 3 ];

[elemento, indice] = min(m_custos, [], 2);

m_custos_mod = m_custos;

for i = 1:4
m_custos_mod(i, :) = m_custos_mod(i, :) - elemento(i);
end
m_custos_mod

[elemento2, indice2] = min(m_custos_mod);

m_custos_mod2 = m_custos_mod;

for i = 1:4
m_custos_mod2(:, i) = m_custos_mod2(:, i) - elemento2(i);
end

m_custos_mod2
X = double((m_custos_mod2 == 0));

for i = 1:4
for j = 1:4
if( X(i,j) == 1)
if((sum(X(i,:)) > 1)&&(sum(X(:,j)) > 1))
X(i,j) = 0;
end
end
end
end

tempo_gasto = sum(sum(m_custos.*X))
tempo_gasto2 = sum(elemento) + sum(elemento2)

Resultado:
m_custos_mod =

0 19 8 2
7 22 0 20
23 4 3 0
7 14 12 0

m_custos_mod2 =

0 15 8 2
7 18 0 20
23 0 3 0
7 10 12 0
X=

1 0 0 0
0 0 1 0
0 1 0 0
0 0 0 1

tempo_gasto =

20
tempo_gasto2 =

20
4 – P-MEDIANA
5
a) Formulação Genérica

Sendo que:
-Na primeira linha , ocorre a minimização das distancias ponderadas entre
clientes e os postos que oferecem serviço por exemplo.
-Na segunda linha, cada cliente i é alocado a somente uma instalação j.
-Na terceira linha, Garante que somente p instalações oferecem o serviço
proposto;
-Na quarta linha , Afirmam que um cliente somente é atendido num local onde
existe uma instalação que oferece o serviço.

Exemplo numérico e o seu diagrama

Teitz e Bart
Com o intuito de apresentar o problema das p-medianas de forma clara e
simples será proposto um exemplo didático a ser resolvido pelo método mais
citado na literatura, a heurística de Teitz e Bart.

Exemplo Numérico
Dado:
1

Os números em vermelho são as distâncias entre os vértices e os números em azul


são os pesos de cada vértice. Metaforicamente pode-se imaginar que os
números vermelhos são as distâncias em quilômetros entre as cidades (pontos ou
nós) e os números azuis são quantas vezes a cidade deve ser visitada.
Objetivo: O objetivo é encontrar a localização de 3 medianas de modo que a soma
das distancias percorridas seja a menor possível.
Resolução: Neste grafo G(X,A) , temos X={x1, x2, ...,x10} e A{a1,a2,...a19} e temos
ainda o conjunto de “pesos” hj , ou seja, em nosso exemplo temos h1=2 ,h2=5
e assim por diante.
A matriz de distâncias mínimas deste grafo é:
2

A matriz distância multiplicada pelos respectivos pesos de cada vértice é:

Obs:a tabela representa a matriz peso-distancia.


Se o objetivo fosse encontrar uma mediana, isso poderia ser feito pelo método
exato, bastando somar as linhas da matriz. A linha que obtivesse a menor soma
seria a mediana, o que resultaria no nó sete.
Relembrando o problema formulado com programação inteira:
3

E o número de transmissão:

Número de transmissão para subconjuntos:

Como se deseja instalar três facilidades e resolvendo pelo método de Teitz e


Bart, temos:
Passo 1) Selecionar arbitrariamente S com p vértices:

Neste instante, tem-se:


4

Issosignifica dizer que as medianas são os pontos x1 , x2 e x3 . Eo total de


quilômetros percorridos para atender todas as cidades é de 1001 km.
Passo 2) Selecionar algum nó não testado (por exemplo,x4 ) e calcular:

Passo 3) Encontrar o

Passo 3.ii) , fazer:

E rotular x4 como “testado” e volte ao passo 2 até que não se tenham mais nós
rotulados como “não testados”.

Atualmente:FO=951 e S=(x2,x3,x4}

Passo 2) Selecionar algum nó “não testado”(x9) e calcular .

Passo 3)

Passo 3.ii) fazer:

Rotular x9 como “testado” e vá ao P2.


5

Atualmente: FO=630 e S={x2,x4,x9}.

Passo 2) Selecionar um nó “não testado”(x1) e calcular .

Passo 3)

Passo 3.i) faça:


Rotule x1 como testado e vá ao passo 2.
Atualmente: FO=630 e S={x2,x4,x9}
Testados: x1, x3
Atualmente: FO=620 e S={x2,x5,x9}
Após testar os pontosx1, x3, x4, x6 sem sucesso, houve uma reduçãono vértice x7,
assim:
Atualmente:FO=528 e S={x2,x7,x9}
Os pontos 1, 3, 4, 5, 6, 7, 8 foram testados e no vértice 8, houve outra redução.
Atualmente: FO=526 e S={x2,x8,x9}
Todos os demais vértices fora do conjunto solução foram testados e não houve
melhoria. Então:
Solução: FO = 526
O passo 4 manda repetir os passos 2 e 3.Este procedimento é denominado “ciclo”.
Se durante o último ciclo, não houver melhora na função objetivo, vá ao passo 5.
Passo 5) Pare.
A solução para este problema são os pontos x2,x8 e x9, que resulta na seguinte
configuração:
6

Matlab

A Pontifícia Universidade Católica de Minas Gerais (PUC-MG) deseja implantar dois


novos campus na cidade de Belo Horizonte para atender o público das regiões Norte
e de Venda Nova. Foi selecionado um terreno nos sete bairros em que há maior
concentração de habitantes para a instalação dos dois novos campus. Busca-se
minimizar a distância média percorrida pelos alunos.
7

Figura 1: Mapa com as coordenadas x e y das localidades.

Sejam os seguintes bairros e suas coordenadas representadas no quadro abaixo:


Vértice
Bairros X Vértice Y
Ceu Azul 1 7
Comerciário 3 5
Europa 5 3
Jardim 3 8
Lagoa 7 2
Leblon 2 6
Mantiqueira 8 5

A partir deles constrói-se a matriz das distâncias euclidianas que será utilizada como
entrada de dados para o desenvolvimento do algoritmo:

Ceu Comerc Mantiqu


Azul iário Europa Jardim Lagoa Leblon eira
Ceu
Azul 0,0 2,8 5,7 2,2 7,8 1,4 7,3
Comerc 2,8 0,0 2,8 3,0 5,0 1,4 5,0
8

iário
Europa 5,7 2,8 0,0 5,4 2,2 4,2 3,6
Jardim 2,2 3,0 5,4 0,0 7,2 2,2 5,8
Lagoa 7,8 5,0 2,2 7,2 0,0 6,4 3,2
Leblon 1,4 1,4 4,2 2,2 6,4 0,0 6,1
Mantiqu
eira 7,3 5,0 3,6 5,8 3,2 6,1 0,0

Os passos para solução do algoritmo são:


 Passo 1: selecione um conjunto S, com p elementos, criado para possibilitar
uma aproximação inicial para as p-medianas.
 Passo 2: rotule todos os vértices vi, não pertencente a S como “não
analisados”.
 Passo 3: enquanto existirem vértices não analisados em V - S, onde V é o
conjunto de vértices do grafo. Faça:
3.1 Selecione um vértice “não analisado” v i Є V – S e calcule a redução Δi j
do número de transmissão para todo vj Є S: Δi j = σ(S) – σ(S U {vi} – {vj})
3.2 Faça Δi j0 = max [Δi j];
3.3 Se Δi j0> 0, faça S ← S U {vi} – {vj0} e rotule vj0 como “analisado”;
3.4 Se Δi j0< 0, rotule vi como “analisado”;
 Passo 4: se durante a execução do passo 3 houver alguma modificação no
conjunto S, volte ao passo 2. Caso contrário, pare e apresente o conjunto S
como uma aproximação para solução do problema das p-medianas.
Vp = {vle, vma} Vp = {vle, vla} Vp = {vma, vla}
d(Vp, vce) = 1,4 d(Vp, vce) = 1,4 d(Vp, vce) = 7,3 σ(Vp) = 10,4
d(Vp, vco) = 1,4 d(Vp, vco) = 1,4 d(Vp, vco) = 5,0
d(Vp, veu) = 3,6 d(Vp, veu) = 2,2 d(Vp, veu) = 2,2
d(Vp, vja) = 2,2 d(Vp, vja) = 2,2 d(Vp, vja) = 5,8
d(Vp, vla) = 3,2 d(Vp, vla) = 0,0 d(Vp, vla) = 0,0
d(Vp, vle) = 0,0 d(Vp, vle) = 0,0 d(Vp, vle) = 6,1 Δlama = 11,8 – 10,4 = 1,8
d(Vp, vma) = 0,0 d(Vp, vma) = 3,2 d(Vp, vma) = 0,0
σ(Vp) = 11,8 σ(Vp) = 10,4 σ(Vp) = 26,4
9

Vp = {vle, vja} Vp = {vma, vja}


d(Vp, vce) = 1,4 d(Vp, vce) = 2,2 σ(Vp) = 14,2
d(Vp, vco) = 1,4 d(Vp, vco) = 3,0
d(Vp, veu) = 4,2 d(Vp, veu) = 3,6
d(Vp, vja) = 0,0 d(Vp, vja) = 0,0
d(Vp, vla) = 6,4 d(Vp, vla) = 3,2
d(Vp, vle) = 0,0 d(Vp, vle) = 2,2 Δjale = 11,8 – 14,2 = - 2,4
d(Vp, vma) = 5,8 d(Vp, vma) = 0,0
σ(Vp) = 19,2 σ(Vp) = 14,2

Vp = {vle, veu} Vp = {vma, veu}


d(Vp, vce) = 1,4 d(Vp, vce) = 5,7 σ(Vp) = 10,8
d(Vp, vco) = 1,4 d(Vp, vco) = 2,8
d(Vp, veu) = 0,0 d(Vp, veu) = 0,0
d(Vp, vja) = 2,2 d(Vp, vja) = 5,4
d(Vp, vla) = 2,2 d(Vp, vla) = 2,2
d(Vp, vle) = 0,0 d(Vp, vle) = 4,2 Δeuma = 11,8 – 10,8 = 1,0
d(Vp, vma) = 3,6 d(Vp, vma) = 0,0
σ(Vp) = 10,8 σ(Vp) = 20,3

Vp = {vle, vco} Vp = {vma, vco}


d(Vp, vce) = 1,4 d(Vp, vce) = 2,8 σ(Vp) = 12,2
d(Vp, vco) = 0,0 d(Vp, vco) = 0,0
d(Vp, veu) = 2,8 d(Vp, veu) = 2,8
d(Vp, vja) = 2,2 d(Vp, vja) = 3,0
d(Vp, vla) = 5,0 d(Vp, vla) = 2,2
d(Vp, vle) = 0,0 d(Vp, vle) = 1,4 Δcole = 11,8 – 12,2 = - 0,4
d(Vp, vma) = 5,0 d(Vp, vma) = 0,0
σ(Vp) = 16,4 σ(Vp) = 12,2
10

Vp = {vle, vce} Vp = {vma, vce}


d(Vp, vce) = 0,0 d(Vp, vce) = 0,0 σ(Vp) = 13,2
d(Vp, vco) = 1,4 d(Vp, vco) = 2,8
d(Vp, veu) = 4,2 d(Vp, veu) = 3,6
d(Vp, vja) = 2,2 d(Vp, vja) = 2,2
d(Vp, vla) = 6,4 d(Vp, vla) = 3,2
d(Vp, vle) = 0,0 d(Vp, vle) = 1,4 Δcele = 11,8 – 13,2 = - 1,4
d(Vp, vma) = 6,1 d(Vp, vma) = 0,0
σ(Vp) = 20,3 σ(Vp) = 13,2

Vp = {vle, vla} Vp = {vle, vma} Vp = {vla, vma}


d(Vp, vce) = 1,4 d(Vp, vce) = 1,4 d(Vp, vce) = 7,3 σ(Vp) = 11,8
d(Vp, vco) = 1,4 d(Vp, vco) = 1,4 d(Vp, vco) = 5,0
d(Vp, veu) = 2,2 d(Vp, veu) = 3,6 d(Vp, veu) = 2,2
d(Vp, vja) = 2,2 d(Vp, vja) = 2,2 d(Vp, vja) = 5,8
d(Vp, vla) = 0,0 d(Vp, vla) = 3,2 d(Vp, vla) = 0,0
d(Vp, vle) = 0,0 d(Vp, vle) = 0,0 d(Vp, vle) = 6,1 Δmala = 10,4 – 11,8 = -1,4
d(Vp, vma) = 3,2 d(Vp, vma) = 0,0 d(Vp, vma) = 0,0
σ(Vp) =10,4 σ(Vp) = 11,8 σ(Vp) = 26,4
11

Vp = {vle, vja} Vp = {vla, vja}


d(Vp, vce) = 1,4 d(Vp, vce) = 2,2 σ(Vp) = 12,8
d(Vp, vco) = 1,4 d(Vp, vco) = 3,0
d(Vp, veu) = 4,2 d(Vp, veu) = 2,2
d(Vp, vja) = 0,0 d(Vp, vja) = 0,0
d(Vp, vla) = 6,4 d(Vp, vla) = 0,0
d(Vp, vle) = 0,0 d(Vp, vle) = 2,2 Δjale = 10,4 – 12,8 = -2,4
d(Vp, vma) = 5,8 d(Vp, vma) = 3,2
σ(Vp) = 19,2 σ(Vp) = 12,8

Vp = {vle, veu} Vp = {vla, veu}


d(Vp, vce) = 1,4 d(Vp, vce) = 5,7 σ(Vp) = 10,8
d(Vp, vco) = 1,4 d(Vp, vco) = 2,8
d(Vp, veu) = 0,0 d(Vp, veu) = 0,0
d(Vp, vja) = 2,2 d(Vp, vja) = 5,4
d(Vp, vla) = 2,2 d(Vp, vla) = 0,0
d(Vp, vle) = 0,0 d(Vp, vle) = 4,2 Δeula = 10,4 – 10,8 = -04
d(Vp, vma) = 3,6 d(Vp, vma) = 3,2
σ(Vp) = 10,8 σ(Vp) = 21,3

Vp = {vle, vco} Vp = {vla, vco}


d(Vp, vce) = 1,4 d(Vp, vce) = 2,8 σ(Vp) = 12,6
d(Vp, vco) = 0,0 d(Vp, vco) = 0,0
d(Vp, veu) = 2,8 d(Vp, veu) = 2,2
d(Vp, vja) = 2,2 d(Vp, vja) = 3,0
d(Vp, vla) = 5,0 d(Vp, vla) = 0,0
d(Vp, vle) = 0,0 d(Vp, vle) = 1,4 Δcole = 10,4 – 12,6 = -2,2
d(Vp, vma) = 5,0 d(Vp, vma) = 3,2
σ(Vp) = 16,4 σ(Vp) = 12,6
12

Vp = {vle, vce} Vp = {vla, vce}


d(Vp, vce) = 0,0 d(Vp, vce) = 0,0 σ(Vp) = 11,8
d(Vp, vco) = 1,4 d(Vp, vco) = 2,8
d(Vp, veu) = 4,2 d(Vp, veu) = 2,2
d(Vp, vja) = 2,2 d(Vp, vja) = 2,2
d(Vp, vla) = 6,4 d(Vp, vla) = 0,0
d(Vp, vle) = 0,0 d(Vp, vle) = 1,4 Δcele = 10,4 – 11,8 = -
1,4
d(Vp, vma) = 6,1 d(Vp, vma) = 3,2
σ(Vp) = 20,3 σ(Vp) = 11,8

% Problema das p-medianas a partir de uma matriz


% simétrica que contém as distâncias euclidiana e duas demandas

clc;closeall; clear;

bairros = [1 3 5 3 7 2 8; ...
7 5 3 8 2 6 5];
tb = length(bairros);

d = zeros(tb,tb);

% Visualiza a distância dos bairros


holdon;
for i = 1 : tb
plot(bairros(1,i), bairros(2,i),'-mo','LineWidth',2,...
'MarkerEdgeColor','k',...
'MarkerFaceColor','g',...
13

'MarkerSize',8);
end
% Calcula a distância euclidiana dos bairros
for i = 1 : tb
for j = 1 : tb
d(i,j) = distH([bairros(1,i) bairros(2,i)],[bairros(1,j) bairros(2,j)]);
end
end

p = 2; % Quantidade de medianas a ser localizada

[n m] = size(d);
custo = zeros(n,m);

H = ones(1,n); % Demanda (Hi) são todos 1's

% Calcula o custo: demanda(Hi) * distância (Dij)


for i = 1 : n
for j = 1 : m
custo(i,j) = d(i,j) * H(i);
end
end

% Variáveis principais
total = zeros(1,n);
F = zeros(p,1); % Guarda as posições de cada mediana (as facilidades)
menor = zeros(p,1); % Guarda o custo total de cada mediana
disposicao = zeros(p,1);
cont = 1;

for qtd = 1 : p

if (p == 1) % Testa se existir somente 1-mediana e encontra a facilidade


for i = 1 : n
14

total(i) = sum(custo(:,i));
end
[menor(qtd) F(qtd)] = min(total);
fprintf('Custo da 1ª facilidade: %2.2f\n',menor(qtd));
fprintf('E sua posição: %d\n', F(qtd));
break;
end
% Passo 1: Se for maior que 2-mediana calcule todos as p-medianas
for i = 1 : n
total(i) = sum(custo(:,i));
end
[menor(qtd) F(qtd)] = min(total);
% Passo 2: zera toda linha
for i = 1 : n
custo(F(qtd),i) = 0;
end
% Passo 3: Calcula o min de cada custo em relação a facilidade
% encontrada
for i = 1 : n
for j = 1 : m
custo(i,j) = min(custo(i,j),custo(i,F(qtd)));
end
end
fprintf('Custo da %dª facilidade: %2.2f\n',qtd ,menor(qtd));
fprintf('E sua posição: %d\n', F(qtd));
end
% Encontrou as Facilidades. Agora vamos determinar a localização dos
% usuários em relação as Facilidades
Facilidades = zeros(2,length(F));
for i = 1: length(F)
Facilidades(:,i) = bairros(:,F(i));
end

for j = 1:length( bairros )


for i = 1:length( Facilidades )
15

%grupo das distancias associadas as facilidades


a(i)= distH([Facilidades(1,i) Facilidades(2,i)],[bairros(1,j) bairros(2,j)]);

plot(Facilidades(1,i),Facilidades(2,i),'ro');
holdon
plot(bairros(1,j),bairros(2,j),'b+')
grid on
end

% usuarios correspondente as facilidades


[m(j) p(j)] = min(a);

plot([bairros(1,j) Facilidades(1,p(j))],[bairros(2,j) Facilidades(2,p(j))],'g--');

end

Você também pode gostar