¿Qué debo saber antes de intentar resolver un problema de NP completo?

En general, no debe intentar resolver un problema de NP completo en tiempo polinómico. Ese es un esfuerzo engañado. El problema es intratable.

Sin embargo, hay formas de manejar la intratabilidad. Puede intentar resolver un caso especial o escribir un algoritmo de aproximación o un algoritmo probabilístico. Puede intentar utilizar formas alternativas de computación como simulaciones biológicas o una computadora cuántica. Puede diseñar un algoritmo intuitivo que es exponencial en teoría pero que puede comportarse eficientemente en la práctica con datos reales. Y puede escribir algoritmos heurísticos que no tienen por qué ser correctos pero que a veces lo sorprenden.

Necesita conocer una cantidad justa para seguir mis sugerencias anteriores.

  1. Toda la complejidad resulta sobre el problema en cuestión, incluidos casos especiales: por ejemplo, para un problema gráfico: tipos restringidos de gráficos: DAG, árboles, bipartitos, limitados por grados, intervalos, cordales, etc.
  2. Teoría básica de la complejidad y teoría de la probabilidad.
  3. Estructuras de datos y cómo programar eficientemente con ellos, utilizando la recursividad, la estrategia codiciosa o la programación dinámica.
  4. Cosas interesantes como la computación cuántica o la computación de ADN.
  5. AI: programación heurística.

Primero, debe saber por qué está tratando de resolver un problema de NP completo. ¿Para qué utilizará la solución? ¿Podría lograr su objetivo resolviendo un problema más fácil?

En segundo lugar, debe saber si su problema es realmente un caso especial más fácil del problema de NP completo que cree que necesita resolver. Subset Sum es NP-hard, pero no si todos sus valores están delimitados por una constante.

En tercer lugar, debe conocer el tamaño de entrada y las limitaciones de tiempo. El vendedor ambulante es NP-hard, pero si está planeando un viaje por carretera de 10 ciudades, puede permitirse que su computadora se tome su tiempo para forzar la solución antes del viaje.

Finalmente, debe saber si su aplicación funcionará con una solución aproximada. Si es así, debe saber qué algoritmos de aproximación existen para este problema.

La pregunta no tiene sentido. Sin embargo, hay dos formas posibles de hacer que tenga sentido:

  1. Si está tratando de resolver una instancia de un problema NP-completo (por ejemplo, tratando de encontrar una asignación satisfactoria para una fórmula booleana, también conocido como el problema de la satisfacción booleana), entonces puede ser fácil o puede ser muy difícil (como en intratable), dependiendo de la instancia particular. (En complejidad computacional, un “problema” es la unión de todas las instancias).
  2. Si está tratando de encontrar una prueba P vs. NP, entonces debería conocer la totalidad de la complejidad computacional, incluidos todos los documentos principales, e incluso eso probablemente no sea suficiente.
  1. nadie resolvió un problema completo de NP en tiempo polinómico todavía (no para desanimarte pero saber es imprescindible)
  2. para el problema NP completo, es fácil obtener respuestas aproximadas en lugar de respuestas exactas (por lo tanto, si no necesita una solución exacta, entonces no tiene que resolver el problema NP completo)
  3. Si el tamaño del problema es muy pequeño, incluso la fuerza bruta encontrará la solución rápidamente

Primero sepa que existe una solución.

En segundo lugar, probablemente no encontrará una solución que se ejecute en tiempo polinómico.

Por último, pero no menos importante, un problema NP completo no es el problema “P vs NP”.

Que es un problema NP Complete.

Y deseo P = NP.