AULA 10
META-HEURÍSTICAS NO RV
Autor: Anibal Tavares de Azevedo
INTRODUÇÃO À META-HEURÍSTICAS
1 2
3 4 5
6 7
8 9
10
11 12
13 14
Roteamento de Veículos
0
1 2
3 4 5
6 7
8 9
10
11 12
13 14
Roteamento de Veículos
0
2 1
3 4 3
4 2
6
3
1
3 3
3 1
1 2
3 4 5
6 7
8 9
10
11 12
13 14
0
2 1
3 4 3
4 2
6
3
1
3 3
3 1
10
10
10 10
1 2
3 4 5
6 7
8 9
10
11 12
13 14
Roteamento de Veículos
0
1 2
3 4 5
6 7
8 9
10
11 12
13 14
Roteamento de Veículos
0
N = C
∪
∪
∪
∪
{0, n+1}
1 2
3 4 5
6 7
8 9
10
11 12
13 14
Roteamento de Veículos
0
1 2
3 4 5
6 7
8 9
10
11 12
13 14
n+1
E = {(i,j): i, j
∈
∈
∈
∈
N,
i
≠≠≠≠
j, i
≠≠≠≠
n+1, j
≠≠≠≠
0}
1 2
3 4 5
6 7
8 9
10
11 12
13 14
Roteamento de Veículos
n+1
i j xij
Variáveis de Decisão
Xijk= 1 se o veículo k vai do nó i para o nó j.
x
i jk
Origem
(Cidade i)
(Cidade j)
Destino
Veículo k
Roteamento de Veículos
1
5
2
3 x131
x121
Variáveis de Decisão
x151
4
Xijk= 1 se o veículo k vai do nó i para o nó j. x141
x411 x311
x211
x511
1
5
2
3 x131
x121
Dado o veículo 1 na cidade 1, qual será a próxima cidade?
x151
4 x141
x
121
+ x
131
+ x
141
+ x
151
Veículo 1
1
5
2
3 x132
x122
Dado o veículo 1 na cidade 1, qual será a próxima cidade?
x152
4 x142
x
122
+ x
132
+ x
142
+ x
152
Roteamento de Veículos
1
5
2
3 x133
x123
Dado o veículo 1 na cidade 1, qual será a próxima cidade?
x153
4 x143
x
123
+ x
133
+ x
143
+ x
153
Roteamento de Veículos
Veículo 3
1
5
2
3 x134
x124
Dado o veículo 1 na cidade 1, qual será a próxima cidade?
x154
4 x144
x
124
+ x
134
+ x
144
+ x
154
= 1
Roteamento de Veículos
i
5
2
3 xijk
4
Dado o veículo k na cidade i, qual será a próxima cidade j?
C
i
,
1
∀
∈
=
∑ ∑
∈K ∈
k j N ij
x
MAS...
1
4
2
3
5
6 7
As restrições anteriores permitem a existência de sub-rotas !! 1
4
2
3
5
6 7
1
5
2
3 x211
Eliminação de sub-rotas com dois nós
4
x121
x
121
+ x
211
≤≤≤≤
1
Roteamento de Veículos
1 2
x211
Eliminação de sub-rotas com dois nós
x121
x
121
+ x
211
≤≤≤≤
1
1 2 x211
Eliminação de sub-rotas com dois nós
x121
x
121
+ x
211
≤≤≤≤
1
1 2
x211
x121
ou
1 2
x211
Eliminação de sub-rotas com dois nós
x121
x
121
+ x
211
≤≤≤≤
1
1 2
x211
x121
1 2
x211
x121
ou
ou
1
5
2
3 x211
Eliminação de sub-rotas com dois nós
4
x121
x131
x311 x141
x411 x511
x151
x
ijk
+ x
jik
≤≤≤≤
1
Roteamento de Veículos
1
5
2
3 Eliminação de sub-rotas com três nós
4
x121
x231
x311
x
121
+ x
231
+ x
311
≤≤≤≤
2
1
5
2
3 Eliminação de sub-rotas com três nós
4
x
ijk
+ x
jtk
+ x
tik
≤≤≤≤
2
1
5
2
3 Eliminação de sub-rotas com três nós
4
Roteamento de Veículos
K k S C S S x S j i
ijk ∀ ∈
A demanda total da rota não excede a capacidade do veículo k
Roteamento de Veículos
1 2
3 4
0
2 1
3 4
10
x301
x041 x421 x211
x131
d
0x
041+ d
4x
421+ d
2x
211+ d
1x
131+ d
3x
301≤≤≤≤
10
Problema de Designação
1 2
3 4
0
2 1
3 4
10
K
,
∀
∈
≤
∑ ∑
∈ ∈
k
Q
x
d
Ci j N
ijk i
5
2
3 x133
x123
x153
4 x143
x
023
+ x
033
+ x
043
+ x
053
= 1
Veículo 3
0
Restrição de Fluxo em Redes: Veículo sai do depósito 1 só vez
5
2
3 x133
x123
Restrição de Fluxo em Redes: Veículo sai do depósito 1 só vez
x153
4 x143
Roteamento de Veículos
Veículo 3
0
K
k
x
N j
jk
=
∀
∈
∑
∈
Problema de Designação
1
Restrição de Fluxo em Redes: Deixar o nó somente se entrou
x
213
+ x
313
+ x
413
+ x
513
= 0
x213 x313
x413 x513
Veículo 3
Problema de Designação
1
K
C,
,
0
∀
∈
∀
∈
=
−
∑
∑
∈ ∈
k
h
x
x
N
i j N
hjk ihk
5
2
3 x133
x123
x153
4 x143
X
2,n+1,3+ x
3,n+1,3+ x
4,n+1,3+ x
5,n+1,3= 1
Veículo 3
n+1
Restrição de Fluxo em Redes: Veículo sai do depósito 1 só vez
Restrição de Fluxo em Redes: Retornar ao nó n+1 somente 1 vez
5
2
3 x3,n+1,3
x2,n+1,3
x5,n+1,3
4 x4,n+1,3
Veículo 3
n+1
K
k
x
N i
k n
i
=
∀
∈
∑
∈ +
,
1
, 1 ,S.a.:
MODELO COMPLETO GERAL
Roteamento de Veículos
C
i
,
1
∀
∈
=
∑ ∑
∈K ∈
k j N
ij
x
K k S C S S x S j iijk ∀ ∈
≤ ≤ ⊂ − ≤
∑
∈ ; 2 n 2 ; , 1 ,K
,
∀
∈
≤
∑ ∑
∈ ∈k
Q
x
d
C i j Nijk i
K C,
,
0 ∀ ∈ ∀ ∈ = −
∑
∑
∈ ∈ k h x x Ni j N hjk ihk
K
k
x
N jjk
=
∀
∈
∑
∈,
1
0 K k x N i k ni = ∀ ∈
∑
∈ + , 1 , 1 , E K ijkB
x
∈
Min
∑ ∑
= ∈
K
k i j E ijk ij
x
c
1(, )
custo para realizar percorrer a rota i-j
REPRESENTAÇÃO
REPRESENTAÇÃO - VÉRTICES
5
1 4
2 3
1 2 4 1 3 5
SOLUÇÃO
SOLUÇÃO
REPRESENTAÇÃO - VÉRTICES
5
1 4
2 3
1 2 4 1 3 5
SOLUÇÃO
REPRESENTAÇÃO - VÉRTICES
5
1 4
2 3
1 2 4 1 3 5
META-HEURÍSTICA PARA O PRV
SOLUÇÃO
REPRESENTAÇÃO - VÉRTICES
5
1 4
2 3
1 2 4 1 3 5
SOLUÇÃO
REPRESENTAÇÃO - VÉRTICES
5
1 4
2 3
1 2 4 1 3 5
SOLUÇÃO
REPRESENTAÇÃO - VÉRTICES
5
1 4
2 3
1 2 4 1 3 5
SOLUÇÃO
REPRESENTAÇÃO - VÉRTICES
5
1 4
2 3
1 2 4 1 3 5
META-HEURÍSTICA PARA O PRV
SOLUÇÃO
REPRESENTAÇÃO - VÉRTICES
5
1 4
2 3
1 2 4 1 3 5
Tarefa 1: Escrever função em Scilab que desenhasolução do PCV.
+
Cidade Coord. X Coord. Y1 x1 y1 2 x2 y2 3 x3 y3 4 x4 y4 5 x5 y5
=
1 2 4 1 3 5
SOLUÇÃO
REPRESENTAÇÃO - VÉRTICES
2
1 3 4 5 6 7 8 9 10 11 12 13 14
1 2 3 4 5 6 7 8
5
1 4
2 3
1 2 4 1 3 5
Vértice Coordenada X Coordenada Y
1 7 1
2 11 4
3 10 7
4 6 5
5 2 6
2
1 3 4 5 6 7 8 9 10 11 12 13 14
1 2 3 4 5 6 7 8 5 1 4 2 3
META-HEURÍSTICA PARA O PRV
2
1 3 4 5 6 7 8 9 10 11 12 13 14
1 2 3 4 5 6 7 8 Índice 1 2 4 1 3 5 5 1 4 2 3
2
1 3 4 5 6 7 8 9 10 11 12 13 14
1 2 3 4 5 6 7 Índice 1 2 3 1 4 5 5 1 4 2 3 function tspgraf(ind,x,y) clf(gcf(),'clear'); set(gca(),"auto_clear","off"); x = x(ind); // Reordenar usando ind. y = y(ind);
plot(x,y,'ob'); xi = [x x(1)]; yi = [y y(1)]; plot(xi,yi,'-r');
//obtendo manipulador dos eixos a=get("current_axes");
a.data_bounds=[min(x)-1,min(y)-1;max(x)+1,max(y)+1];
endfunction
Desenho 1: desenhar os pontos.
Permitir que 2 desenhos na mesma figura.
Desenho 2: desenhar cada caminho com as linhas.
Limites do gráfico para visualizar a rota ! FUNÇÃO VRPGRAF
function tspteste(ind)
ind = [1 2 4 1 3 5]; // Ordem.
x = [2 6 8 11 13]; y = [2 2 7 5 7];
vrpgraf(ind,x,y);
endfunction
Ordem para percorrer os clientes.
Coordenadas dos pontos
Chamada para desenhar a rota escolhida FUNÇÃO VRPTESTE
META-HEURÍSTICA PARA O PRV
Tarefa 2: Escrever função em Scilab que avaliasolução do PRV.
+
Cidade Coord. X Coord. Y1 7 1
2 11 4
3 10 7
4 6 5
5 2 6
=
27.90 kmMETA-HEURÍSTICA PARA O PRV
function [dist] = vrpdist(ind,M)
ind = [ind; ind(1)];
n = length(ind);
dist = 0;
for i=1:(n-1)
dist = dist + M(ind(i),ind(i+1)); end
endfunction
Total de ligações entre os pontos
Índices da ordem das cidades p/ percorrer
Cálculo da distância total da rota, usando matriz de
distância M(cidade i, cidade j). FUNÇÃO VRPDIST
function [M]=vrpmatrix(x,y)
n = length(x);
for i=1:n
for j=1:n
d=(x(i)-x(j))^2+(y(i)-y(j))^2;
M(i,j) = sqrt(d);
end
end
endfunction
Calcular as distâncias de i para todas as j demais. Número de pontos: linhas
e colunas de M
Cálculo distância de i p/ j. FUNÇÃO VRPMATRIX
x xi
xj yj
yi xj - xi yj -yi d
Tarefa 3: Escrever função em Scilab que verificafactibilidade.
+
Cidade Demanda1 0
2 4
3 4
4 4
5 4
=
OKMETA-HEURÍSTICA PARA O PRV
1 2 4 1 3 5 CAP.
10
function [fact] = verifvrp(ind,dem,cap)
n = length(ind);
uso = 0; fact = 1;
for i=1:(n-1)
if (ind(i+1) ~= 1) then
uso = uso + dem(ind(i+1)); if (uso > cap) then
fact = 0; break; end else
uso = 0; end
end endfunction
Assume factibilidade e verifica uso cap nas rotas.
Índices da ordem dos pontos p/ percorrer
Verificação do uso da capacidade por rota. Enquanto não encontra 1
(depósito) acumula demandas dos clientes. FUNÇÃO VERIFVRP
HEURÍSTICA “VIZINHO MAIS PRÓXIMO” ADAPTADA
Tarefa 3: Escrever função em Scilab que aplica “vizinho + próximo”.
+
Cidade Coord. X Coord. Y1 2 2
2 6 2
3 8 7
4 11 5 5 13 7
=
1 2
3
META-HEURÍSTICA PARA O PRV
function [sol]=nearestnprv(x,y,dem,cap)
// Cálculo da matriz de distâncias.
[M]=vrpmatrix(x,y); n = length(x);
// Conjunto de vertices candidatos.
V = 2:n;
// Escolhendo a 1a. Cidade aleatoriamente.
ind = 1; //round(rand()*(n-3))+2; // Depósito incluído na 1a. rota.
sol = [1; V(ind)]; len = length(V);
V = [V(1:ind-1) V(ind+1:len)];
// Laço para construir soluções factíveis. // vide código ao lado.
endfunction
FUNÇÃO NEARESTNPRV
META-HEURÍSTICA PARA O PRV
// Laço p/ incluir os n-1 ptos em rotas.
for i=1:(n-2)
menor = M(sol(i),V(1)); elem = V(1);
ind = 1;
for j=2:length(V)
if (menor > M(sol(i),V(j))) then menor = M(sol(i),V(j)); elem = V(j); ind = j; end end
// Atualizando V e sol.
cand = [sol; elem];
// Verificando fact. da rota.
[fact] = verifvrp(cand,dem,cap);
// Incluir pto.
if (fact == 1) then sol = [sol; elem];
// Incluir deposito: Nova rota.
else
sol = [sol; 1; elem]; end
len = length(V);
V = [V(1:ind-1) V(ind+1:len)]; end
function vrpteste2 // Vértices. x = [7 11 10 6 2]; y = [1 4 7 5 6]; d = [0 4 4 4 4]; cap = 10;
// Aplicando heuristica construtiva. [sol]=nearestnprv(x,y,d,cap);
// Gráfico da solução obtida. vrpgraf(sol,x,y);
// Distância total percorrida. [M]=vrpmatrix(x,y);
[dist] = vrpdist(sol,M); endfunction
FUNÇÃO VRPTESTE2
META-HEURÍSTICA PARA O PRV
ALGORITMO GULOSO PARA O PRV (VRP)
1
2
3
4
5
A SOLUÇÃO PODE SER MELHOR? COMO FAZER?
SELECIONAR 2 ARESTAS DE 2 ROTAS E RECONECTAR !
DESSA FORMA, “CRUZAMENTOS” ENTRE ROTAS SÃO ELIMINADOS
1
2
3
4
MINHA PRIMEIRA META-HEURÍSTICA
VIZINHANÇA - “2-OPT”
VIZINHANÇA - “2-OPT”
Todos os cruzamentos que dependem da escolha de dois vértices simultaneamente serão eliminados
2
1 3 4 5 6 7 8 9 10 11 12 13 14
1 2 3 4 5 6 7 8
5
1 4
2 3
1 2 4 1 3 5 1 2 3 1 4 5
VIZINHANÇA - “2-OPT”
Todos os cruzamentos que dependem da escolha de dois vértices simultaneamente serão eliminados
2
1 3 4 5 6 7 8 9 10 11 12 13 14
1 2 3 4 5 6 7 8
5
1 4
2 3
1 2 4 1 3 5 1 2 3 1 4 5
5 6
1 2
4
3
VIZINHANÇA - 2-OPT
1 2 3 6 5 4
“FLIP”
5 6
1 2
4
3
1 2 3 4 5 6 1 2 3 6 5 4
1 2 3 4 5 6
9
1 7 8
4
VIZINHANÇA - “2-OPT”
1 2 3 5 6 7 1 4 8 9 1 0
“FLIP”
1 0
5 3
2
9
1 7 8
4 1 2 3 4 1 6 7 5 8 9 1
0
1 0
5 3
2
META-HEURÍSTICA PARA O PRV
MINHA PRIMEIRA META-HEURÍSTICA
1 2 3 5 6 7 1 4 8 9 1 0
function [sol2]=flipvrp(sol, p1, p2 )
n = length(sol);
for i=1:(p1-1) sol2(i) = sol(i); end
for i=p1:p2
sol2(i) = sol(p2-(i-p1)); end
for i=(p2+1):n
sol2(i) = sol(i); end
endfunction
PONTOS DE “CORTE”
1 2 3 4 1 7 6 5 8 9 1 0
p1 p2
VIZINHANÇA - 3-OPT
Escolher simultaneamente 3 arcos para serem modificados: 3 arcos serão
eliminados e 3 novoscriados !
VIZINHANÇA - λ λ λ λ-OPT
META-HEURÍSTICA PARA O PCV
5
6
1 2
4
3
1 4 5 2 3 6
5
6
1 2
4
3
1 2 3 4 5 6 VIZINHANÇA - 2-OPT ××××3-OPT
VIZINHANÇA -2-OPT××××3-OPT
5
6
1 2
4
3
1 4 5 2 3 6
5
6
1 2
4
3
5
6
1 2
4
3
1 2 3 6 5 4
5
6
1 2
4
3
1 2 3 4 5 6 1 4 5 6 3 2
Tarefa 5: Escrever SA em Scilab resolve o PRV.
function [s, f] = saprv(x,y,dem,cap,Tmax,Tmin,Miter,alfa) T = Tmax; n = length(x);
[s] = nearestnprv(x,y,dem,cap);
[M] = vrpmatrix(x,y); f = vrpdist(s,M); delta = 0.0;
while (T > Tmin) iter = 0;
while (iter <= Miter)
p1=round(rand()*(n-2))+2; p2=round(rand()*(n-p1)); [si] = flipvrp(s,p1,p2);
delta=vrpdist(si,M)-vrpdist(s,M); if (delta <= 0) then
s = si;
f = vrpdist(si,M) else
aux = rand();
if (aux < exp(-delta/T)) then s = si;
f = vrpdist(si,M); end
end
iter = iter + 1; vrpgraf(s,x,y); end
T = T*alfa end
endfunction
FUNÇÃO SAPRV – VIZINHO ALEATÓRIO
Problema de Minimização
Desenho melhor solução
META-HEURÍSTICA PARA O PRV
FUNÇÃO SAPRV – VIZINHO ALEATÓRIO
function [s, f] = saprv(x,y,dem,cap,Tmax,Tmin,Miter,alfa) T = Tmax; n = length(x);
[s] = nearestnprv(x,y,dem,cap);
[M] = vrpmatrix(x,y); f = vrpdist(s,M); delta = 0.0;
while (T > Tmin) iter = 0;
while (iter <= Miter)
p1=round(rand()*(n-2))+2; p2=round(rand()*(n-p1)); [si] = flipvrp(s,p1,p2);
delta=vrpdist(si,M)-vrpdist(s,M); if (delta <= 0) then
s = si;
f = vrpdist(si,M) else
aux = rand();
if (aux < exp(-delta/T)) then s = si;
f = vrpdist(si,M); end
end
iter = iter + 1; vrpgraf(s,x,y); end
T = T*alfa end
endfunction
function testesaprv
x = [7 11 10 6 2]; y = [1 4 7 5 6]; d = [0 4 4 4 4]; cap = 10;
Tmax = 1000; Tmin = 100; Miter = 10; alfa = 0.95;
[s, f] =
saprv(x,y,d,cap,Tmax,Tmin,Miter,alfa)
endfunction
Cidade Coord. X
Coord. Y
1 2 2
2 6 2
3 8 7
4 11 5
5 13 7
Tarefa 6: Modificar o código do SA anterior p/ manter melhor sol.
VIZINHANÇA -INSERÇÃO DE PONTOS
Uma rota pode ser adicionar um vértice de outra rota desde que a rota resultante permaneça factível
2
1 3 4 5 6 7 8 9 10 11 12 13 14
1 2 3 4 5 6 7 8
5
1 4
2 3
1 2 4 1 3 5 1 2 3 4 1 5
META-HEURÍSTICA PARA O PRV
2
1 3 4 5 6 7 8 9 10 11 12 13 14
1 2 3 4 5 6 7 8
5
1 4
2 3
META-HEURÍSTICA PARA O PRV
VIZINHANÇA -INSERÇÃO DE PONTOS
1 2 4 1 3 5 1 2 3 4 1 5
Tarefa 8: Escrever Tabu Search em Scilab resolve o PRV.
Tarefa 9: Usar os dados da biblioteca TSPLIB.
https://www.iwr.uni-heidelberg.de/groups/comopt/software/TSPLIB95/
Tarefa 8: Usar os dados da biblioteca TSPLIB.
META-HEURÍSTICA PARA O PRV
cap Pto x y
Pto dem
function [x, y, dem, cap] = leituraprv(fname,f) fid = mopen(fname, "r");
if (fid == -1)
error("cannot open file for reading"); end
// Leitura das primeiras 5 linhas. aux = mgetl(fid,3);
aux = mfscanf(fid,"%s"); aux = mfscanf(fid,"%s"); n = mfscanf(fid,"%d"); aux = mgetl(fid,1);
aux = mgetl(fid,1); // Leitura da linha 6. aux = mfscanf(fid,"%s"); aux = mfscanf(fid,"%s"); cap = mfscanf(fid,"%f"); aux = mgetl(fid,1);
aux = mgetl(fid,1); for i=1:n
ind = mfscanf(fid,"%d"); x(1,ind) = mfscanf(fid,"%f"); y(1,ind) = mfscanf(fid,"%f"); end
FUNÇÃO LEITURAPRV – DADOS DO PRV
Garantir abertura do arquivo
Número de dados
Dados p/ eliminar
Capacidade e dados (x,y).
aux = mgetl(fid,1); aux = mgetl(fid,1); for i=1:n
ind = mfscanf(fid,"%d"); dem(1,ind) = mfscanf(fid,"%f"); end
mclose(fid);
endfunction
FUNÇÃO LEITURAPRV – DADOS DO PRV (CONT.)
Dados dem
Novo código p/ leitura da demanda !
function prvteste3
[f,diret]=uigetfile(['*.*']);
fname = diret+'\'+f;
[x, y, dem, cap] = leituraprv(fname,f);
[sol]=nearestnprv(x,y,dem,cap);
vrpgraf(sol,x,y);
endfunction
FUNÇÃO PRVTESTE3 – PROGRAMA PRV
Menu para localizar arquivos
Nome arquivo
Leitura dados
Solução + gráfico associado
Tarefa 9: Considerar e resolver o PRV com instâncias da TSPLib.
META-HEURÍSTICA PARA O PRV
Tarefa 9: Implementar 2 heurísticas clássicas pelo menos.
Tarefa 9: Implementar 1 metaheurística além do SA.