CodeGym /Curso Java /Python SELF PT /Força bruta e sua complexidade

Força bruta e sua complexidade

Python SELF PT
Nível 62 , Lição 1
Disponível

7.1 Força Bruta.

Definição: Força bruta (brute force) é um método de solução de problemas que consiste em verificar todas as possíveis soluções e escolher a melhor. Ele garante encontrar a solução ótima, mas muitas vezes é ineficiente devido à alta complexidade computacional.

Exemplo: Vamos considerar o problema do caixeiro-viajante (Travelling Salesman Problem, TSP). Aqui, é necessário encontrar o caminho mais curto que passe por todas as cidades e retorne à cidade de origem. A força bruta inclui a verificação de todas as possíveis permutações das rotas, o que tem complexidade de tempo fatorial O(n!).

Vantagens:

  • Simplicidade de implementação.
  • Garantia de encontrar a solução ótima.

Desvantagens:

  • Alta complexidade computacional.
  • Impraticável para problemas de grande porte devido ao crescimento exponencial do número de verificações.

Exemplo em Python para TSP:


import itertools

def calculate_distance(path, distance_matrix):
    return sum(distance_matrix[path[i - 1]][path[i]] for i in range(len(path)))
            
def tsp_brute_force(distance_matrix):
    n = len(distance_matrix)
    all_permutations = itertools.permutations(range(n))
    min_distance = float('inf')
    best_path = None
            
    for perm in all_permutations:
        current_distance = calculate_distance(perm, distance_matrix)
        if current_distance < min_distance:
            min_distance = current_distance
            best_path = perm
            
    return best_path, min_distance
            
# Exemplo de uso
distance_matrix = [
    [0, 10, 15, 20],
    [10, 0, 35, 25],
    [15, 35, 0, 30],
    [20, 25, 30, 0]
]
best_path, min_distance = tsp_brute_force(distance_matrix)
print(f"Melhor caminho: {best_path} com a menor distância: {min_distance}")
        

7.2 Problemas da Classe NP

A classe NP (não-determinístico polinomial) inclui problemas, cujas soluções podem ser verificadas em tempo polinomial. No entanto, encontrar a solução pode levar tempo exponencial.

Falando em termos leigos: problemas NP são aqueles em que a melhor solução é encontrada apenas através da verificação de todas as possibilidades (tempo exponencial). Mas verificar se a solução encontrada é a melhor pode ser feito mais rápido (tempo não exponencial).

Principais características:

  • Verificação da solução: Se for dada uma solução possível para o problema, sua corretude pode ser verificada em tempo polinomial.
  • Problemas NP-completos: Subconjunto de problemas da classe NP, que são os mais complexos em NP. Se houver um algoritmo polinomial para resolver ao menos um problema NP-completo, então todos os problemas da classe NP podem ser resolvidos em tempo polinomial.
  • Problemas NP-difíceis: Problemas cuja complexidade não é menor que a de qualquer problema da classe NP.

Exemplos de problemas NP-completos:

  • Problema do caixeiro-viajante (Travelling Salesman Problem, TSP): Encontrar o caminho mais curto que passa por todas as cidades.
  • Problema da Mochila (Knapsack Problem): Encontrar o conjunto de itens que maximize o valor sem exceder o peso permitido.
  • Problema da Cobertura de Vértices (Vertex Cover): Encontrar o menor conjunto de vértices que cubra todas as arestas de um grafo.
  • Problema de Satisfação Booleana (Boolean Satisfiability Problem, SAT): Determinar se existe um conjunto de variáveis que satisfaça uma fórmula booleana.

7.3 Recomendações para Abordagens na Resolução de Problemas Complexos

Se a melhor solução requer um tempo inadequado, é bastante possível que seja possível encontrar uma solução suficientemente boa em um tempo adequado.

Algoritmos de Aproximação:

  • Use algoritmos de aproximação, que podem dar uma solução boa, embora nem sempre ótima, em um tempo razoável.
  • Exemplo: Algoritmo guloso para o problema da mochila com itens fracionáveis.

Heurísticas:

  • Aplique heurísticas, como algoritmos baseados em colônia de formigas, algoritmos genéticos e algoritmos de inteligência artificial, para encontrar soluções aproximadas para problemas complexos.

Métodos de Divisão de Problemas:

  • Divida os problemas em subproblemas menores e resolva-os separadamente.
  • Exemplo: Programação dinâmica para o problema da mochila.

Uso de Algoritmos Polinomiais:

  • Sempre que possível, use algoritmos polinomiais para resolver subproblemas ou encontrar soluções parciais.
  • Exemplo: Dijkstra para encontrar o caminho mais curto em um grafo.

A força bruta e os problemas da classe NP são conceitos importantes na teoria dos algoritmos e da complexidade computacional. A força bruta garante encontrar a solução ótima, mas muitas vezes não é prática para problemas grandes. Problemas da classe NP incluem muitos problemas importantes que podem ser resolvidos em um tempo razoável apenas usando heurísticas e métodos aproximados.

Comentários
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION