Esiste un altro algoritmo il cui tempo di esecuzione nel peggiore dei casi è esponenziale nel frattempo funziona molto bene in pratica diverso dall'algoritmo Simplex?


9

Generalmente chiamiamo un algoritmo "buon algoritmo" se il tempo di esecuzione è polinomiale nel peggiore dei casi. Ma in alcuni casi (ad esempio l'algoritmo Simplex), sebbene il caso peggiore dell'algoritmo sia esponenziale, potrebbe funzionare molto bene nella pratica.

Ci sono esempi (deterministici) in questa situazione diversa dall'algoritmo Simplex?


1
Potresti essere interessato a una domanda correlata: cstheory.stackexchange.com/questions/305/…
Radu GRIGore

Risposte:


13

I moderni algoritmi di risoluzione SAT sono in grado di risolvere la maggior parte dei casi abbastanza velocemente, anche se il peggior tempo di esecuzione è, ovviamente, esponenziale. In questo caso, tuttavia, la velocità pratica è più il risultato di anni di ingegneria degli algoritmi, piuttosto che quella di un singolo algoritmo elegante. Mentre ho capito che l'apprendimento delle clausole basato sui conflitti ha causato un grande balzo nelle prestazioni dei solutori SAT, i miglioramenti successivi sono stati spesso raggiunti da un uso intelligente di varie euristiche negli algoritmi.



13

L'inferenza di tipo Hindley-Milner è EXPTIME completa, ma sui programmi in genere la gente la scrive è abbastanza vicina a linear.


1
Non è un po 'diverso però? Il mio ricordo è che potremmo caratterizzare una condizione necessaria affinché Hindley-Milner si esibisca male (let nidificati in profondità) e quindi il motivo per cui HM è buono in pratica è che questo annidamento è, in pratica, limitato abbastanza in basso (di solito indentiamo di più mentre andiamo approfondire i vincoli e innervosirci mentre ci dirigiamo verso il bordo più a destra dello schermo ...) Certo, ho già fatto questa affermazione dalla memoria e recentemente non sono stato in grado di recuperare il riferimento per esso.
Rob Simmons,

2
No, questa non è una condizione necessaria. Puoi dare una sequenza di let-binding (senza nidificazione!) In modo tale da quadrare le dimensioni del tipo inferito con ogni voce aggiuntiva nella sequenza. Vedere cstheory.stackexchange.com/questions/2428/… per un esempio.
Neel Krishnaswami,

L'esempio è in SML, e ho più familiarità con il modo di fare le cose di OCaml, ma se quella sequenza di legami fosse "lasciamo", allora penso che sarebbero nidificati. È solo perché definiscono le funzioni globali che non lo sono, ma qui sta avvenendo un annidamento implicito: una data definizione ha accesso a tutte le definizioni sopra di essa e nessuna di quelle sotto.
am

1
@amnn: l'annidamento a cui si fa riferimento era l'annidamento lascia che la forma sia vincolata, cioè let z = (let y = e in e') in e''al contrario di let y = e in let z = e' in e''.
Neel Krishnaswami,

9

Il programma nautico di Brendan McKay (No AUTomorfismi, Sì?) Risolve il problema canonico di etichettatura dei grafici (risolvendo contemporaneamente i problemi di Isomorfismo grafico e Automorfismo grafico) e ha prestazioni esponenziali nel caso peggiore (Miyazaki, 1996). Tuttavia, funziona molto rapidamente per la maggior parte dei grafici, in particolare quelli con alcuni automorfismi.

In particolare, l'algoritmo inizia partizionando i vertici per grado, quindi per il grado tra ciascuna parte. Quando questo processo si stabilizza, si deve fare una scelta per distinguere un vertice in una parte non banale, e questo porta al comportamento esponenziale. Nella maggior parte dei grafici, la profondità di questa procedura di ramificazione è piccola.


Pensavo che la nautica usasse anche un po 'di casualità per aiutare la raffinatezza? In tal caso, questo potrebbe essere molto analogo all'algoritmo simplex (sebbene non ci sia ovviamente una nozione di analisi smussata per l'isomorfismo grafico).
Joshua Grochow,

1
Non usa la casualità, poiché deve fare un'etichettatura canonica coerente. Tuttavia, può utilizzare una procedura invariante di vertici costruita su misura per aiutare a partizionare i vertici. A volte questo invariante sembra casuale il modo in cui è stato prodotto (spesso, è una funzione complicata nelle sequenze a distanza), ma è solo per ridurre le collisioni.
Derrick Stolee,

1
Questo invariante di vertici può essere paragonato alle regole anti-ciclo dell'algoritmo simplex.
Derrick Stolee,

4

Diversi algoritmi per semplici giochi stocastici funzionano bene nella pratica, anche se hanno tempi di esecuzione esponenziali nel caso peggiore. Naturalmente, questo problema è in qualche modo correlato alla programmazione lineare, sebbene non sia noto che sia in fase polinomiale.


1

C'è un algoritmo per trovare equilibri di Nash misti che è simile all'algoritmo simplex per gli LP. (Dimentico il nome.) Ha una complessità esponenziale nel caso peggiore, ma ho un vago ricordo che spesso si comporta bene nella pratica.


Intendi l'algoritmo Lemke-Howson?
Rahul Savani,

1

L'imballaggio del contenitore (molte varianti) è un problema la cui complessità è nota per essere NP-difficile:

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

Tuttavia, molte euristiche se applicate a versioni "pratiche" fanno molto bene. Per l'imballaggio bidone bidimensionale di alcune di queste euristiche, come il primo adattamento; decrescente di prima misura; il più adatto; la riduzione più adatta è molto interessante come argomenti da mostrare agli studenti. Gli studenti possono spesso scoprire alcune delle euristiche di base per se stessi.


Ci sono molti esempi anche se il problema è NP-completo, i semplici algoritmi possono affrontarlo, specialmente con algoritmi di approssimazione. Ma in realtà sto cercando algoritmi a tempo esponenziale, il tuo esempio è legato a un problema difficile che è facile da risolvere con semplici algoritmi. Forse esiste un algoritmo di tempo esponenziale per risolvere esattamente l'imballaggio di Bin (o un altro problema); e in pratica ci vuole tempo polinomiale.
Arman,

0

L'algoritmo di persistenza (originario di Edelsbrunner-Letscher-Zomorodian, con molte varianti da allora) è il caso peggiore in termini cubici, ma sembra dalla sperimentazione di solito funzionare in tempo lineare.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.