Existe algum outro algoritmo cujo pior tempo de execução é exponencial enquanto isso funciona muito bem na prática, além do algoritmo Simplex?

9

Geralmente, chamamos um algoritmo de "bom algoritmo" se o tempo de execução for polinomial no pior dos casos. Mas em alguns casos (por exemplo, algoritmo Simplex), mesmo que o pior caso do algoritmo seja exponencial, ele poderia funcionar muito bem na prática.

Existem exemplos (determinísticos) nessa situação além do algoritmo Simplex?

Arman
fonte
11
Você pode estar interessado em uma pergunta relacionada: cstheory.stackexchange.com/questions/305/…
Radu GRIGore

Respostas:

13

Os algoritmos modernos de solução de SAT são capazes de resolver a maioria das instâncias com bastante rapidez, mesmo que o pior caso de execução seja, obviamente, exponencial. Nesse caso, no entanto, a velocidade prática é mais o resultado de anos de engenharia de algoritmos, do que a de um único algoritmo elegante. Embora eu tenha entendido que o aprendizado de cláusulas orientadas a conflitos causou um grande salto no desempenho dos solucionadores de SAT, as melhorias posteriores são muitas vezes obtidas com o uso inteligente de várias heurísticas nos algoritmos.

Janne H. Korhonen
fonte
13

O algoritmo -eans para clustering é comprovadamente exponencial, mesmo no plano, mas funciona muito bem na prática.k

Suresh Venkat
fonte
13

A inferência do tipo Hindley-Milner é EXPTIME-complete, mas nos programas que as pessoas normalmente escrevem é bastante próxima do linear.

Neel Krishnaswami
fonte
11
Isso não é um pouco diferente? Lembro-me de que poderíamos caracterizar uma condição necessária para Hindley-Milner ter um desempenho ruim (permite profundamente aninhado) e, portanto, a razão pela qual HM é bom na prática é que esse aninhamento é, na prática, limitado muito baixo (geralmente recuamos mais à medida que avançamos) aprofundar as ligações e ficar nervoso enquanto nos dirigimos para a extremidade direita da tela ...) É verdade que já fiz essa afirmação de memória antes e mais recentemente não consegui recuperar a referência.
Rob Simmons
2
Não, essa não é uma condição necessária. Você pode fornecer uma sequência de let-bindings (sem aninhamento!), De modo que quadrie o tamanho do tipo inferido com cada entrada adicional na sequência. Consulte cstheory.stackexchange.com/questions/2428/… para obter um exemplo.
Neel Krishnaswami
O exemplo está no SML, e eu estou mais familiarizado com a maneira de fazer as coisas do OCaml, mas se essa sequência de ligações fosse "let" s, acho que elas seriam aninhadas. É apenas porque eles definem funções globais que não são, mas há um aninhamento implícito em andamento aqui: Uma determinada definição tem acesso a todas as definições acima e nenhuma delas abaixo.
amnn
11
@ amnn: O aninhamento mencionado foi aninhamento, permitindo que o formulário seja vinculado - ou seja, let z = (let y = e in e') in e''em vez de let y = e in let z = e' in e''.
Neel Krishnaswami
9

O programa de nauty de Brendan McKay (No AUTomorphisms, Yes?) Resolve o problema de rotulagem canônica de gráficos (resolvendo simultaneamente os problemas de Isomorfismo em Gráfico e Automorfismo em Gráfico) e tem desempenho exponencial no pior dos casos (Miyazaki, 1996). No entanto, ele funciona muito rapidamente para a maioria dos gráficos, especialmente aqueles com poucos automorfismos.

Especificamente, o algoritmo começa particionando os vértices por grau, depois pelo grau entre cada parte. Quando esse processo se estabiliza, é preciso fazer uma escolha para distinguir um vértice em uma parte não trivial, e isso leva ao comportamento exponencial. Na maioria dos gráficos, a profundidade desse procedimento de ramificação é pequena.

Derrick Stolee
fonte
Eu pensei que nauty também usava alguma aleatoriedade para ajudar no refinamento? Nesse caso, isso pode ser muito análogo ao algoritmo simplex (embora não exista obviamente uma noção de análise suavizada para isomorfismo de gráfico).
Joshua Grochow
11
Ele não usa aleatoriedade, pois precisa fazer uma rotulagem canônica consistente. No entanto, ele pode usar um procedimento invariável de vértice personalizado para ajudar a particionar os vértices. Às vezes, esse invariante parece aleatório como foi produzido (freqüentemente, é uma função complicada nas seqüências de graus à distância), mas isso é apenas para reduzir colisões.
Derrick Stolee
11
Essa invariante de vértice pode ser comparada às regras anticiclagem do algoritmo simplex.
Derrick Stolee
4

Vários algoritmos para jogos estocásticos simples funcionam bem na prática, apesar de terem tempos de execução exponenciais no pior dos casos. Obviamente, esse problema está, em certo sentido, relacionado à programação linear, embora não se saiba que esteja em tempo polinomial.

Peter Shor
fonte
1

Existe um algoritmo para encontrar equilíbrios mistos de Nash que é semelhante ao algoritmo simplex para LPs. (Eu esqueço o nome.) Ele tem uma complexidade exponencial de pior caso, mas tenho uma vaga memória de que muitas vezes se comporta bem na prática.

Warren Schudy
fonte
Você quer dizer o algoritmo de Lemke-Howson?
Rahul Savani 02/02
1

A embalagem do compartimento (muitas variantes) é um problema cuja complexidade é conhecida como NP-hard:

http://en.wikipedia.org/wiki/Bin_packing_problem

No entanto, muitas heurísticas, quando aplicadas a versões "práticas", se dão muito bem. Para caixas unidimensionais que embalam algumas dessas heurísticas, como primeiro ajuste; primeiro ajuste decrescente; melhor ajuste; A redução do melhor ajuste é muito atraente como tópicos para mostrar aos alunos. Os alunos geralmente podem descobrir algumas das heurísticas básicas por si mesmos.

Joseph Malkevitch
fonte
Existem muitos exemplos, mesmo que o problema seja NP-completo, algoritmos simples podem lidar com isso. Especialmente com algoritmos de aproximação. Mas, na verdade, estou procurando algoritmos de tempo exponencial, seu exemplo está relacionado a um problema difícil que é fácil de resolver com algoritmos simples. Talvez exista um algoritmo de tempo exponencial para resolver exatamente o empacotamento da lixeira (ou outro problema); e na prática leva tempo polinomial.
Arman18
0

O algoritmo de persistência (originário de Edelsbrunner-Letscher-Zomorodian, com muitas variações desde então) é o pior caso cúbico, mas parece que a experimentação geralmente é executada em tempo linear.


fonte