AULA 8
MINHA PRIMEIRA META-HEURÍSTICA
Autor: Anibal Tavares de Azevedo
INTRODUÇÃO À META-HEURÍSTICAS
MINHA PRIMEIRA META-HEURÍSTICA
Complexidade dos Algoritmos
Algoritmos precisam de dois importantes recursos para resolver um problema: tempo e espaço. A complexidade de tempo de um algoritmo corresponde ao número de passos necessários para resolver um problema de tamanho n. O propósito da análise de complexidade de algoritmos não é obter uma contagem exata do número de passos e sim um limitante assintótico do número de passos. Para tanto, a notação “Big-O” é empregada.
Notação “Big-O”
Um algoritmo possui complexidade de tempo f(n) = O(g(n)) se existir uma constante positiva n0tal que∀∀∀∀n > n0, f(n)≤≤≤≤c*g(n).
Algoritmo Polinomial no tempo
Um algoritmo é dito polinomial no tempo (polynomial-time) se sua complexidade é O(p(n)), onde p(n) é uma função polinomial de n. Um função polinomial de grau k pode ser definida como dado a seguir:
0 1
)
(
n
a
n
a
n
a
n
a
p
=
k k+
L
+
j j+
L
+
+
Onde: ak > 0 e aj ≥ 0,∀∀∀∀1 ≤≤≤≤ j ≤≤≤≤ k – 1. O algoritmo correspondente tem um complexidade polinomial O(nk).
ALGORITMOS
O que é um Algoritmo?
É uma sequência finita de passos que resolve um dado problema ! Um bom exemplo de algoritmo é uma receita de bolo, pois a ordem dos passos pode mudar o resultado final!
+
1 2
3
4
ALGORITMOS
Um algoritmo é conjunto finito de instruções, com
uma ou mais operações capazes de serem executadas
(por um computador) em tempo finito, para
realização de uma tarefa específica.
x
y
ALGORITMOS
Exercício 1: Escrever um algoritmo para o problema
de precificação dinâmica.
Caso 1
x
y
f(x) = volume de vendas
ymin = volume mínimo de vendas
Caso 2
x
y
ymin
f(x)
f(x) = volume de estoque ymin = volume mínimo estoque
ymin
f(x)
ALGORITMOS
Exercício 1: Escrever um algoritmo para o problema
de precificação dinâmica.
Caso 1
x
y
f(x) = volume de vendas
ymin = volume mínimo de vendas
x
y
ymin
f(x)
g(x) = valor do preço
g(x)
Caso 1
Exercício 1: Escrever um algoritmo para o problema
de precificação dinâmica.
Caso 2
x
y
f(x) = volume de estoque ymin = volume mínimo estoque
ymin
f(x)
x
y
g(x) = valor do preço
g(x)
t
Caso 2
t
ALGORITMOS
Exercício 1: Escrever um algoritmo para o problema
de precificação dinâmica.
Algoritmo de precificação dinâmica simples
Leia
(preco, vendas, estoque, valormin, estoquemin);
Se
(vendas < valormin)
então
preco
←
preco * 0.7; *Redução de 70% no preço*
Senão
Se
(estoque < estoquemin)
então
preco
←
preco * 1.2;
*Aumento de 20% no preço*
Fim Se
Fim Se
ALGORITMOS
1
Ser finito: terminar após um número finito depassos.2
Serprecisão o que deve ser realizado.exato: seus passos devem indicar comUm algoritmo sempre deve:
Um algoritmo pode ser descrito por meio de
pseudo-código, fluxograma ou uma linguagem de
programação específica.
1
Pseudo-código
vendas < valormin
2
Fluxograma
Sim Não
#include <stdio.h> main()
{
if (vendas < valormin); }
3
Código em linguagem C
ALGORITMOS
ALGORITMOS
Terminador
ALGORITMOS
Decisão
ALGORITMOS
Exercício
2:
Escrever
um
fluxograma
para
o
algoritmo do problema de precificação dinâmica.
Algoritmo de precificação dinâmica simples
Leia
(preco, vendas, estoque, valormin, estoquemin);
Se
(vendas < valormin)
então
preco
←
preco * 0.7; *Redução de 70% no preço*
Senão
Se
(estoque < estoquemin)
então
preco
←
preco * 1.2;
*Aumento de 20% no preço*
Fim Se
Exercício
2:
Escrever
um
fluxograma
para
o
algoritmo do problema de precificação dinâmica.
V
Início
Ler preco, vendas, estoque, Valormin, estoquemin;
vendas< valormin
preco←preco*0.7
Final
F
Verificar aumento de preço
ALGORITMOS
Exercício
2:
Escrever
um
fluxograma
para
o
algoritmo do problema de precificação dinâmica.
V
Início
Ler preco, vendas, estoque, Valormin, estoquemin;
vendas< valormin
preco←preco*0.7
Exercício
2:
Escrever
um
fluxograma
para
o
algoritmo do problema de precificação dinâmica.
V
estoque< estoquemin
preco←preco*1.2
F
Verificar aumentode preço
ALGORITMOS
Exercício
2:
Escrever
um
fluxograma
para
o
algoritmo do problema de precificação dinâmica.
V
estoque< estoquemin
preco←preco*1.2
F
Verificar aumentode preço
Condição lógica
Exercício
2:
Escrever
um
fluxograma
para
o
algoritmo do problema de precificação dinâmica.
V
Início
Ler preco, vendas, estoque, Valormin, estoquemin;
vendas< valormin
preco←preco*0.7
Final
F
Verificar aumento de
preço
ALGORITMOS
No paradigma de programação estruturada, os
Programas
são
escritos
considerando
apenas
combinação adequadas de 3 estruturas básicas:
Início
Ler preco, vendas, estoque, Valormin, estoquemin;
SEQUÊNCIA
No paradigma de programação estruturada, os
Programas
são
escritos
considerando
apenas
combinação adequadas de 3 estruturas básicas:
V
estoque< estoquemin
preco←preco*1.2
F
SELEÇÃO SIMPLES
2
SE
ALGORITMOS
V
valorminvendas<preco←preco*0.7
F
No paradigma de programação estruturada, os
Programas
são
escritos
considerando
apenas
combinação adequadas de 3 estruturas básicas:
2
V
preco< precominpreco←preco*0.7
F
No paradigma de programação estruturada, os
Programas
são
escritos
considerando
apenas
combinação adequadas de 3 estruturas básicas:
ITERAÇÃO
3
ENQUANTO
ALGORITMOS
As estruturas básicas podem ser combinadas
entre si, utilizando apenas duas regras:
REGRA DO ANINHAMENTO
1
Um retângulo de uma estrutura pode ser substituído por uma
outra estrutura qualquer.
REGRA DO EMPILHAMENTO
2
As estruturas básicas podem ser combinadas
entre si, utilizando apenas duas regras:
V
Início
Ler preco, vendas, estoque, Valormin, estoquemin;
vendas< valormin
preco←preco*0.7
Final
F
Verificar aumento de preço REGRA DO ANINHAMENTO1
ALGORITMOS
As estruturas básicas podem ser combinadas
entre si, utilizando apenas duas regras:
V
Início
Ler preco, vendas, estoque, Valormin, estoquemin;
vendas< valormin
preco←preco*0.7
F
Verificar aumento de preço
REGRA DO
As regras podem ser aplicadas quantas vezes forem necessárias, e em qualquer ordem.
Os fluxogramas resultantes da aplicação dessas regras constituem o conjunto de todos os fluxogramas estruturados possíveis.
x
y
∫
f
(
x
)
dx
ALGORITMOS
Exercício 3: Escrever um algoritmo e um fluxograma
para o problema de ler duas variáveis a e b e
imprimir a de maior valor.
Algoritmo de maior valor
Variáveis a,b;
Início
Leia
(a, b);
Se
(a < b)
então
imprimir(b); *impressao de b (maior que a)*
Senão
imprimir(a); *impressao de a (maior que b)*
Fim Se
ALGORITMOS
Exercício 3: Escrever um algoritmo e um fluxograma
para o problema de ler duas variáveis a e b e
imprimir a de maior valor.
Fluxograma de maior valor
V
Início
Ler preco, vendas, estoque, Valormin, estoquemin;
a < b
F
41
O laço é utilizado quando uma operação ou uma série de
operações deve ser repetida muitas vezes. Existem várias
formas de laço, a saber:
1. Laços Condicionais
O laço condicional fica repetindo uma seqüência de ações, isto
é, ele é executado enquanto a condição for verdadeira. Em
linguagem algorítmica ele é expresso da seguinte forma:
Enquanto
“condição”
faça
comando
Enquanto
(condição)
faça
Início
comando1
comando2...
comandoN
Fim
Ou
Em linguagem C, Java, Matlab ou Scilab o laço
condicional
Enquanto
é feito através do comando
while
,
isto é:
while (condição)
{
comandos;
}
OBS: O processo é repetido enquanto a condição for verdadeira. F
condição
V comandoswhile (condição)
43
1º. Avalia a condição
2º.Se a condição for Falsa (0-zero), o laço termina e o programa continua na instrução imediatamente após o while.
3º. Se a condição é verdadeira (diferente de zero), executa os comandos do bloco.
4º. Volta ao passo 1.
O while funciona do seguinte modo:
•
Observação Importante: Cada verificação da condição lógica
com a conseqüente execução de ações é denominada de
iteração (passos 1, 2 e 3).
OBS:
1- Do mesmo modo que no comando if, a condição do comando while, deve sempre ser colocada entre parênteses.
2- O comandos de um laço também são chamados de corpo do F
condição
V comandoswhile (condição)
F
condição
V comando1if (condição)
Sintaxe
em Scilabfor i=1:inc:n
{
comandos;
}
F Vi ≤ n
comandos
Fluxograma
Obs:O funcionamento do laço for é semelhante ao do laço while. Note que existem 3 campos separados por “ : ”. No 1ºé realizada a inicialização das variáveis, no 2ºé realizada o incremento da variável e no 3º o valor final da variável.
i=1;
i ←i+1;
ALGORITMOS
Vetor
ou
Array
são estruturas de
dados que consistem em itens de
dados do mesmo tipo e mesmo nome
ocupando posições de memória
consecutivas. Para fazer referência a
uma posição particular ou elemento
do vetor, deve-se especificar o nome
e o número da posição do elemento
no vetor. Qualquer um dos elementos
pode ser acessado fornecendo-se o
nome
do vetor seguido do
número
da posição
entre parentesis
“()”.
Declaração
Índices variam
de 0 até 4
c[0] c[1] c[2] c[3] c[4] int c[ 5 ];
Cria um vetor de nome
c de tamanho 5 e cujos
elementos são tipo int.
Declaração e Atribuição
2 1 c[0] c[1] 4 3 c[2] c[3] 5 c[4] int c[ 5 ] = {1, 2, 3, 4, 5};
Acesso e Modificação
3 1 c[0] c[1] 7 3 c[2] c[3] 5 c[4] c[ 1 ] = c[1] + 1; c[3] = c[1]+ c[3];
MINHA PRIMEIRA META-HEURÍSTICA
PROBLEMA DE ORDENAÇÃO:
Ordenação de dados (em ordem ascendente ou descendente)
pode ser utilizada para classificar e mostrar os
resultados mais significativos obtidos por um buscador
Web (Google ou Altavista, por exemplo) para uma dada
palavra-chave. Crie um algoritmo que reordena em ordem
ascendente um vetor de elementos gerados
ALGORITMO DE ORDENAÇÃO:
Um possível algoritmo de ordenação é o Bubble Sort. Seu
funcionamento consiste em fazer os valores menores
“subirem“ gradualmente até o topo do vetor, da mesma
forma que bolhas de ar sobem na água, enquanto os
valores maiores afundam para a parte de baixo do vetor.
4
3
2
1
“Fundo” do vetor
“Topo” do vetor
3
2
1
4
MINHA PRIMEIRA META-HEURÍSTICA
4
3
2
1
“Fundo” do vetor
“Topo” do vetor
3
2
1
4
4
3
2
1
“Fundo” do vetor
“Topo” do vetor
3
2
1
4
4
3
2
1
v(1) > v(2)?
tmp = v(1) v(1) = v(2) v(2) = tmp
1
Posição correta !
MINHA PRIMEIRA META-HEURÍSTICA
4
3
2
1
“Fundo” do vetor
“Topo” do vetor
3
2
1
4
4
3
2
1
v(1) > v(2)?
tmp = v(1) v(1) = v(2) v(2) = tmp
3
4
2
1
v(2) > v(3)?
1
2
4
3
2
1
“Fundo” do vetor
“Topo” do vetor
3
2
1
4
4
3
2
1
v(1) > v(2)?
tmp = v(1) v(1) = v(2) v(2) = tmp
3
4
2
1
v(2) > v(3)?
3
2
4
1
v(3) > v(4)?
1
2
3
Posição correta !
MINHA PRIMEIRA META-HEURÍSTICA
4
3
2
1
“Fundo” do vetor
“Topo” do vetor
3
2
1
4
4
3
2
1
v(1) > v(2)?
tmp = v(1) v(1) = v(2) v(2) = tmp
3
4
2
1
v(2) > v(3)?
3
2
4
1
v(3) > v(4)?
3
2
1
4
1
2
3
4
3
2
1
“Fundo” do vetor
“Topo” do vetor
3
2
1
4
// Para “afundar” o 1º
// elemento realizar n-1
// comparações
for j=1 : n-1
if (v(j) > v(j+1)) then
tmp = v(j);
v(j)=v(j+1);
v(j+1) = tmp;
end
end
Posição correta !
MINHA PRIMEIRA META-HEURÍSTICA
3
2
1
4
“Fundo” do vetor
“Topo” do vetor
2
1
3
4
3
2
1
4
v(1) > v(2)?
tmp = v(1) v(1) = v(2) v(2) = tmp
2
3
1
4
v(2) > v(3)?
2
1
3
4
1
2
3
2
1
4
“Fundo” do vetor
“Topo” do vetor
2
1
3
4
Posição correta !
// Para “afundar” o 2º
// elemento realizar n-2
// comparações
for j=1 : n-2
if (v(j) > v(j+1)) then
tmp = v(j);
v(j)=v(j+1);
v(j+1) = tmp;
end
end
MINHA PRIMEIRA META-HEURÍSTICA
2
1
3
4
“Fundo” do vetor
“Topo” do vetor
1
2
3
4
2
1
3
4
v(1) > v(2)?
tmp = v(1) v(1) = v(2) v(2) = tmp
1
2
3
4
1
2
2
1
3
4
“Fundo” do vetor
“Topo” do vetor
1
2
3
4
Posição correta !
// Para “afundar” o 3º
// elemento realizar n-3
// comparações
for j=1 : n-3
if (v(j) > v(j+1)) then
tmp = v(j);
v(j)=v(j+1);
v(j+1) = tmp;
end
end
MINHA PRIMEIRA META-HEURÍSTICA
// Para “afundar” o 3º // elemento realizar n-3 // comparações for j=1 : n-3
if (v(j) > v(j+1)) then tmp = v(j);
v(j)=v(j+1); v(j+1) = tmp; // Para “afundar” o 2º
// elemento realizar n-2 // comparações for j=1 : n-2
if (v(j) > v(j+1)) then tmp = v(j);
v(j)=v(j+1); v(j+1) = tmp; // Para “afundar” o 1º
// elemento realizar n-1 // comparações for j=1 : n-1
if (v(j) > v(j+1)) then tmp = v(j);
v(j)=v(j+1); v(j+1) = tmp;
// Afundar n-1 elementos. for i = 1: n-1
// “Afundar” o i-ésimo elemento for j = 1 : n-i
if (v(j) > v(j+1)) then tmp = v(j);
v(j)=v(j+1); v(j+1) = tmp; end
Exercício 1
Qual a complexidade do algoritmo de ordenação “Bubble Sort”?
// Afundar n-1 elementos.
for i = 1: n-1
// “Afundar” o i-ésimo
elemento
for j = 1 : n-i
if (v(j) > v(j+1)) then
tmp = v(j);
v(j)=v(j+1);
v(j+1) = tmp;
end
end
end
MINHA PRIMEIRA META-HEURÍSTICA
Exercício 1
Qual a complexidade do algoritmo de ordenação “Bubble Sort”?
// Afundar n-1 elementos.
for i = 1: n-1
// “Afundar” o i-ésimo
elemento
for j = 1 : n-i
if (v(j) > v(j+1)) then
tmp = v(j);
v(j)=v(j+1);
v(j+1) = tmp;
end
end
end
Suponha um vetor com n elementos. Para colocar em ordem crescente o “Bubble Sort” deve “afundar” n-1 elementos a um custo de n-i comparações. Assim, serão necessárias n*(n-1) operações de comparação. Ou seja:
Algoritmo Exponencial no tempo
Um algoritmo é dito exponencial no tempo (exponential-time) se sua
complexidade é O(cn), onde n é uma constante real estritamente superior a 1.
MINHA PRIMEIRA META-HEURÍSTICA
Complexidade dos Problemas
A complexidade de um problema equivale a complexidade do melhor algoritmo para resolver o problema. O problema é dito tratável (ou fácil) se existe um algoritmo de tempo polinomial para sua solução e intratável (ou difícil) se não existe algoritmo de tempo polinomial. Em Teoria da Complexidade os problemas lidam com problema de decisão que são sempre responder sim ou não a uma dada questão. Um problema de otimização pode ser sempre reduzido a um problema de decisão. Existem duas categorias de problemas: P – Conjunto de todos os problemas de decisão que podem ser resolvidos por uma máquina determinística em tempo polinomial. Exemplo: PPL.
“NP-hard problems are optimization problems whose associated decision problems are NP-complete. Most of the real-world optimization problems are NP-hard for which provably efficient algorithms do not exist. They require exponential time (unless P = NP) to be solved in optimality. Metaheuristics constitute an important alternative to solve this class of problems.”
Some NP-hard problems:
• Sequencing and scheduling problems such as flow-shop
scheduling, job-shop scheduling, or open-shop scheduling.
• Assignment and location problems such as quadratic assignment
problem (QAP), generalized assignment problem (GAP), location
facility, and the p-median problem.
• Grouping problems such as data clustering, graph partitioning,
and graph coloring.
• Routing and covering problems such as vehicle routing problems
(VRP), set covering problem (SCP), Steiner tree problem, and
covering tour problem (CTP).
• Knapsack and packing/cutting problems, and so on.
Problems Complexity
Following the complexity of the problem, it may be solved by an
exact method
or an
approximate method
.
Problems Complexity
“Exact methods obtain optimal solutions and guarantee their
optimality. For NP-complete problems, exact algorithms are non
polynomial time algorithms (unless P = NP). Approximate (or
heuristic) methods generate high quality solutions in a reasonable
time for practical use, but there is no guarantee of finding a global
optimal solution.”
MINHA PRIMEIRA META-HEURÍSTICA
Legenda Meta-heurística
ACO Ant colonies optimization
AIS Artificial immune systems
BC Bee colony
CA Cultural algorithms
CEA Coevolutionary algorithms
CMA-ES Covariance matrix adaptation evolution strategy
DE Differential evolution
EDA Estimation of distribution algorithms
EP Evolutionary programming
ES Evolution strategies
GA Genetic algorithms
Legenda Meta-heurística
GLS Guided local search
GP Genetic programming
GRASP Greedy adaptive search procedure
ILS Iterated local search
NM Noisy method
PSO Particle swarm optimization
SA Simulated Annealing
SM Smoothing method
SS Scatter search
TA Threshold accepting
TS Tabu search
VNS Variable neighborhood