AULA 10
META-HEURÍSTICAS NO PCV
Autor: Anibal Tavares de Azevedo
INTRODUÇÃO À META-HEURÍSTICAS
PROBLEMAS PROGRAMAÇÃO INTEIRA
Designação
Mochila
Leonard Euler
O problema das Sete Pontes de Konigsberg
Percorrer todas as sete pontes sem
repetir nenhuma (não tem solução). Grafo
(1) Percorrer todas as cidades.
(3) Minimizar a distância percorrida ! (2) Passar por todas
apenas uma única vez.
4
3
2
1 1 4 2 3 4 2 3 1 2 3 1 4 3 1 4 2
4
3
2
1 1 4 2 3 4 2 3 1 2 3 1 4 3 1 4 2 4
3
2
1 1 3 2 4 3 2 4 1 2 4 1 3 4 1 3 2
4
3
2
1 1 2 3 4 2 3 4 1 3 4 1 2 4 1 2 3
Para o Problema do Caixeiro Viajante Simétrico existem (n-1)!/2 soluções distintas em termos de
distância !
Problema do Caixeiro Viajante
Cidades (n-1)!/2 Tempo
5 12 Insignif.
10 181440 0.001 s
15 43 bilhões 10 min
20 6.0 x 1016 36 anos
25 3.1 x 1023 235 milhões
de anos Quanto tempo
para resolver usando 1 computador capaz de fazer
1 bilhão de adições por segundo ?
E para valores acima de 26 ?
1 2
3 4 5
6 7
8 9
10
11 12
13 14
1 2
3 4 5
6 7
8 9
10
11 12
13 14
Problema do Caixeiro Viajante
i j
xij
Variáveis de Decisão
X = 1 se o caixeiro vai do nó i para o nó j.
Problema do Caixeiro Viajante
x
i j
Origem
1
5
2
3
x13 x12
Variáveis de Decisão
x15
4
Xij= 1 se o caixeiro vai do nó i para o nó j. x14
x41 x31
x21
x51
1
5
2
3
x13 x12
Dado que estou na cidade 1, qual será a próxima cidade?
x15
4
x14
1
5
2
3
x53 x52
Dado que estou na cidade 1, qual será a próxima cidade?
x51
4
x54
x
51
+ x
52
+ x
53
+ x
54
= 1
Problema do Caixeiro Viajante
i
5
2
3
xi3 xi2
Dado que estou na cidade i, qual será a próxima cidade?
xi5
4
xi4
m
i
x
m
ij
=
1
,
=
1
,
L
,
∑
1
5
2
3
x31 x21
Dado que estou na cidade 1, qual foi a cidade anterior?
x51
4
x41
x
21
+ x
31
+ x
41
+ x
51
= 1
1
5
2
3
x35 x25 x15
4
x45
x
15
+ x
25
+ x
35
+ x
45
= 1
Dado que estou na cidade 5, qual foi a cidade anterior?j
5
2
3
Dado que estou na cidade j, qual será a próxima cidade?
4
m
j
x
m i j iij
1
,
1
,
,
, 1
L
=
=
∑
≠ = x3j x2j x5j x4jProblema do Caixeiro Viajante
Min
S.a.:
MODELO INCOMPLETOGERAL
m
i
x
m
j
ij
1
,
1
,
,
1
L
=
=
∑
=m
j
x
m iij
1
,
1
,
,
1
L
=
=
∑
=∑∑
= = m i m j ij ijx
c
1 1custo para realizar percorrer a rota i-j
m
j
i
x
ij=
1
ou
0
,
,
=
1
,
L
,
Pelo menos 1 cidade j posterior a i
Pelo menos 1 cidade j anterior a i
i j
xij
Variáveis de Decisão
Xij= 1 se operário i realiza a tarefa j e 0 caso contrário.
x
i j
Operário
Tarefa
1
2
x22
1
2
x21 x12 x11
n
m
=
n = no. de tarefas m = no. operáriosRestrições : todas as tarefas j devem ser alocadas a pelo menos 1 operário e vice-versa.
Min
S.a.:
MODELO COMPLETO GERAL
Problema de Designação
m
i
x
m
j
ij
1
,
1
,
,
1
L
=
=
∑
=m
j
x
m iij
1
,
1
,
,
1
L
=
=
∑
=∑∑
= = m i m j ij ijx
c
1 1custo para realizar a tarefa
m
j
i
x
ij=
1
ou
0
,
,
=
1
,
L
,
Pelo menos 1 tarefa (j) para cada operário(i)
Pelo menos 1 operário(i) para
cada tarefa (j)
Min
S.a.:
MODELO COMPLETO GERAL
Problema de Designação
m
i
x
m
j
ij
1
,
1
,
,
1
L
=
=
∑
=m
j
x
m iij
1
,
1
,
,
1
L
=
=
∑
=∑∑
= = m i n j ij ijx
c
1 1custo para realizar a tarefa
m
j
i
x
ij=
1
ou
0
,
,
=
1
,
L
,
X é solução inteira !! (Bazaraa, 2nd, p.429) Caso particular do modelo de transporte: m = n e vetor b só com
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
x21
Eliminação de sub-rotas com dois nós
4
Problema do Caixeiro Viajante
x12
x13
x31 x14
x41 x51
x15
1
5
2
3
x21
Eliminação de sub-rotas com dois nós
4
Problema do Caixeiro Viajante
x12
x
12
+ x
21
≤≤≤≤
1
1 2
x21
Eliminação de sub-rotas com dois nós
Problema do Caixeiro Viajante
x12
1 2
x21
Eliminação de sub-rotas com dois nós
x12
x
12
+ x
21
≤≤≤≤
1
1 2
x21
x12
ou
1 2
x21
Eliminação de sub-rotas com dois nós
Problema do Caixeiro Viajante
x12
x
12
+ x
21
≤≤≤≤
1
1 2
x21
x12
1 2
x21
x12
ou
1
5
2
3
Eliminação de sub-rotas com três nós
4
Problema do Caixeiro Viajante
x
ij
+ x
jk
+ x
ki
≤≤≤≤
2
1
5
2
3
Eliminação de sub-rotas com três nós
4
Problema do Caixeiro Viajante
x12
x23
x31
Min
S.a.:
MODELO COMPLETOGERAL
m
i
x
m
j
ij
1
,
1
,
,
1
L
=
=
∑
=m
j
x
m iij
1
,
1
,
,
1
L
=
=
∑
=∑∑
= = m i m j ij ijx
c
1 1custo para realizar percorrer a rota i-j
m
j
i
x
ij=
1
ou
0
,
,
=
1
,
L
,
∑
∈ = − ≤ S j iij S S m
x , , , 2 , 1 L
No. nós sub-grafo Eliminação
sub-rotas
REPRESENTAÇÃO
META-HEURÍSTICA PARA O PCV
REPRESENTAÇÃO - VÉRTICES
1 2
3
4
5
SOLUÇÃO
META-HEURÍSTICA PARA O PCV
1 2
3
4
5
1 2
SOLUÇÃO
1 2
3
4
5
1 2 3
SOLUÇÃO
REPRESENTAÇÃO - VÉRTICES
META-HEURÍSTICA PARA O PCV
1 2
3
4
5
1 2 3 4
SOLUÇÃO
META-HEURÍSTICA PARA O PCV
1 2
3
4
5
1 2 3 4 5
SOLUÇÃO
REPRESENTAÇÃO - VÉRTICES
META-HEURÍSTICA PARA O PCV
1 2
3
4
5
1 2 3 4 5
SOLUÇÃO
ALGORITMO GULOSO PARA O PCV (TSP)
1
2
3
4
5
A SOLUÇÃO PODE SER MELHOR? COMO FAZER?
META-HEURÍSTICA PARA O PCV
SELECIONAR 2 ARESTAS E RECONECTAR !
DESSA FORMA, “CRUZAMENTOS” SÃO ELIMINADOS
1
2
MINHA PRIMEIRA META-HEURÍSTICA
Tarefa 1: Escrever função em Scilab que desenhasolução do PCV.
1 2 3 4 5
+
Cidade Coord. X Coord. Y1 x1 y1
2 x2 y2
3 x3 y3
4 x4 y4
5 x5 y5
=
META-HEURÍSTICA PARA O PCV
1 2 3 4 5
SOLUÇÃO
REPRESENTAÇÃO - VÉRTICES
1 2
3
4
5
1 2
3
4
5
2
1 3 4 5 6 7 8 9 10 11 12 13 14
1 2 3 4 5 6 7
Vértice Coordenada X Coordenada Y
1 2 2
2 6 2
3 8 7
4 11 5
5 13 7
META-HEURÍSTICA PARA O PCV
1 2
3
4
5
2
1 3 4 5 6 7 8 9 10 11 12 13 14
META-HEURÍSTICA PARA O PCV
1 2 3 4 5 21 3 4 5 6 7 8 9 10 11 12 13 14
1 2 3 4 5 6 7 8 Índice 1 2 4 5 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 as cidades com 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 TSPGRAF
function tspteste(ind)
//ind = [1 2 3 4 5]; // Ordem.
x = [2 6 8 11 13]; y = [2 2 7 5 7];
tspgraf(ind,x,y);
endfunction
Ordem para percorrer as cidades.
Coordenadas das cidades
Chamada para desenhar a rota escolhida FUNÇÃO TSPTESTE
MINHA PRIMEIRA META-HEURÍSTICA
Tarefa 2: Escrever função em Scilab que avaliasolução do PCV.
1 2 3 4 5
+
Cidade Coord. X Coord. Y1 2 2
2 6 2
3 8 7
4 11 5
5 13 7
function [dist] = tspdist(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 as cidades
Í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 TSPDIST
META-HEURÍSTICA PARA O PCV
function [M]=tspmatrix(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 cidades: linhas e colunas de M
Cálculo distância de i p/ j. FUNÇÃO TSPMATRIX
META-HEURÍSTICA PARA O PCV
x xi
yj
HEURÍSTICA “VIZINHO MAIS PRÓXIMO”
MINHA PRIMEIRA META-HEURÍSTICA
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 4 51 2
META-HEURÍSTICA PARA O PCV
function [sol]=nearestn(x,y) [M]=tspmatrix(x,y); n = length(x);
// Conjunto de vertices candidatos. V = 1:n;
// Escolhendo a 1a. Cidade aleatoriamente. ind = round(rand()*(n-1))+1;
sol = [V(ind)]; len = length(V);
V = [V(1:ind-1) V(ind+1:len)];
for i=1:(n-1)
menor = M(sol(i),V(1)); elem = V(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. sol = [sol; elem]; len = length(V);
V = [V(1:ind-1) V(ind+1:len)]; end
endfunction
FUNÇÃO NEARESTN
Índices da ordem das cidades p/ percorrer
META-HEURÍSTICA PARA O PCV
function tspteste2
// Vértices.
x = [2 6 8 11 13]; y = [2 2 7 5 7];
[sol]=nearestn(x,y);
tspgraf(sol,x,y);
endfunction
VIZINHANÇA - 2-OPT
META-HEURÍSTICA PARA O PCV
1 2
3
4
2
1 3 4 5 6 7 8 9 10 11 12 13 14
1 2 3 4 5 6 7 8
VIZINHANÇA - 2-OPT
1 2 3 4
Todos os cruzamentos que dependem da escolha de dois vértices simultaneamente serão eliminados
META-HEURÍSTICA PARA O PCV
VIZINHANÇA - 2-OPT
Todos os cruzamentos que dependem da escolha de dois vértices simultaneamente serão eliminados
1 2
3
4
2
1 3 4 5 6 7 8 9 10 11 12 13 14
1 2 3 4 5 6 7 8
1 2 4 3
1 2 4 3
5 6
1 2
4
3
META-HEURÍSTICA PARA O PCV
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
Tarefa 4: Escrever uma vizinhança 2-opt.
META-HEURÍSTICA PARA O PCV
function [sol2]=flip(sol, fp )
n = length(sol);
for i=1:(fp-1) sol2(i) = sol(i); end
for i=fp:n
sol2(i) = sol(n-(i-fp)); end
endfunction
FUNÇÃO FLIP
1 2 3 6 5 4
1 2 3 4 5 6
MINHA PRIMEIRA META-HEURÍSTICA
VIZINHANÇA - 3-OPT
Escolher simultaneamente 3 arcos para serem modificados: 3 arcos serão
eliminados e 3 novoscriados !
VIZINHANÇA - λ λ λ λ-OPT
VIZINHANÇA -λλλλ-OPT
VIZINHANÇA -λλλλ-OPT
VIZINHANÇA -λλλλ-OPT
META-HEURÍSTICA PARA O PCV
VIZINHANÇA -λλλλ-OPT
META-HEURÍSTICA PARA O PCV
1 2
3
4
5
2
1 3 4 5 6 7 8 9 10 11 12 13 14
1 2 3 4 5 6 7 8
VIZINHANÇA - 3-OPT
1 2 3 4 5
Elimina todos os cruzamentos que dependem da escolha de
META-HEURÍSTICA PARA O PCV
1 2
3
4
5
2
1 3 4 5 6 7 8 9 10 11 12 13 14
1 2 3 4 5 6 7 8
VIZINHANÇA - 3-OPT
1 2 3 4 5
Elimina todos os cruzamentos que dependem da escolha de
trêsvértices simultâneos (sucessivos 2-OPTs resolvem !)
META-HEURÍSTICA PARA O PCV
1 2
3
4
5
2
1 3 4 5 6 7 8 9 10 11 12 13 14
1 2 3 4 5 6 7 8
VIZINHANÇA - 2-OPT
1 2
3
4
5
2
1 3 4 5 6 7 8 9 10 11 12 13 14
1 2 3 4 5 6 7 8
VIZINHANÇA - 2-OPT
1 2 3 5 4
Aplicando vizinhança 2-OPT no problema abaixo para ilustrar o que ocorrerá com os cruzamentos ! Ainda tem cruzamento!
META-HEURÍSTICA PARA O PCV
1 2
3
4
5
2
1 3 4 5 6 7 8 9 10 11 12 13 14
1 2 3 4 5 6 7 8
VIZINHANÇA - 2-OPT
1 2 3 5 4
META-HEURÍSTICA PARA O PCV
1 2
3
4
5
2
1 3 4 5 6 7 8 9 10 11 12 13 14
1 2 3 4 5 6 7 8
VIZINHANÇA - 2-OPT
1 2 4 5 3
Aplicando vizinhança 2-OPT no problema abaixo para ilustrar o que ocorrerá com os cruzamentos ! Ótimo!
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 PCV.
MINHA PRIMEIRA META-HEURÍSTICA
function [s, f] = satsp(x,y,Tmax,Tmin,Miter,alfa) T = Tmax; n = length(x);
[s] = nearestn(x,y);
[M] = tspmatrix(x,y); f = tspdist(s,M); delta = 0.0;
while (T > Tmin) iter = 0;
while (iter <= Miter)
fp = round(rand()*(n-2)) + 2; [si] = flip(s,fp);
delta=tspdist(si,M)-tspdist(s,M); if (delta <= 0) then
s = si;
f = tspdist(si,M) else
aux = rand();
if (aux < exp(-delta/T)) then s = si;
f = tspdist(si,M); end
end
iter = iter + 1; tspgraf(s,x,y); end
T = T*alfa end
endfunction
FUNÇÃO SATSP – VIZINHO ALEATÓRIO
Problema de Minimização Desenho melhor solução
MINHA PRIMEIRA META-HEURÍSTICA
function [s, f] = satsp(x,y,Tmax,Tmin,Miter,alfa) T = Tmax; n = length(x);
[s] = nearestn(x,y);
[M] = tspmatrix(x,y); f = tspdist(s,M); delta = 0.0;
while (T > Tmin) iter = 0;
while (iter <= Miter)
fp = round(rand()*(n-2)) + 2; [si] = flip(s,fp);
delta=tspdist(si,M)-tspdist(s,M); if (delta <= 0) then
s = si;
f = tspdist(si,M) else
aux = rand();
if (aux < exp(-delta/T)) then s = si;
f = tspdist(si,M); end
end
iter = iter + 1; tspgraf(s,x,y); end
function testesatsp
x = [2 6 8 11 13]; y = [2 2 7 5 7];
Tmax = 1000; Tmin = 100; Miter = 10; alfa = 0.95;
[s, f] =
satsp(x,y,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.
MINHA PRIMEIRA META-HEURÍSTICA
Tarefa 7: Escrever Tabu Search em Scilab resolve o PCV.
MINHA PRIMEIRA META-HEURÍSTICA
Tarefa 8: Usar os dados da biblioteca TSPLIB.
Tarefa 8: Usar os dados da biblioteca TSPLIB.
MINHA PRIMEIRA META-HEURÍSTICA
function [x, y] = leituratsp(fname,f)
fid = mopen(fname, "r"); if (fid == -1)
error("cannot open file for reading"); end
nf = length(f);
// Convertendo parte do nome do arquivo // no número de dados a serem lidos.
n = strtod(part(f,2:nf-4));
// Leitura das primeiras 6 linhas.
aux = mgetl(fid,6);
for i=1:n
ind = mfscanf(fd,"%d"); x(1,ind) = mfscanf(fd,"%f"); y(1,ind) = mfscanf(fd,"%f"); end
mclose(fd);
endfunction
FUNÇÃO LEITURATSP – DADOS DO TSP
Garantir abertura do arquivo
Número de dados
Dados p/ eliminar
MINHA PRIMEIRA META-HEURÍSTICA
function tspteste3
[f,diret]=uigetfile(['*.*']);
fname = diret+'\'+f;
[x, y] = leituratsp(fname,f);
[sol]=nearestn(x,y);
tspgraf(sol,x,y);
endfunction
FUNÇÃO TSPTESTE3 – PROGRAMA TSP
Menu para localizar arquivos
Nome arquivo
Leitura dados
Solução + gráfico associado
MINHA PRIMEIRA META-HEURÍSTICA
Tarefa 9: Considerar e resolver as variantes do PCV.