Generalmente llamamos a un algoritmo "buen algoritmo" si su tiempo de ejecución es polinómico en el peor de los casos. Pero en algunos casos (por ejemplo, el algoritmo Simplex), aunque el peor de los casos del algoritmo es exponencial, podría funcionar muy bien en la práctica.
¿Hay algún ejemplo (determinista) de esta situación que no sea el algoritmo Simplex?
ds.algorithms
Arman
fuente
fuente
Respuestas:
Los algoritmos modernos de resolución de SAT pueden resolver la mayoría de las instancias bastante rápido, aunque el peor tiempo de ejecución es, por supuesto, exponencial. En este caso, sin embargo, la velocidad práctica es más el resultado de años de ingeniería de algoritmos, más que la de un algoritmo elegante único. Si bien he entendido que el aprendizaje de cláusulas controladas por conflictos causó un salto importante en el rendimiento de los solucionadores de SAT, las mejoras posteriores se han logrado a menudo mediante el uso inteligente de varias heurísticas en los algoritmos.
fuente
El algoritmo medias para la agrupación es demostrablemente exponencial incluso en el plano, pero funciona muy bien en la práctica.k
fuente
La inferencia de tipo Hindley-Milner es EXPTIME-complete, pero en los programas que la gente suele escribir es bastante lineal.
fuente
let z = (let y = e in e') in e''
en lugar de quelet y = e in let z = e' in e''
.El programa nauty de Brendan McKay (No AUTomorphisms, Yes?) Resuelve el problema de etiquetado canónico de los gráficos (resolviendo simultáneamente los problemas de isomorfismo gráfico y automatismo gráfico) y tiene un rendimiento exponencial en el peor de los casos (Miyazaki, 1996). Sin embargo, funciona muy rápidamente para la mayoría de los gráficos, especialmente aquellos con algunos automorfismos.
Específicamente, el algoritmo comienza dividiendo los vértices por grado, luego por el grado entre cada parte. Cuando este proceso se estabiliza, se debe elegir distinguir un vértice en una parte no trivial, y esto conduce al comportamiento exponencial. En la mayoría de los gráficos, la profundidad de este procedimiento de ramificación es pequeña.
fuente
Varios algoritmos para juegos estocásticos simples funcionan bien en la práctica, a pesar de que tienen tiempos de ejecución exponenciales en el peor de los casos. Por supuesto, este problema está relacionado en cierto sentido con la programación lineal, aunque no se sabe que esté en tiempo polinómico.
fuente
Hay un algoritmo para encontrar equilibrios mixtos de Nash que es similar al algoritmo simplex para LP. (Olvidé el nombre). Tiene una complejidad exponencial en el peor de los casos, pero tengo un vago recuerdo de que a menudo se comporta bien en la práctica.
fuente
El empaquetado de contenedores (muchas variantes) es un problema cuya complejidad se sabe que es NP-hard:
http://en.wikipedia.org/wiki/Bin_packing_problem
Sin embargo, muchas heurísticas cuando se aplican a versiones "prácticas" funcionan muy bien. Para el embalaje de contenedores unidimensionales, algunas de estas heurísticas, como primer ajuste; primer ajuste decreciente; mejor ajuste; la disminución de mejor ajuste es muy atractiva como temas para mostrar a los estudiantes. Los estudiantes a menudo pueden descubrir algunas de las heurísticas básicas por sí mismos.
fuente
El algoritmo de persistencia (originario de Edelsbrunner-Letscher-Zomorodian, con muchas variaciones desde entonces) es el peor de los casos cúbicos, pero parece que, por experimentación, generalmente se ejecuta en tiempo lineal.
fuente