Qual è un esempio di un problema aziendale computazionalmente impossibile?


17

Ho un collega che rifiuta di accettare la realtà che le macchine Turing (e le macchine Von Neuman per estensione) non possono risolvere il proprio problema di arresto affermando:

Puoi fare qualsiasi cosa con abbastanza tempo e denaro.

Non ama anche i problemi teorici sostenendo che:

Nel nostro campo, non incontreremo mai queste domande. Siamo sviluppatori di applicazioni, non scienziati teorici.

C'è un buon esempio di un problema aziendale che è impossibile dal punto di vista computazionale che potrei usare per convincerlo?


11
Non puoi dimostrare con l'esempio che qualcosa è impossibile. Il tuo collega dirà semplicemente "Non funziona perché non abbiamo capito l'approccio corretto". Il meglio che puoi fare è mostrargli una prova. Se non lo compra, è davvero stupido o un idiota o entrambi. Ecco un elenco di problemi indecidibili: en.wikipedia.org/wiki/List_of_undecidable_problems
Thomas Eding

18
A un teorico e un ingegnere fu detto che potevano baciare una ragazza percorrendo ripetutamente la distanza tra loro e lei della metà. Il teorico ha immediatamente rinunciato dicendo "è impossibile, non ci arriverò mai". L'ingegnere ci provò dicendo "Mi avvicinerò abbastanza per scopi pratici". Lei, signore, deve provare per quel bacio.
gbjbaanb,

2
@gbjbaanb: Questo è un buon descrittore di molte delle soluzioni non ottimali ai problemi NP-difficili, e sapere che quei problemi sono (praticamente) impossibili da risolvere in modo classico è il motivo per cui scegli il metodo alternativo. Se non accetti che alcuni problemi siano praticamente o letteralmente impossibili da risolvere, non cercherai soluzioni imperfette che possano dare una risposta "abbastanza buona" dopo un periodo di tempo indeterminabile.
Phoshi,

3
@Phoshi no, il punto è che le soluzioni ingegneristiche del mondo reale richiedono solo una soluzione sufficientemente buona per risolvere il problema in modo sufficiente per l'accettazione. Risolverlo perfettamente non vale il tempo e le spese. per esempio. Il problema del venditore ambulante è impossibile dato più di alcuni nodi, ma una soluzione tutt'altro che ottimale è ancora richiesta (e consegnata) da molte aziende. Se producessimo solo la perfezione, nessuno avrebbe questi.
gbjbaanb,

10
@gbjbaanb: Vero, ma l'unica ragione per cui hanno risolto questi problemi è prima accettando che non puoi "fare nulla con abbastanza tempo e denaro" e smettere di inseguire la soluzione ottimale. La conoscenza di ciò che non puoi fare è spesso altrettanto importante per trovare una soluzione quanto la conoscenza di ciò che puoi fare.
Phoshi,

Risposte:


11

Non tecnicamente impossibile, ma ...

Pianificazione delle risorse , con l'obiettivo di trovare il programma ideale che massimizzi l'uso delle fasce orarie. Una volta ero su un progetto, nei miei primi giorni di calcolo, che aveva questo requisito. Ci ho lavorato un po 'prima di rendermi conto che era NP-difficile.

Altri esempi di problemi che non sono tecnicamente impossibili, ma tecnicamente difficili, possono essere trovati qui .

La maggior parte dei difficili problemi computazionali nell'informatica aziendale non sono impossibili, ma poco pratici. Il tuo amico ha ragione; puoi risolverli la maggior parte se gli lanci abbastanza denaro. Ma l'argomento è specioso; il punto centrale della gestione di un'azienda è fare soldi, non perderli.

Nella pratica quotidiana, parliamo della completezza di Turing in modo vago, non per dimostrare alcuni principi matematici, ma per illustrare (ad esempio) l'inadeguatezza di HTML e CSS come veicolo completo per la produzione di programmi completi di funzionalità.

Allo stesso modo, il problema dell'arresto è importante per i teorici, ma non ha molta rilevanza per la maggior parte delle aziende.


14
Il problema di arresto emerge nell'analisi statica del codice. Da questo puoi ottenere problemi banali come "ecco un po 'di codice, rendilo carino" a "ecco un po' di codice, è un malware" - il primo è un business importante per le aziende che creano IDE (evidenziazione della sintassi, refactoring), il secondo a società antivirus e professionisti della sicurezza.

12
"Allo stesso modo, il problema dell'arresto è importante per i teorici, ma non ha molta rilevanza per la maggior parte delle aziende.": Bene, se il problema di arresto fosse calcolabile, potremmo verificare automaticamente se un software verrà chiuso / bloccato un certo input o no. Probabilmente non avremmo più nessun BSOD. Dato che ciò non è possibile, dobbiamo utilizzare altre tecniche per garantire la qualità del software (come i test) e nessuno sta investendo tempo e denaro per sviluppare un programma generale di "controllo della risoluzione". Quindi penso che questo risultato teorico abbia una rilevanza pratica enorme.
Giorgio,

4

Altri hanno commentato questo, ma cercherò di scrivere una risposta che dia il mio punto di vista.

Mi piace la risposta di Robert Harvey e i commenti alla sua risposta, e vorrei approfondirli.

Penso che tu debba presentare questi problemi indecidibili (come la risoluzione) in un modo banale: ad esempio, uno strumento IDE che "controlla se questa funzione restituisce sempre un valore".

Durante l'insegnamento, il mio esempio preferito era il refactoring ( equivalenza di funzioni, un altro problema indecidibile ). Ho chiesto:

come controlli se una funzione / programma fa lo stesso dopo il tuo bel refactoring? Certo, abbiamo dei test unitari per questo, ma non coprono tutti i casi. E sono noiosi da scrivere ... Ma siamo programmatori! Dovremmo scrivere un programma che controlli se queste due funzioni stanno producendo sempre lo stesso risultato! Perché non provi a scriverlo?

o, come variazione forse più vicino al tuo caso:

Abbiamo questo codice legacy scritto in un antico dialetto oscuro COBOL, per il quale non esistono specifiche e / o compilatori. Abbiamo solo il programma. Tutta la nostra attività si basa su di essa, quindi dobbiamo essere sicuri al 100% che il nuovo codice Java faccia esattamente lo stesso in ogni situazione. La direzione vuole un programma che lo faccia, controllando tutti i possibili casi e stima che possa essere fatto in 6-8 settimane. Perché non provi a scriverlo?

Il punto non è scrivere un tale programma. O una buona approssimazione dei requisiti. Il punto è rendersi conto che NON può essere fatto in modo diretto, NON sprecare innumerevoli nostri cercando di capire come farlo (solo per rendersi conto che non è possibile), ma riconoscerlo. "Ah! Questo è indecidibile! Non è possibile farlo direttamente. Devo trovare un modo diverso, più intelligente per farlo, con una buona approssimazione".

Devi trovare un modo per presentare il problema in modo riconoscibile e apparentemente semplice. Non crederesti quanti studenti CS cercheranno di scrivere un programma del genere immediatamente ... prima di seguire un corso di calcolabilità :)


La tua seconda citazione tenta di invocare il problema di arresto in modo errato; tuttavia, se sappiamo che il programma COBOL funziona e possiamo eseguirlo in un ambiente di test (vm-clone tutta la PROD, se necessario), il problema di arresto è escluso e potremmo tentare. Probabilmente a mano piuttosto che per programma, ma lo stesso possiamo farcela. Se necessario, potremmo bisecare tutti i possibili moduli di input. Poiché il programma di destinazione si interrompe, così anche l'albero-bisect.
Joshua,

2

Supponendo che possiamo mettere da parte le domande morali per il momento:

L'attività A ha stipulato un contratto con te per un modo di comunicare tra gli uffici satellite A1 e A2 senza che nessuno oltre alle persone autorizzate in A1 e A2 sia in grado di comprendere la comunicazione.

L'attività B si è contratta per un modo di intercettare in modo intelligente tutte le comunicazioni tra A1 e A2.

Ovviamente non puoi fare entrambe le cose.

A causa del modo in cui la matematica funziona (l'esatta matematica è stata oggetto di ricerche in corso per 100 anni), uno dei seguenti requisiti non può essere soddisfatto:

(1): fornire un algoritmo di crittografia che non può essere rotto da un utente malintenzionato con una quantità arbitraria di denaro disponibile.

(2): fornire un algoritmo di interruzione della crittografia per un algoritmo di crittografia arbitrario che viene eseguito in un tempo ragionevole.


1
(3): Non riesco a trovare un altro lavoro dopo che il mercato ha scoperto che hai persino tentato entrambi
TruthOf42

1

Di recente ho seguito un corso su Business Process Model and Notation ( BPMN ). Lì si può facilmente vedere che i flussi di lavoro con troppe divisioni, join e loop diventano rapidamente poco pratici (anche se non necessariamente impossibili , AFAIK) da comprendere e controllare (quando si utilizzano troppe divisioni OR anziché divisioni XOR).

Per l'industria del software, penso che lo stesso valga per problemi simili di "copertura a più condizioni" nell'analisi della copertura del codice .

Per un'azienda, la strada da percorrere è ridurre lo spazio del problema e non gettare più risorse sul problema complesso. Nel mio esempio, aggiungere vincoli al flusso di lavoro, (o nell'analisi della copertura del codice, semplificare il codice), invece di lavorare sodo per trovare tutte, diciamo, N possibili tracce e risultati in cui N è un numero inimmaginabilmente grande.

A parte questo, penso che ci siano molti problemi nell'analisi della rete / grafico che sono impossibili da risolvere (cercando di determinare una topologia di rete percorrendo iterativamente tutti i percorsi, ecc.).


0

L'esempio classico sta cercando di analizzare HTML con espressioni regolari . Questo può funzionare con insiemi limitati di HTML ma una soluzione generale è impossibile, a causa del fatto che hanno grammatiche diverse di Chomsky (come il link chiarisce (ish)).

Più in generale ad alcune persone non piace pensare filosoficamente (come il tuo collega di lavoro) e non sono sicuro che tu possa discuterne per uscire da una mentalità. Il suo primo punto è certamente sbagliato, ma il secondo potrebbe essere solo un modo per dire che non devo preoccuparmi di questo per codificare i moduli web per la ricezione delle merci. Ho una certa simpatia per questo, ma a volte conoscere la teoria significa che non ti impegni a trovare il Santo Graal sull'orario di lavoro.


-6

Forse la risposta è che il tuo collega ha ragione. Forse hai frainteso Turing o come si applica qui?

Tutte le macchine sono finite, quindi non ci sono macchine di Turing "reali" e nessun programma che non si fermerà mai. Un programma banale che esegue un semplice ciclo infinito potrebbe durare 5 minuti o 50 anni ma su una macchina finita si fermerà. Si interromperà anche un problema non-banale non banale come 'calcola pi esattamente', perché alla fine il calcolo supererà la capacità di memorizzare ulteriori cifre.

Il risultato di Turing non garantisce nulla di particolarmente utile su macchine finite, quindi la tua ricerca alla fine è infruttuosa. Meglio concentrarsi su quanto tempo e quanti soldi e lasciare l'infinito ai matematici.

Potresti pensare che un programma simile { while true: print "running"; print "halted"; }sia un controesempio ma non lo è. Questo programma ha effetti collaterali, che possono o meno causare l'interruzione. Ignorando gli effetti collaterali, è possibile escogitare una prova formale che questo programma non si fermerà. In questa domanda ci occupiamo solo di programmi che sfuggono alla prova formale di non-arresto, in cui la questione dell'arresto è indecidibile. Questo non è un programma del genere.

Può aiutare a distinguere Turing "forte" da "debole". Le macchine di Turing forti sono in realtà infinite e se non riescono a fermarsi, funzioneranno per un tempo infinito. Non possiamo costruirli.

Le macchine di Turing deboli hanno limiti finiti nel tempo e nello spazio e sono l'unico tipo che possiamo costruire. Siamo interessati a programmi che non possono essere dimostrati fermarsi entro tali limiti. Turing ci dice che ci sono tali programmi ma non possiamo identificarli. Se i limiti sono abbastanza bassi possiamo identificarli scrivendo il programma ed eseguendolo ai suoi limiti.

L'essenza di Turing è che non ci sono scorciatoie. L'unico modo per essere certi che un problema sia fattibile dal punto di vista computazionale è scrivere il programma, eseguirlo e scoprirlo. Con abbastanza tempo e denaro puoi scrivere tutti i programmi, eseguirli per sempre e nel tempo e trovare quelli che producono risultati (le cavezze). Gli altri continueranno a correre. Collaboratore ha abbastanza tempo e denaro per farlo?

Scherzi a parte, la disputa riguarda i limiti. Turing e NP complete ci dicono che alcune classi di problemi non possono essere risolte dai computer all'interno di un determinato budget o in un determinato programma, non importa quanto grande sia quel budget o quanto generoso possa essere quel programma. Esempi di questo tipo di problema abbondano: rompere le chiavi crittografiche; ottimizzare i percorsi per effettuare consegne a centinaia di indirizzi; scatole per imballaggio in camion; trovare bug in programmi di grandi dimensioni!

Quindi chiedi al tuo collega un budget e un programma e prometti che puoi produrre un problema che non può essere risolto all'interno di quel budget o programma. Questa promessa sarà molto facile da mantenere.


2
L'essenza del problema di arresto è che ci sono classi di problemi che non possono essere calcolati, mai, anche con tempo e denaro infiniti. Questo è ciò che il mio collega rifiuta di accettare.
Jesan Fafon,

Quindi non siamo d'accordo. Ho modificato la mia risposta, ma essenzialmente il messaggio è lo stesso. La tua domanda come posta non ha una risposta (o non una che ti piacerà), ma alla base c'è un vero problema e un vero punto da sollevare. Se vuoi vincere questa discussione, dovrai in qualche modo cambiare terreno, e ho provato a fornire un aiuto per farlo. [Ricordami di non provare a rispondere a domande come questa - i voti negativi sono sgraditi.]
david.pfx

2
@simon: A rischio di ripetermi, non ci sono programmi che richiedono un tempo infinito per il completamento perché non ci sono computer completi Turing, solo approssimazioni finite per loro. Non è possibile dimostrare che un programma arbitrario verrà completato in un determinato intervallo di tempo con qualsiasi metodo che sia più veloce rispetto all'esecuzione effettiva del programma. In pratica, qualsiasi frase che contiene la parola "infinito" rischia di non avere senso.
david.pfx,

3
while True: print "doing stuff"; print "Finished"; Questo è un esempio di un programma che richiede un tempo infinito per terminare. Vi è una quantità infinita di altri programmi che richiedono anche una quantità infinita di tempo per il completamento. Creiamo regolarmente programmi che richiedono un tempo infinito per essere completati di proposito. Sono chiamati "processi di lunga durata". La maggior parte dei siti Web dinamici ne sono un esempio.
Singletoned

2
Il punto è sicuramente che ci sono serie di programmi per computer che sono effettivamente infiniti, che non si fermeranno mai sotto il loro stesso vapore (premeremo break, tireremo fuori l'energia ecc. Eventualmente), se li programmassimo in una macchina Turing sarebbe correre senza fermarsi. L'essenza del problema di arresto è che non c'è modo praticamente o teoricamente di determinare algoritmicamente programmi non fermanti.
Alistair Mackenzie,
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.