• Nenhum resultado encontrado

A Complexidade dos Problemas

2.1 Complexidade dos Problemas

2.1.4 Classificação dos problemas

A ciência da computação enfrenta grandes problemas quando pesquisa a eficiência dos algoritmos e as dificuldades existentes no seu desenvolvimento e implementação desses algoritmos para solucionar problemas de complexidade computacional. Uma dessas dificuldades está na descoberta de que o esforço necessário para resolver, precisamente, um problema no computador, pode variar enormemente. No que tange a este problema, existe um grande esforço dos pesquisadores para provar a existência ou não de algoritmos que solucionem problemas de elevado nível de complexidade computacional.

Segundo LEWIS & PAPADIMITRIOU (2000), o que tem poupado os cientistas de tentativas inúteis, é a proposição de métodos matemáticos que irão ajudar a provar que um problema de interesse pertence ou não a uma determinada classe. Saliente-se que essa é uma grande contribuição da ciência da computação para a resolução desses problemas.

A integração entre problemas e linguagem está somente em dizer que são coisas iguais, porém, tratadas sob aspectos diferentes. Linguagens são mais apropriadas em conexão à máquina de Turing, enquanto problemas são instruções mais claras de práticas computacionais, como tarefas de interesse prático, para as quais devem ser desenvolvidos algoritmos.

Em tese, a grande maioria dos problemas pode ser resolvida por um algoritmo em tempo polinomial, desde que não se faça exigência quanto ao tipo de máquina que irá executá-lo. A idéia de que o algoritmo pode ser executado em tempo polinomial vem da relação existente entre os problemas de decisão e os algoritmos, através da teoria das linguagens, pela qual sempre é possível exibir um algoritmo que o resolva.

A teoria da linguagem descreve que existem modelos matemáticos com características, por exemplo, não-determinísticas, que não podem ser executados por máquinas reais. Logo, a grande maioria dos problemas, inclusive aqueles que

apresentam complexidade com crescimento exponencial, podem ser resolvidos por algoritmos com características não-determinísticas. O fato é que existem máquinas reais e máquinas que não são reais, que existem apenas teoricamente. As máquinas reais, como os computadores, só podem executar algoritmos em que os passos são determinados; mais precisamente, os computadores só podem executar algoritmos determinísticos, ao contrário dos modelos como a máquina de Turing, que podem também executar algoritmos não-determinísticos.

Existe um grande número de problemas que os algoritmos são capazes de resolver, porém, para muitos deles, não se pode chegar a uma solução em um tempo aceitável. Também há problemas com ordem de grandeza exponencial que, em termos computacionais, são intratáveis. Um problema é referido como intratável quando é difícil encontrar a sua solução, a ponto de ser necessário um tempo exponencial para descobri-la, ou quando a resposta é tão longa que se precisa de um tempo exponencial para descrevê-la. Isso prova que qualquer algoritmo que o resolva não possui complexidade polinomial. Por outro lado, se existir um algoritmo de complexidade polinomial que resolva o problema em tempo oportuno, e esta solução for provada, então considera-se que se tem um problema tratável.

Em relação à complexidade dos seus algoritmos, os problemas são divididos em várias classes, tais como P, NP e NP-Completo, descritas nas sessões seguintes.

Definição: A classe P é formada pelo conjunto de todos os problemas que

podem ser resolvidos por um algoritmo determinístico em tempo polinomial, ou ainda pelos procedimentos para os quais existe um polinômio p(n) que limita o número de passos do processamento se este for iniciado com uma entrada de tamanho n.

Segundo LEWIS & PAPADIMITRIOU (2000), essa parece ser a única proposta séria da teoria da computação, apesar de ainda existirem algumas argumentações contestando a definição citada anteriormente.

A classe de problemas polinomiais tem propriedades de fechamento em relação à adição, à multiplicação e à composição. Assim, um algoritmo polinomial que gera

entrada para outro algoritmo polinomial, forma um algoritmo composto, também polinomial. Estes problemas são da classe P.

Observe-se que mesmo não se conhecendo o algoritmo polinomial de um problema, não significa, necessariamente, que o mesmo não pertença à classe P, devendo ser exibida formalmente a prova de que todo o algoritmo possível para resolver tal problema não é polinomial. O problema da SAT (Satisfiability Problem) consiste em determinar se a expressão é verdadeira para uma determinada atribuição das variáveis lógicas. Dado x1 = V, x2 = F, x3 = F, o fato de a resposta exigir o teste de cada uma das

cláusulas que conduz à resposta F, e o problema do ciclo hamiltoniano, que consiste em um caminho fechado v1,v2,....,vn, v1, são dois problemas para os quais não se conhece

algoritmo exato e tempo polinomial. Esses problemas são, em sua maioria, os chamados problemas de decisão, para os quais todos os algoritmos conhecidos são de complexidade exponencial (LEWIS & PAPADIMITRIOU, 2000). Existem problemas que, apesar de pertencerem a essa classe, não são problemas de decisão, como os de otimização, mas que é possível, através de mecanismos adequados, transformá-los em tal.

Antes de definir a classe NP, descreve-se a noção de não-determinismo. Diz-se que um algoritmo é não determinístico se, além de todas as regras de um algoritmo determinístico, ele pode fazer escolhas de forma não determinística. Informalmente, pode-se definir a classe NP em termos de um algoritmo não determinístico. Tal algoritmo é dividido em duas partes. A primeira parte corresponde à escolha da provável solução (podendo fazer uso de escolhas não determinísticas). A outra parte consiste em verificar, de forma determinística, a viabilidade de uma solução.

Definição: A classe NP é formada pelo conjunto de todos os problemas

computáveis, cujas soluções até então conhecidas são de ordem exponencial e não se sabe se existe uma solução melhor, de complexidade polinomial.

Obviamente, todo problema que admite um algoritmo de rapidez polinomial pertence a NP, isto é, P ? NP, pois todo algoritmo determinístico é equivalente a um

não-determinístico. Outro entendimento para a classe NP é o de que ela consiste em todos os problemas de decisão, para os quais existe uma justificativa à resposta SIM, cujo passo de verificação pode ser realizado por um algoritmo polinomial.

Um problema NP-completo é um problema "representante" de uma classe de problemas NP.

Não se sabe se P = NP, embora a maioria dos pesquisadores acredite que esta igualdade não seja válida. Essa é talvez a maior conjectura na área de ciência da computação. Uma das maiores razões de se acreditar que P ? NP, é a existência da classe de problemas NP-completo. Um problema é NP-completo se é NP e se existe uma redução polinomial de qualquer problema NP para este problema, de tal forma que os problemas da classe são redutíveis a ele em tempo polinomial. Por exemplo, o problema de caixeiro-viajante é um poblema redutível ao problema de ciclo hamiltoniano. Dizemos então que o problema de ciclo hamiltoniano é um problema NP- completo. Dessa maneira, se existir um algoritmo polinomial para um problema NP- completo, então todos os problemas de NP podem ser resolvidos polinomialmente. Parece intrigante a existência de tal conjunto, mas, de fato, COOK (1971) mostrou que o problema da satisfatibilidade (SAT) também pertence à classe NP-completo.

Há um grande número de problemas do mundo real, no qual ainda não se conhecem algoritmos em tempo computacional adequado para resolvê-los, e cuja dificuldade intrínseca ainda não foi provada. No entanto, problemas como Caixeiro Viajante, Problema da Mochila, Ciclo Hamiltoniano, SAT, dentre outros, para os quais já se tem provas formais dessas dificuldades, são problemas considerados intratáveis pertencentes à classe NP-Completo. LEWIS & PAPADIMITRIOU, (2000), por exemplo, relacionam inúmeros problemas conhecidamente intratáveis.

Até agora foi demonstrado que, se um algoritmo de complexidade polinomial puder ser encontrado para qualquer um dos problemas NP-completos, então todos os problemas NP-completos serão na verdade problemas P. Por outro lado, se for provado que um dos problemas requer um algoritmo de solução que apresente complexidade exponencial, então todos irão requerer complexidade exponencial (LEWIS & PAPADIMITRIOU, 2000).

A figura 2.2 mostra um simples diagrama da classe NP. Essa classe contém a subclasse P e NP-Completo, sendo P uma subclasse de menor dificuldade, e NPC de maior dificuldade.

Figura 2.2 - Relacionamento entre P, NP e NPC

Documentos relacionados