AULA 9
MINHA PRIMEIRA META-HEURÍSTICA
Autor: Anibal Tavares de Azevedo
INTRODUÇÃO À META-HEURÍSTICAS
MINHA PRIMEIRA META-HEURÍSTICA
Problema 1:
REPRESENTAÇÃO
MINHA PRIMEIRA META-HEURÍSTICA
CONSTRUINDO META-HEURÍSTICAS - BUSCA LOCAL
1
function [sol] = greedy(u,v,cap) r = v./u;
ind = 1:length(v); ord = bubble(r,ind); used = 0;
i = 1; sol = [];
while (used <= cap)&(i <= length(v)) sol = [sol ord(i)];
used = used + v(ord(i)); i = i + 1;
end
if (used > cap)
sol = sol(1:length(sol)-1) end
endfunction
Fornece ordem crescente de ri- O(n2) operações
Calcular a relação ri= vi/ui de cada item
Armazena os índices dos itens na mochila !
Retirar o último item, pois não cabe na mochila ! FUNÇÃO GREEDY
MINHA PRIMEIRA META-HEURÍSTICA
CONSTRUINDO META-HEURÍSTICAS - BUSCA LOCAL
1
SOLUÇÃO ALEATÓRIA
1 0 ?
If (rand() <= 0.5) then sol(i) = 1;
function [sol] = solaleat(u) n = length(u);
for i=1:n
if (rand() <= 0.5) then sol(i) = 0;
else
sol(i) = 1; end
end endfunction
FUNÇÃO SOLALEAT
1 1 1
0 0 0
Escolher 1 ! Sortear todos os
elementos !!
MINHA PRIMEIRA META-HEURÍSTICA
CONSTRUINDO META-HEURÍSTICAS - BUSCA LOCAL
1
Tarefa 1: Escolher uma vizinhança e criar função correspondente.
MINHA PRIMEIRA META-HEURÍSTICA
Tarefa 1: Escolher uma vizinhança e criar função correspondente.
1 0 0
No caso do problema da Mochila entende-se por solução vizinha
toda aquela que tiver um digito de diferença em relação a uma
solução inicialmente fornecida.
Solução inicial
0 0 0
1 1 0
1 0 1
7
12
10
0
Tarefa 1: Escolher uma vizinhança e criar função correspondente.
1 0 0
Solução inicial
0 0 0
1 1 0
1 0 1
7
12
10
0
Vizinhança Completa Best Improvement
MINHA PRIMEIRA META-HEURÍSTICA
Tarefa 1: Escolher uma vizinhança e criar função correspondente.
1 0 0
Solução inicial
0 0 0
1 1 0
7
12
0
Tarefa 1: Escolher uma vizinhança e criar função correspondente.
1 0 0
Solução inicial
0 0 0
1 1 0
1 0 1
7
12
10
0
Vizinhança Completa Random Improvement
MINHA PRIMEIRA META-HEURÍSTICA
Tarefa 1: Escolher uma vizinhança e criar função correspondente.
1 0 0
Para todas as vizinhanças é necessário criar uma função que
forneça a qualidade das soluções geradas, isto é, uma função
“Avaliar”.
Solução inicial
0 0 0
1 1 0
1 0 1
7
12
10
0
Tarefa 1: Escolher uma vizinhança e criar função correspondente.
Best Improvement
Pode-se combinar solução inicial aleatória e vizinhança First ou
para solução inicial Greedy usa-se a vizinhança Best, mas para a
maioria das aplicações práticas não é observado grande diferença.
First Improvement Random Improvement Avaliar
function [fo] = avaliar(sol,u)
endfunction
function [sol2] = xyzimprov(sol,u)
endfunction
Solução Greedy Solução Aleatória
MINHA PRIMEIRA META-HEURÍSTICA
function [fo] = avaliar(sol,u)
soma = 0.0;
for i=1:length(sol)
if (sol(i) == 1) then soma = soma + u(i); end
end
FUNÇÃO AVALIAR
1 0 0
SOL
7 5 3
u
i = 1
i = 2
SOMA = 7
SOMA = 7
7
function [sol2] = bestimprov(sol,u) [fo1] = avaliar(sol,u);
sol2 = sol;
for i=1:length(sol) aux = sol;
if (aux(i) == 1) then aux(i) = 0;
else
aux(i) = 1; end
[fo2] = avaliar(aux,u); if (fo2 > fo1) then
fo1 = fo2; sol2 = aux; end
end endfunction
FUNÇÃO BEST IMPROVEMENT
1 0 0
0 0 0
Realizar 1 troca Testar todas as
trocas !!
MINHA PRIMEIRA META-HEURÍSTICA
function [sol2] = firstimprov(sol,u) [fo1] = avaliar(sol,u);
sol2 = sol; i=1;
while((sol2 <= sol)|(i <= length(sol))) aux = sol;
if (aux(i) == 1) then aux(i) = 0;
else
aux(i) = 1; end
[fo2] = avaliar(aux,u); if (fo2 > fo1) then
fo1 = fo2; sol2 = aux; end
i = i + 1;
FUNÇÃO FIRST IMPROVEMENT
First Improvement
7
12
function [sol2] = randomimprov(sol,u) [fo1] = avaliar(sol,u);
sol2 = sol;
i= round(rand()*(length(sol)-1)+1); while((sol2 <= sol))
aux = sol;
if (aux(i) == 1) then aux(i) = 0;
else
aux(i) = 1; end
[fo2] = avaliar(aux,u); if (fo2 > fo1) then
fo1 = fo2; sol2 = aux; end
i= round(rand()*(length(sol)-1)+1); end
endfunction
Até o sorteio aleatório melhorar FUNÇÃO RANDOM IMPROVEMENT
MINHA PRIMEIRA META-HEURÍSTICA
REJEIÇÃO
PENALIZAÇÃO REPARAÇÃOfunction [sol2] = bestimprov2(sol,u,v,cap) [fo1] = avaliar(sol,u);
sol2 = sol;
for i=1:length(sol) aux = sol;
if (aux(i) == 1) then aux(i) = 0;
else
aux(i) = 1; end
[flag]=factverif(aux,u,v,cap); if (flag == 1) then
[fo2] = avaliar(aux,u); if (fo2 > fo1) then
fo1 = fo2; sol2 = aux; end
end end endfunction
FUNÇÃO BEST IMPROVEMENT
REJEIÇÃO
1
0
0
1
1
0
0
0
Verificar aux !!
MINHA PRIMEIRA META-HEURÍSTICA
Tarefa 2: Escrever a função de avaliação de factibilidade “factverif”.
1 0 0
No caso do problema da Mochila entende-se que uma solução
factível é tal que o volume total dos itens selecionados não violam
a capacidade da mochila.
Solução Factível
7 6 4
v
SOL 1 1 0
Solução Infactível
7 6 4
function [flag] = factverif(sol,u,v,cap)
flag = 1; soma = 0.0;
for i=1:length(sol)
if (sol(i) == 1) then soma = soma + v(i); end
end
if (soma > cap) then flag = 0;
end endfunction
FUNÇÃO FACTVERIF - REJEIÇÃO
1 0 0
SOL
7 6 4
v
i = 1
i = 2
CAP = 7
CAP = 7
7
0
i = 3 0 CAP = 7
MINHA PRIMEIRA META-HEURÍSTICA
function [sol2] = bestimprov3(sol,u,v,cap) [fo1] = avaliar(sol,u);
sol2 = sol;
for i=1:length(sol) aux = sol;
if (aux(i) == 1) then aux(i) = 0;
else
aux(i) = 1; end
[fo2] = avaliarpen(aux,u,v,cap); if (fo2 > fo1) then
FUNÇÃO BEST IMPROVEMENT
PENALIZAÇÃO
Tarefa 3: Escrever a função de avaliação “avaliarpen”.
1 0 0
No caso do problema da Mochila entende-se que uma solução
factível é tal que o volume total dos itens selecionados não violam
a capacidade da mochila.
Solução Factível
7 6 4
v
Capacidade = 10 SOL
cap
1 1 0
Solução Infactível
7 6 4
v
Capacidade = 10 SOL
cap
MINHA PRIMEIRA META-HEURÍSTICA
function [fo] =
avaliarpen(sol,u,v,cap) soma = 0.0;
vol = 0.0; for i=1:length(sol)
if (sol(i) == 1) then soma = soma + u(i); vol = vol + v(i); end
end
if (vol > cap) then fo = soma - max(u)*(vol-cap);
else
fo = soma;
FUNÇÃO AVALIARPEN
1 0 0
SOL
7 6 4
v
i = 1
i = 2
VOL = 7
VOL = 7
7
0
CONSTRUINDO META-HEURÍSTICAS - BUSCA LOCAL
MINHA PRIMEIRA META-HEURÍSTICA
CONSTRUINDO META-HEURÍSTICAS - BUSCA LOCAL
CONSTRUINDO META-HEURÍSTICAS - BUSCA LOCAL
MINHA PRIMEIRA META-HEURÍSTICA
SIMULATED ANNEALING
MINHA PRIMEIRA META-HEURÍSTICA
SIMULATED ANNEALING
MINHA PRIMEIRA META-HEURÍSTICA
Tarefa 4: Escrever o “Simulated Annealing” para o “Knapsack”.
1 0 0
No caso do problema da Mochila entende-se que uma solução
factível é tal que o volume total dos itens selecionados não violam
a capacidade da mochila.
Solução Factível
7 6 4
v
Capacidade = 10 SOL
cap
1 1 0
Solução Infactível
7 6 4
v
Capacidade = 10 SOL
cap
MINHA PRIMEIRA META-HEURÍSTICA
function [s, f] =
sa(u,v,cap,pinit,Tmax,Tmin,Miter,alfa) T = Tmax;
[s] = ginit(u,v,cap,pinit); f = f1(s,u,v,cap);
soma = 0.0; vol = 0.0;delta = 0.0; while (T > Tmin)
iter = 0;
while (iter <= Miter) [si] = genrand();
delta=f1(si,u,v,cap)-f1(s,u,v,cap); if (delta >= 0) then
s = si;
f = f1(si,u,v,cap); else
aux = rand();
if (aux < exp(-delta/T)) then
function knapsack u = [7 5 3]; v = [7 6 4]; cap = 10; pinit = 1; Tmax = 1000; Tmin = 500; Miter = 2; alfa = 0.95; [sb, fob] =
sa(u,v,cap,pinit,Tmax,Tmin,Miter,alfa); endfunction
FUNÇÃO KNAPSACK