- Problema de decisão, em que a resposta é sim ou não
- Problema de busca, em que queremos encontrar uma solução satisfazendo algumas propriedades se ela existir. Caso contrário, retornar que não exite
- Problema de otimização, em que cada solução tem um valor associado, e queremos encontrar uma solução com o melhor valor (máximo ou mínimo)
- 
Intuição: 
- Problema é tratável se existem algoritmos eficientes para ele
- Problema é intratável se tais algoritmos não existem
 
- 
Até agora no curso, praticamente todos os problemas que encaramos eram tratáveis 
- 
Mas nada garante que seja sempre este o caso 
- 
Definição clássica de eficiência: 
- Um algoritmo é eficiente se e somente se ele executa em tempo polinomial em um computador serial
 
- 
Se o grau do polinômio for grande, o problema deve ser inviável 
- O(n), O(nlogn), O(n2log2n)  - ok!
- O(n10.000.000.000) - eficiente?
 
- 
Tempo de execução exponencial podem ser eficientes na prática 
- O(2n), O(n!) - ok!
- O(1.0000000001n) - ineficiente?
 
- 
Um problema é chamado de tratável se e somente se existe um algoritmo eficiente (isto é, de tempo polinomai) que  o revolsa. 
- 
Um problema é chamado de intratável se e somente se não existe um algoritmo eficiente que o resolva. 
- 
Problemas intratáveis são comuns. Precisamos reconhecê-los quando nos deparamos com algum deles na prática. 
- P é a classe dos problemas resolvidos em tempo polinomial
- Exemplos de problemas em P:
- Caminho mais curto
- Ordenação
- Árvore geradora mínima
- Fluxo em redes
- Multiplicação de matrizes
 
- Infelizmente, nem todo problema está em P 😦
- Existem problemas para os quais não existe qualquer algoritmo
 Ex.  problema da Parada
- Existem outros para os quais, por mais que se busque, não sãoconhecidos algoritmos polinomiais
 Ex.:  problema do Caixeiro Viajante (TSP)
- Mas, a princípio, isso não garante que tais algoritmos não existam
- Como descrever uma classe que englobe problemas como o TSP?
- 
A classe NP consiste em todos os problemas de decisão em que podemos verificar se uma solução é correta em tempo polinomial 
- 
Essas definições são algorítmicas 
- 
Definiçõeses formais destas classes vem da área de teoria da computação 
- 
O nome NP significa "Nondeterministic Polynomial" 
- O problema A se reduz ao problema B  se conseguimos resolver qualquer instância de A usando um algoritmo que resolve B
 
- Transformamos a entrada A em entrada B, e depois a solução B em solução A
- Se transformações são polinomiais, A é polinomialmente redutível a B
- Exemplo: Seleção em Ordenação. Vamos usar um algoritmo de ordenação para selecionar o k-ésimo menor elemento de de um vetor
 
- Esta reduçãoo resolve o problema da seleção em tempo O(nlogn)
- Note que é possível resolver a seleção em tempo linear
- Numa redução o algoritmo para B pode ser utilizado várias vezes
- Exemplo:  Caminho Todos para Todos em Caminho Um para Todos
 
- Notem que nesse caso o algoritmo obtido ainda é polinomial
- Reduçãoo entre problemas é uma técnica valiosa para o projeto de algoritmos
- Permite utilizar soluções já conhecidas para resolver novos problemas
- Um projetista de algoritmos sempre deve se perguntar:
“Será que este problema não se parece com algum que eu já conheço?”
- Redução usada para atestar a dificuldade relativa de um problema
- Como provar que um problema é tão difícil quanto outro?
 
- Observe que B não pode ser mais fácil do que A
- Dados um grafo G e um inteiro positivo k, existe conjunto S⊆V(G) de vértices tais  que  para  todo  par u,v∈S existe uma  aresta uv∈E(G)  (S é  clique)  e ∣S∣≥k?
 
- Clique-k está em NP:
- É um problema de decisão (a resposta é sim caso exista)
- Dados G, k e S É fácil verificar se S é uma clique: basta verificar se todos os pares de vértices formam arestas e contar os vértices de S
 
- Dado um grafo G e um inteiro k, existe conjunto S⊆V(G) tal que, para toda aresta uv∈E(G), u∈S ou v∈S e ∣S∣≤k?
 
- k-Cobertura por vértices está em NP pois, dados G, k, e S podemos verificar em tempo polinomial se ∣S∣≤k e se todas as arestas do grafo tem ao menos uma aresta no conjunto.
- Exemplo: Clique-k é redutivel para k-cobertura por vértices
 
- Se clique-k não tiver um algoritmo polinomial
- Então k-cobertura por vértices também não tem um algoritmo de tempo polinomial
- 
Exemplo: Clique-k é redutivel para k-cobertura por vértices 
- 
Afirmação: Se G tem um clique de tamanho k, Gc tem uma k-cobertura de tamanho ∣V∣−k 
- Seja V′ uma clique
- Então V−V′ é uma cobertura por vértices em Gc
- Seja (u,v) qualquer vértice em Gc
- Então u e v não podem estar ambos em V′
- E pelo menos u ou v está V−V′, então a aresta (u,v) é coberta por V−V′
- Já que isso é valido para qualquer aresta em Gc, V−V′ é uma cobertura por vértices
 
 
- 
Exemplo: Clique-k é redutivel para k-cobertura por vértices 
- 
Afirmação: Se G tem um clique de tamanho k, Gc tem uma k-cobertura de tamanho ∣V∣−k 
- Para todo u,v∈V, se (u,v)∈Gc, então u∈V′ ou v∈V′, ou ambos
- Caso não fosse verdade, (u,v)∈E(G)
- Em outras palavras, todos os vértices de V−V′  estão conectados por uma aresta, então V−V′ é uma clique
- Uma vez que ∣V∣−∣V′∣=k, o tamanho da clique é k
 
 
- G possui uma clique V′ de tamanho k
 
 
- Gc possui uma cobertura por vértice V∖V′ de tamanho n−k
 
- 
Interpretaçõees para “A é redutível a B”: 
- "Positiva" A  ́e no máximo tão difícil quanto B
- "Negativa" B  ́e pelo menos tão difícil quanto A
 
- 
Primeira expande o conjunto de problemas tratáveis 
- 
Segunda expande o conjunto dos intratáveis 
- 
Um Problema Π é C-Completo se: 
- Π está  em C
- Todo problema em C é redutível a Π
 
- 
Podemos pensar que Π é o "problema mais difícil" em C 
- 
Notem quão forte é essa definição 
- 
E que não é tão óbvio que algum problema Π em C a satisfaça 
- 
Apesar disso, vamos supor que existam problemas C-Completos 
- 
Sendo Π um problema em C 
- 
Para mostrar que Π ́e C-Completo temos que: 
- Escolher um problema C-Completo Π′
- Reduzir o problema Π′ para Π
 
- 
Isso funciona pois: 
- Todo problema em C é redutível a Π′
- E por consequência é redutível a Π
 
- 
Voltamos à questão: 
"Como mostrar a dificuldade dos problemas em NP (que não sabemos se estão em P)?” 
 
- 
Um forte atestado de dificuldade seria mostrar que todo problema de NP reduz pra um desses problemas 
- 
Já que isso mostraria que esse problema e o mais difícil dentre todosde NP e que bastaria resolver ele pra resolver todos os outros 
- 
Mas, será que a classe dos problemas NP-Completos  é ou não vazia? 
- Por incrível que pareça, existem muitos problemas NP-Completos
- Sendo um exemplo notável o problema da satisfatibilidade (SAT)
- Já sabemos que para mostrar que um problema é NP-Completo, basta reduzir qualquer problema NP-Completo a ele
- Assim, muitos outros problemas foram provados NP-Completos
- Considere um conjunto de variáveis booleanas x1,x2,⋯,xn
- E uma fórmula composta por essas variáveis e conjunçẽos (operador e) de conjuntos de disjunções (operadores ou). Por exemplo:
(x1∨x2∨x3∨x4)∧(x1∨x2)
(x1∨x2∨x3)∧(x1∨x2∨x4∨x5∨x6)
- Cada conjunto de disjunção é chamado de cláusula.
- Um literal é uma variável x ou sua negação x
- O problema da satisfatibilidade consiste em verificar se a fórmula é satisfatível, isso é, existe uma atribuição de valores para as variáveis tal que a fórmula tem o valor 1.
- Uma fórmula booleana formada por conjunções de cláusulas que contém exatamente 3 literais é chamado de 3-CNF. Por exemplo
(x1∨x2∨x3)∧(x1∨x2∨x4)
(x1∨x2∨x3)∧(x1∨x2∨x4)∧(x4∨x5∨x6)
- O problema 3-SAT consiste em verificar se uma fórmula 3-CNF é satisfatível, ou seja, se existe uma atribuição de valores para as variáveis tal que a fórmula 3-CNF tenha valor 1.
- 
Observe que 3-SAT está em NP pois dada uma fórmula e uma atribuição das variáveis, é fácil verificar se essa atribuição satisfaz a fórmula 
- 
Em 1972, Stepehn Cook e  Richard Karp provaram que 3-SAT é NP-completo. 
- 
Hoje em dia, se conhecem  milhares de problemas que são NP-Completos 
- 
Dada uma fórmula 3-CNF ϕ com k cláusulas sobre as variáveis  x1,x3,⋯,xn 
- 
Construímos um grafo G que possui 3k vértices, de modo que cada cláusula tem 3 vértices representando cada um de suas variáveis. 
- 
Um par de vértices v e w de G forma uma aresta se e somente se v e w estão em cláusulas diferentes, v corresponde a um literal x
 e w não corresponde a um literal x
 
 
- 
ϕ com k clausulas é satisfatível se e somente se existir um clique-k no grafo G 
- 
Se existir uma clique em G, então existe ϕ é satisfatível 
- Por definição, uma clique-k implica que existe k vértices em G que são conecatados entre si.
- Pela nossa construção, o fato que dois vértices estão conectados entre si significa que eles podem receber uma atriuição consistente (podemos atribuir 1 a todos eles), e eles estão em cláusulas diferentes
- Uma vez que existem k vértices na clique, então pelo menos uma literal em cada uma das k cláusulas podem ser atribuídas a 1, isto é, ϕ pode ser satisfeita.
 
- 
ϕ com k clausulas é satisfatível se e somente se existir um clique-k no grafo G 
- 
Se ϕ pode ser satisfeita, então existe uma clique em G 
- Se ϕ pode ser satisfeita, então pelo menos uma literal em cada cláusula é atribuída ao valor 1
- Considere os vértices correspondentes a essas literais. Uma vez que as literais são consistentes e elas estão em diferentes cláusulas, existe uma aresta entre cada par delas.
- Uma vez que existem k cláusulas em ϕ, temos um subconjunto de tamanho de pelo menos k vértices no grafo com arestas entre cada par de vértices, isto é, uma clique-k em G.
 
 
- 
O problema P=?NP é um problema classico 
- 
Se existir algoritmo polinomial para um problema NP-Completo... 
- 
conseguimos resolver todos os problemas em NP em tempo polinomial, provando que P=NP... 
- 
e respondendo assim à maior questão em aberto da ciência da computação. 
- 
Entretanto, muitos pesquisadores acreditam que isso não é possível, mas não se conhece uma prova que P=NP 
- A ligação entre NP-Completude e a questão P=?NP demonstra a importância desta classe para a ciência da computação
- Mas por que um projetista de algoritmos deveria se preocupar?
- Porque problemas NP-Completos são extremamente comuns
- E existe pouca esperança de obter um algoritmo polinomial para eles
- 
NP-difícil é o conjunto de problemas Q tais que todo outro problema de NP é redutível a Q 
- 
O problema Q é pelo menos tão difícil quanto qualquer outro problema em NP 
- 
O problema Q não precisa estar em NP, pois não precisa ser um problema de decisão. 
- 
Uma outra definição para NP-Completo são os problemas NP que são NP-difíceis. 
- Se P=NP, então não existe solução polinomial para os problemas NP-Hard
 
- Assim, se voce se deparar com um problema difícil
- É importante saber verificar se ele é NP-Completo ou NP-Difícil
- Para tratá-lo de modo adequado
- Hoje não apresentamos opções para lidar com problemas NP-Completos
- Mas mostramos como identificá-los