problemas de decisão

Propaganda
Módulo 12
4.5 Complexidade de Problemas
4.5.1 Complexidade da Ordenação
4.5.2 Problemas np-completos: o Problema do
Caixeiro Viajante
4.5.3 Problemas Indecidíveis: o Problema da
Correspondência de Post
DCC001 - 2011-2
DCC 001
Programação de Computadores
2º Semestre de 2011
Prof. Osvaldo Carvalho
1
Complexidade da Ordenação
DCC001 - 2011-2
2
Complexidade da Ordenação
 O tempo necessário para ordenar um vetor é
2
O
n

para o SelectSort
 O ( n log( n)) para o MergeSort
 
 Existiriam algoritmos com curvas de crescimento
melhores do que o MergeSort?
 Vamos estudar o comportamento de algoritmos
de ordenação por comparação (existem outros
tipos de algoritmos que, por exemplo, tiram
partido das chaves serem formadas por 3 dígitos)
DCC001 - 2011-2
3
Algoritmos de Ordenação por
Comparações
 Algoritmos de ordenação decidem suas próximas
ações a partir de comparações entre elementos do
vetor de entrada
 Um algoritmo correto deve ser capaz de ordenar
qualquer permutação de [1..n]
 Os diagramas dos próximos slides foram produzidos


DCC001 - 2011-2
“aparelhando” algoritmos de ordenação para registro da
sequência de comparações realizada
submetendo todas as permutações de [1 2 3] a cada
algoritmo
4
Árvore de Decisões
Select Sort
Comparação de elementos de
índices 2 e 3 no vetor original
Resultado de
Comparação
DCC001 - 2011-2
Vetor ordenado
5
Árvore de Decisões
Bolha
DCC001 - 2011-2
6
Árvore de Decisões
QuickSort
DCC001 - 2011-2
7
Requisitos para uma Árvore de Decisões para
Ordenação por Comparação
Permutação 1
?
Árvore de
Decisões
Algoritmo
Arbitrário
Permutação 1
Permutação 1
…
Permutação n!
DCC001 - 2011-2
8
Árvores Binárias
(2 filhos no máximo)
Raiz
DCC001 - 2011-2
“Folhas”
não têm
filhos
9
Profundidade em uma Árvore
p=0
p=1
p=2
p=3
DCC001 - 2011-2
10
Profundidade Máxima e Número de
Folhas de uma Árvore Binária
p
DCC001 - 2011-2
No
máximo
2p folhas
11
Profundidade Mínima
 Árvore de decisões para ordenar n itens têm
obrigatoriamente n! folhas
 Sua profundidade máxima mínima deve ser
tal que
p
2  n!
p  log 2 n! 
log 2 (1)  log 2 (2)    log 2 (n)
DCC001 - 2011-2
12
A soma dos logaritmos é a Soma de
Riemann pela Esquerda de log(n)
DCC001 - 2011-2
13
Complexidade Mínima para Ordenação
n
P   log 2 i    log 2  x dx 
i 1
n
1

x n
n
1
 1  (n log 2 n  
  x log 2 x  
)  (1. log 2 (1) 
)
ln( 2) 
ln( 2)
ln( 2)

n 1
 n log 2 n  
ln( 2)
 Conclusão: A complexidade mínima para
qualquer algoritmo de ordenação por
comparações é On log n
 O MergeSort atinge este limite
DCC001 - 2011-2
14
O Problema do Caixeiro Viajante
DCC001 - 2011-2
15
O Problema do Caixeiro Viajante
 Um caixeiro viajante quer visitar
cidades e
retornar ao ponto de partida, percorrendo a
menor distância possível, sem passar duas
vezes pela mesma cidade
 Ele conhece a distância entre duas cidades
quaisquer de seu roteiro
 Quando não existir uma estrada entre duas
cidades, atribui-se o valor infinito à distância
entre elas
DCC001 - 2011-2
n
16
O Problema do Candidato
 Como minimizar
o custo de
visitar, de avião,
todas as capitais
brasileiras, sem
pousar duas
vezes na mesma
cidade?
DCC001 - 2011-2
17
Um problema com 5 cidades
1
Qual é o melhor
6
roteiro?
5
2
2
3
3
3
4
3
4
DCC001 - 2011-2
7
3
18
Um Caminho
 Custo = 19
5
1
2
6
2
3
3
3
4
3
4
DCC001 - 2011-2
7
3
19
Outro Caminho
1
Custo = 22
2
6
5
2
3
3
3
4
3
4
DCC001 - 2011-2
7
3
20
O Problema do Caixeiro Viajante
Custo = 15
Caminho ótimo!
5
1
2
6
2
3
3
3
4
3
4
DCC001 - 2011-2
7
3
21
Um problema com 8 cidades
1
8
12 9
9
14 8
11
13
1
7
12
2
3
5
12
4
11
6
12
3
6
12
15
15
DCC001 - 2011-2
9
10
4
5
1
22
Um caminho
1
 Custo = 81
8
9
14 8
12 9
11
13
1
7
12
2
3
5
12
4
11
6
12
3
6
12
15
15
DCC001 - 2011-2
9
10
4
5
1
23
Outro caminho (o pior)
1
 Custo = 98
8
12 9
9
14 8
11
13
1
7
12
2
3
5
12
4
11
6
12
3
6
12
15
15
DCC001 - 2011-2
9
10
4
5
1
24
Caminho Ótimo
1
 Custo: 64
8
14 8
12 9
9
11
13
1
7
12
2
3
5
12
4
11
6
12
3
6
12
15
15
DCC001 - 2011-2
9
10
4
5
1
25
Solução “Força Bruta” para o Caixeiro Viajante
1. Gerar todas as alternativas de rota
=
todas as permutações de cidades,
excetuando a cidade de partida
2. Para cada rota, calcular seu custo
total
3. Escolher a rota de menor custo
DCC001 - 2011-2
26
O Programa CaixeiroViajante.sce
Primeira Versão
//
//
//
//
//
DCC001 - 2011-2
Lê a matriz de distâncias
Gera todas as rotas possíveis
Calcula o custo de cada rota
Seleciona a de menor custo
Imprime o resultado
27
Arquivo com a matriz de distâncias
 fscanfMat só lê números
 Como as distâncias são positivas, usamos -1
para representar ∞
DCC001 - 2011-2
28
Leitura da matriz de distâncias
// Lê a matriz de distâncias
Dist = ...
fscanfMat(uigetfile("*.txt",pwd(),"Distâncias"));
// Substitui -1 por %inf
Dist(Dist==-1) = %inf;
Elementos de Dist
onde Dist==-1
DCC001 - 2011-2
29
Obtenção das rotas e cálculo dos custos
[nl,nc] = size(Dist); //nl deve ser igual a nc
Rotas = permutations(2:nc);
// Calcula o custo de cada rota
[NL,NC] = size(Rotas);
for i = 1:NL
Custo(i) = cost(Dist,[1 Rotas(i,:) 1]);
end
Justaposição de 1
às rotas geradas
DCC001 - 2011-2
30
A função cost
function c = cost(D,path)
c = 0;
for i=1:length(path)-1
c = c + D(path(i),path(i+1));
end
endfunction
DCC001 - 2011-2
31
A função permutations
Cabeçalho
Function p = permutations(A)
// gera uma matriz p onde
// cada linha é uma permutação de A
endfunction
DCC001 - 2011-2
32
Permutações
 Para um problema com 4 cidades, as rotas a serem
examinadas são (lembrando que a cidade 1 é o início
e o fim do percurso)
2.
3.
4.
2.
4.
3.
3.
2.
4.
3.
4.
2.
4.
2.
3.
4.
3.
2.
DCC001 - 2011-2
33
Algoritmo para gerar permutações de um
vetor
 Se o vetor é de tamanho 1, ele já é a única
permutação; senão,
 “Separar” o primeiro elemento do vetor;
 Gerar todas as permutações dos elementos
restantes, e concatená-las ao elemento
separado
 Repetir este passo para os demais elementos
do vetor
DCC001 - 2011-2
34
Exemplo de Geração de Permutações
 Vetor = [2 3 4]
 Passos:
 Separar o elemento 2, e gerar todas as
permutações de [3 4]; concatenar 2 às
permutações obtidas;
 Separar o elemento 3, e gerar todas as
permutações de [2 4]; concatenar 3 às
permutações obtidas;
 Separar o elemento 4, e gerar todas as
permutações de [2 3]; concatenar 4 às
permutações obtidas;
DCC001 - 2011-2
35
A função permutations
function p = permutations(A)
if length(A) == 1 then
p = A;
else
p = [];
for i = 1:length(A)
B = permutations(OneOut(A,i));
[nl,nc] = size(B);
for j = 1:nl
p = [p ; [A(i) B(j,:)]];
end
end
end
endfunction
DCC001 - 2011-2
36
A função OneOut
function b = OneOut(A,i)
x = 1:length(A);
b = A(x ~= i);
endfunction
DCC001 - 2011-2
37
Caixeiro Viajante
Complexidade
 Solução “força bruta”:
 Gerar todas as permutações das cidades
 Para cada uma, calcular a distância total
 Escolher o roteiro com a menor distância total
 Problema com a força bruta: são (n-1)! roteiros
 Para o exemplo com 5 cidades, são 4! = 24
possibilidades, mas
 Para o problema das capitais brasileiras, são 26! =
~ 4 x 1026 possibilidades a serem examinadas!
DCC001 - 2011-2
38
Caixeiro Viajante Complexidade
 Existiriam soluções melhores?
 Sim, mas a melhor encontrada até hoje
é
On 2
2 n

 Isto é pior do que qualquer potência de
n, ou que qualquer polinômio em n
DCC001 - 2011-2
39
As Classes P e NP
DCC001 - 2011-2
40
Comparação de funções de
complexidade
Função de
complexidade
n
10
20
30
40
50
60
0,00001 0,00002 0,00003 0,00004 0,00005 0,00006
segundos segundos segundos segundos segundos segundos
2
0,0036
0,0025
0,0016
0,0009
0,0004
0,0001
segundos segundos segundos segundos segundos segundos
n3
0,216
0,125
0,064
0,027
0,008
0,001
segundos segundos segundos segundos segundos segundos
n5
1,7
24,3
3,2
0,1
segundos segundos segundos minutos
2n
17,9
1,0
0,001
segundos segundos segundos
n
3
DCC001 - 2011-2
Tamanho da Instância do Problema
n
58
0,059
segundos minutos
6,5
anos
5,2
minutos
13,0
minutos
12,7
dias
35,7
anos
366
séculos
3855
séculos
2 × 108
séculos
1,3 × 1013
séculos
41
Efeito de Progressos Tecnológicos
Maior instância que um computador resolve em 1 hora
Computador Computador
Função de
Computador
100x mais
1000x mais
complexidade
Atual
rápido
rápido
N
100 N
1000 N
n
DCC001 - 2011-2
n2
M
10 M
31,6 M
n3
Z
4,64 Z
10 Z
n5
W
2,5 W
3,98 W
2n
X
X + 6,64
X + 9,97
3n
Y
Y + 4,19
Y + 6,29
42
Problemas de Decisão
 Teóricos de complexidade preferem trabalhar
com problemas de decisão, cuja resposta é
Sim ou Não
 O problema de decisão associado ao Caixeiro
Viajante é:

DCC001 - 2011-2
Dado um conjunto de n cidades e suas distâncias,
existe pelo menos uma rota com custo menor que
um dado valor B?
43
Satisfatibilidade (SAT)
 Dados:
 um conjunto de variáveis booleanas v1,…,vn, e
 um conjunto de cláusulas, que são expressões
com OR destas variáveis, como v3+v7’+v10
 Existe um conjunto de valores para v1,…,vn
tal que o AND de todas as cláusulas tenha o
valor True?
DCC001 - 2011-2
44
Verificando uma Solução de um
Problema de Decisão
 A vantagem de um problema de decisão é a
possibilidade de definição de um problema
associado, que somente verifica uma solução
apresentada
 O problema de verificação pode ter
complexidade menor do que o problema de
decisão
 P.Ex, é possível verificar se uma dada rota
tem custo menor que B em tempo linear
DCC001 - 2011-2
45
A Classe NP de Problemas de Decisão
 Um problema de decisão está na classe de complexidade
 P : quando existe um algoritmo polinomial que o resolve;
 NP: quando o problema de verificação associado a ele tem
complexidade polinomial, como é o caso do Caixeiro Viajante e do SAT
 NP não quer dizer Não Polinomial, mas sim
Non-deterministic
Polynomial, referindo-se a um artifício teórico utilizado para se
ter o problema de verificação “resolvendo” por sorteio o
problema de decisão
DCC001 - 2011-2
46
Problemas NP-completos
 O Caixeiro Viajante e o SAT são exemplos de
problemas NP-completos,
 Um problema Π é NP-completo quando qualquer
problema da classe NP pode ser transformado
em Π
DCC001 - 2011-2
47
P = NP?
 Apesar dos esforços dos mais brilhantes e
persistentes cientistas da computação,
ninguém conseguiu


DCC001 - 2011-2
provar que um problema como o SAT não
pertence à classe P, apresentando um algoritmo
polinomial que o resolva (ou que resolva qualquer
problema NP-completo)
provar (como fizemos com algoritmos de
ordenação) que não existe tal algoritmo
48
P = NP?
 Se você
 Provar que não existe nenhum algoritmo
polinomial para qualquer problema NP-Completo,
 Ou
 Encontrar um algoritmo polinomial para um
problema NP-Completo,
 Você terá de imediato 1 milhão de dólares,
glória e fama eternas
DCC001 - 2011-2
49
Problemas Indecidíveis
DCC001 - 2011-2
50
O Problema de Emil Post
Tipo 1
100
100
100
11100
100
11
1
Tipo 2
00
00
100
0
100
100
100
100
Tipo 3
11
11
00
1
00
00
00
00
 Considere um estoque ilimitado de dominós de um número
finito de tipos
 Todos os dominós de um tipo têm um mesmo string de 0s e
1s na parte de cima e outro na parte de baixo
 O problema de Post consiste em obter uma sequência de
dominós tal que os strings formados pela concatenação dos
strings superiores e inferiores sejam iguais
DCC001 - 2011-2
51
O Problema de Post
 Solução com 7 dominós
100
1
100
1
1
00
0
100
100
1
100
1
1
00
1
00
0
100
0
100
1001100100100
DCC001 - 2011-2
52
O Problema de Post
 Algoritmo força-bruta:
n
= 0;
 repita
 n = n+1
 teste todas as sequências com n
dominós
 até encontrar uma solução
DCC001 - 2011-2
53
Geração de sequências
 n=1
[1] [2] [3]
 n=2
[1 1] [1 2] [1 3] [2 1] [2 2] [2 3] [3 1] [3 2] [3 3]
 n=3
[1 1 1] [1 1 2] [1 1 3] [1 2 1] [1 2 2] [1 2 3] [1 3 1]...
DCC001 - 2011-2
54
Método para Geração das Sequências
 É como contar: os tipos de dominós parecem algarismos
em um sistema de numeração
 Se o algarismo menos significativo for menor que T (nro. de
tipos), soma-se 1 a ele;
 Senão, coloca-se 1 no algarismo menos significativo, e
propagamos o vai-um, aumentando o número de
algarismos se for o caso
 Exemplos com T = 3



Suc([2]) = [3]; Suc([3]) =[1 1]
Suc([2 2]) = [2 3]; Suc([2 3]) = [3 1]
Suc([3 3]) = [1 1 1]
DCC001 - 2011-2
55
O programa Post.sce
// Leitura do problema de Post
[nTypes Up Down] = ReadPostProblem();
WritePostProblem(Up,Down);
found = %f;
seq = [];
while ~found
seq = Sucessor(seq,nTypes);
upString = strPost(Up,seq);
dnString = strPost(Down,seq);
found = upString == dnString;
if found then
WritePostSolution(seq,Up,Down);
end
end
DCC001 - 2011-2
56
A função Sucessor
function s = Sucessor(r,nTypes)
// retorna o sucessor da sequência r
VaiUm = 1;
for i = length(r):-1:1
if VaiUm > 0 then
if r(i) < nTypes then
r(i) = r(i) + 1;
VaiUm = 0;
else
r(i) = 1;
end
end
end
if VaiUm == 1 then
s = [1 r];
else
s = r;
end
endfunction
DCC001 - 2011-2
57
A função Sucessor:
Exemplos de Uso
-->Sucessor([],3)
ans =
1.
-->Sucessor([2 3 1],3)
ans =
2.
3.
2.
-->Sucessor([3 3 3],3)
ans =
1.
1.
1.
1.
DCC001 - 2011-2
58
Teste do Programa Post.sce
Problema de Post:
100
0
1
1 100
00
Solução: 1001100100100
1
3
1
1
3
100
1 100 100
1
1
00
1
1
00
DCC001 - 2011-2
2
0
100
2
0
100
59
Um Problema de Post difícil
1000
0
01
0
1
101
00
001
 A menor solução para o problema acima usa 206
dominós!
 Como geramos sequências na forma como
contamos, seria contar até obter um número com
206 algarismos; em um notebook, o programa
Post.sce demoraria 10112 anos para resolver!
 Ruim? Pois ainda pode ser bem pior!
DCC001 - 2011-2
60
O Problema de Post
 O problema:
10
0
0
001
001
1
 tem solução?
 Até hoje ninguém sabe!
DCC001 - 2011-2
61
Problemas Indecidíveis
 O problema de Post pertence à classe dos
problemas indecidíveis
 O espaço de busca em um problema np-completo
como o do Caixeiro Viajante é grande, cresce
explosivamente, mas
 Em um problema indecidível o espaço de busca é
infinito! Para o problema de Post, sempre existe a
possibilidade da solução ser uma sequência maior
DCC001 - 2011-2
62
Conclusões
 Resultados teóricos do estudo de um problema podem
colocar limites na complexidade de qualquer algoritmo que o
resolva
 Problemas np-completos


não têm resultados teóricos com estes limites, mas
todas as soluções já encontradas são piores que qualquer polinômio
 Problemas indecidíveis têm como resultado teórico a não
existência de nenhum algoritmo que garantidamente
encontre uma solução
DCC001 - 2011-2
63
Download