Qual é um exemplo de um problema de negócios computacionalmente impossível?

17

Tenho um colega de trabalho que se recusa a aceitar a realidade de que as máquinas de Turing (e as máquinas de Von Neuman por extensão) não podem resolver seu próprio problema de parada, afirmando:

Você pode fazer qualquer coisa com tempo e dinheiro suficientes.

Ele também não gosta de problemas teóricos, argumentando que:

Em nosso campo, nunca encontraremos essas perguntas. Somos desenvolvedores de aplicativos, não cientistas teóricos.

Existe um bom exemplo de um problema comercial que é computacionalmente impossível que eu poderia usar para ajudar a convencê-lo disso?

Jesan Fafon
fonte
11
Você não pode demonstrar pelo exemplo que algo é impossível. Seu colega de trabalho apenas dirá "Não está funcionando porque não descobrimos a abordagem correta". O melhor que você pode fazer é mostrar-lhe uma prova. Se ele não comprar, ele é realmente estúpido ou idiota ou ambos. Aqui está uma lista de problemas indecidíveis: en.wikipedia.org/wiki/List_of_undecidable_problems
Thomas Eding
18
Disseram a um teórico e a um engenheiro que podiam beijar uma garota viajando repetidamente a distância entre elas e ela pela metade. O teórico desistiu imediatamente de dizer "é impossível, nunca chegarei lá". O engenheiro concordou, dizendo "chegarei perto o suficiente para fins práticos". Você, senhor, precisa tentar esse beijo.
Gbjbaanb 17/01
2
@gbjbaanb: Esse é um bom descritor de muitas das soluções não ideais para problemas difíceis de NP, e saber que esses problemas são (praticamente) impossíveis de resolver classicamente é por isso que você segue o método alternativo. Se você não aceitar que alguns problemas sejam praticamente ou literalmente impossíveis de resolver, não procurará soluções imperfeitas que possam dar uma resposta "boa o suficiente" após um período indeterminado de tempo.
Phoshi 17/01
3
@ Phoshi não, o ponto é que as soluções de engenharia do mundo real exigem apenas uma solução que seja boa o suficiente para resolver o problema suficientemente para aceitação. Resolvê-lo perfeitamente não vale o tempo e as despesas. por exemplo. O problema do vendedor ambulante é impossível, dado mais do que alguns nós, mas uma solução abaixo do ideal ainda é necessária (e entregue) por muitas empresas. Se apenas produzíssemos a perfeição, ninguém a teria.
Gbjbaanb
10
@gbjbaanb: É verdade, mas a única razão pela qual eles resolveram esses problemas é primeiro aceitando que você não pode "fazer nada com tempo e dinheiro suficientes" e parou de procurar a solução ideal. O conhecimento do que você não pode fazer é frequentemente tão importante para encontrar uma solução quanto o conhecimento do que você pode fazer.
Phoshi

Respostas:

11

Não é tecnicamente impossível, mas ...

Recursos de agendamento , com o objetivo de encontrar o agendamento ideal que maximize o uso de horários. Eu estava em um projeto uma vez, nos meus dias anteriores de computação, que tinha esse requisito. Eu trabalhei nisso por um tempo antes de perceber que era difícil para o NP.

Outros exemplos de problemas que não são tecnicamente impossíveis, mas são tecnicamente difíceis, podem ser encontrados aqui .

A maioria dos problemas computacionais difíceis em computação comercial não é impossível, apenas impraticável. Seu amigo está certo; você pode resolver a maioria deles se jogar dinheiro suficiente neles. Mas o argumento é ilusório; o objetivo de administrar um negócio é ganhar dinheiro, não perdê-lo.

Na prática diária, falamos sobre a integridade de Turing de maneira vaga, não para demonstrar algum princípio matemático, mas para ilustrar (por exemplo) a inadequação do HTML e CSS como um veículo completo para a produção de programas com recursos completos.

Da mesma forma, o Problema da Parada é importante para os teóricos, mas não tem muita relevância para a maioria das empresas.

Robert Harvey
fonte
14
O problema da parada surge na análise estática do código. Com isso, você pode obter problemas mundanos como "aqui está um código, faça com que pareça bonito" para "aqui está um código, é malware" - o primeiro é importante para as empresas que fabricam IDEs (destaque de sintaxe, refatoração), o segundo para empresas de antivírus e profissionais de segurança.
12
"Da mesma forma, o Problema de Parada é importante para os teóricos, mas não tem muita relevância para a maioria das empresas.": Bem, se o problema de parada fosse computável, poderíamos verificar automaticamente se um software terminaria / travaria. uma determinada entrada ou não. Provavelmente não teríamos mais BSODs. Como isso não é possível, precisamos usar outras técnicas para garantir a qualidade do software (como testes) e ninguém está investindo tempo e dinheiro para desenvolver um programa geral de "verificação de encerramento". Então, acho que esse resultado teórico tem uma enorme relevância prática.
Giorgio
4

Outros comentaram sobre isso, mas tentarei escrever uma resposta que dê meu ponto de vista.

Gosto da resposta de Robert Harvey e dos comentários à sua resposta, e gostaria de expandir sobre eles.

Eu acho que você precisa apresentar esses problemas indecidíveis (como rescisão) de uma maneira mundana: por exemplo, uma ferramenta IDE que "verifica se essa função sempre retorna um valor".

Ao ensinar, meu exemplo favorito era refatoração ( equivalência de função, outro problema indecidível ). Eu perguntei:

como você verifica se uma função / programa faz o mesmo após sua boa refatoração? Claro, temos testes de unidade para isso, mas eles não cobrem todos os casos. E eles são chatos de escrever ... Mas nós somos programadores! Deveríamos escrever um programa que verifique se essas duas funções estão sempre produzindo o mesmo resultado! Por que você não tenta escrever?

ou, como uma variação talvez mais próxima do seu caso:

Temos esse código legado escrito em um dialeto COBOL obscuro antigo, para o qual não existem especificações e / ou compiladores. Nós só temos o programa. Todo o nosso negócio depende disso, por isso temos que ter 100% de certeza de que o novo código Java faz exatamente o mesmo em todas as situações. A gerência quer um programa que faça isso, verificando todos os casos possíveis e estima que isso pode ser feito em 6 a 8 semanas. Por que você não tenta escrever?

O objetivo não é escrever esse programa. Ou uma aproximação suficientemente boa dos requisitos. O objetivo é perceber que NÃO pode ser feito de maneira direta, NÃO desperdice incontáveis ​​nossas tentando descobrir como fazê-lo (apenas para perceber que não é possível), mas reconhecê-lo. "Ah! Isso é indecidível! Não é possível fazê-lo diretamente. Preciso descobrir uma maneira diferente e mais inteligente de fazê-lo, com uma aproximação suficientemente boa".

Você precisa descobrir uma maneira de apresentar o problema de uma maneira reconhecível e aparentemente simples. Você não acreditaria em quantos estudantes de CS tentarão escrever esse programa imediatamente ... antes de fazer uma aula de computação :)

Lorenzo Dematté
fonte
Sua segunda cotação tenta invocar o problema de parada incorretamente; no entanto, se sabemos que o programa COBOL funciona e podemos executá-lo em um ambiente de teste (vm-clone todo o PROD, se necessário), o problema de interrupção é excluído e podemos tentar. Provavelmente à mão e não por programa, mas, mesmo assim, podemos fazê-lo. Poderíamos dividir em árvore todas as formas de entrada possíveis, se necessário. Como o programa de destino é interrompido, a árvore também será cortada.
Joshua
2

Supondo que possamos deixar de lado questões morais por um momento:

A empresa A contratou você para uma maneira de se comunicar entre os escritórios satélites A1 e A2 sem que ninguém, além das pessoas autorizadas em A1 e A2, possa entender a comunicação.

A empresa B contratou você para uma maneira inteligente de escutar todas as comunicações entre A1 e A2.

Obviamente você não pode fazer as duas coisas.

Devido à maneira como a matemática funciona (a matemática exata está sujeita a pesquisas em andamento há 100 anos), um dos seguintes requisitos não pode ser atendido:

(1): forneça um algoritmo de criptografia que não pode ser quebrado por um invasor com uma quantia arbitrária de dinheiro disponível.

(2): forneça um algoritmo de quebra de criptografia para um algoritmo de criptografia arbitrário que seja executado em um tempo razoável.

Joshua
fonte
1
(3): não conseguem obter outro emprego após as descobertas do mercado para fora você mesmo tentou tanto
TruthOf42
1

Recentemente, participei de uma aula sobre Business Process Model and Notation ( BPMN ). É fácil ver que os fluxos de trabalho com muitas divisões, junções e loops se tornam rapidamente impraticáveis ​​(embora não necessariamente impossíveis , AFAIK) para entender e controlar (quando você usa muitas divisões OR em vez de divisões XOR).

Para a indústria de software, acho que o mesmo vale para problemas semelhantes de "cobertura de várias condições" na análise de cobertura de código .

Para uma empresa, o caminho a seguir é reduzir o espaço do problema e não jogar mais recursos no problema complexo. No meu exemplo, adicione restrições ao fluxo de trabalho (ou na análise de cobertura de código, simplifique o código), em vez de trabalhar duro para encontrar todos, digamos, N possíveis traços e resultados em que N é um número inimaginavelmente grande.

Além disso, acho que existem muitos problemas na análise de rede / gráfico que são impossíveis de resolver (tentar determinar uma topologia de rede percorrendo iterativamente todos os caminhos etc.).

knb
fonte
0

O exemplo clássico está tentando analisar HTML com expressões regulares . Isso pode funcionar com conjuntos limitados de HTML, mas uma solução geral é impossível, devido ao fato de terem gramáticas diferentes de Chomsky (como o link deixa claro (ish)).

Em geral, algumas pessoas não gostam de pensar filosoficamente (como seu colega de trabalho) e não tenho certeza de que você possa argumentar como se livrar de uma mentalidade. Seu primeiro ponto está certamente errado, mas o segundo pode ser apenas uma maneira de dizer que não preciso me preocupar com isso para codificar formulários da Web para recebimento de mercadorias. Sinto simpatia por isso, mas às vezes conhecer a teoria significa que você não se compromete a encontrar o Santo Graal no horário de trabalho.

Alistair Mackenzie
fonte
-6

Talvez a resposta seja que seu colega de trabalho esteja correto. Talvez você tenha entendido mal Turing, ou como isso se aplica aqui?

Todas as máquinas são finitas, portanto, não existem máquinas de Turing 'reais' nem programas que nunca parem. Um programa trivial que executa um loop infinito simples pode executar 5 minutos ou 50 anos, mas em uma máquina finita ele será interrompido. Um problema não trivial de interrupção, como 'calcular pi exatamente', também será interrompido, porque, eventualmente, o cálculo excederá a capacidade de armazenar mais dígitos.

O resultado de Turing não garante nada de particularmente útil em máquinas finitas; portanto, sua busca é infrutífera. Melhor focar em quanto tempo e quanto dinheiro e deixar o infinito para os matemáticos.

Você pode pensar que um programa como { while true: print "running"; print "halted"; }é um contra-exemplo, mas não é. Este programa tem efeitos colaterais, que podem ou não causar sua interrupção. Ignorando os efeitos colaterais, é possível elaborar uma prova formal de que este programa não será interrompido. Nesta questão, estamos preocupados apenas com programas que escapam à prova formal de não parar, onde a questão da parada é indecidível. Este não é um programa desse tipo.

Pode ajudar a distinguir Turing 'forte' de Turing 'fraco'. As máquinas Strong Turing são infinitas e, se não conseguirem, funcionarão por tempo infinito. Não podemos construí-los.

Máquinas de Turing fracas têm limites finitos de tempo e espaço, e são o único tipo que podemos construir. Estamos interessados ​​em programas que não podem comprovadamente parar dentro desses limites. Turing nos diz que existem programas desse tipo, mas não podemos identificá-los. Se os limites forem baixos o suficiente, podemos identificá-los escrevendo o programa e executando-o em seus limites.

A essência de Turing é que não há atalhos. A única maneira de ter certeza de que um problema é viável computacionalmente é escrever o programa, executá-lo e descobrir. Com tempo e dinheiro suficientes, você pode escrever todos os programas, executá-los para sempre e ao longo do tempo e encontrar os que produzem resultados (os cabeçalhos). Os outros ainda estarão correndo. Você tem tempo e dinheiro suficientes para fazer isso?

Sério, a disputa é sobre limites. Turing e NP complete nos dizem que certas classes de problemas não podem ser resolvidas por computadores dentro de um determinado orçamento ou em um determinado cronograma, não importa quão grande esse orçamento ou quão generoso esse cronograma possa ser. Existem muitos exemplos desse tipo de problema: quebra de chaves criptográficas; otimizar as rotas para fazer entregas em centenas de endereços; caixas de embalagem em caminhões; encontrando bugs em programas grandes!

Portanto, peça um orçamento e um cronograma ao seu colega de trabalho e prometa que você pode produzir um problema que não pode ser resolvido dentro desse orçamento ou cronograma. Essa promessa será muito fácil de cumprir.

david.pfx
fonte
2
A essência do problema da parada é que existem classes de problemas que nunca podem ser computadas - mesmo com tempo e dinheiro infinitos. É isso que meu colega se recusa a aceitar.
Jesan Fafon
Então nós discordamos. Eu editei minha resposta, mas essencialmente a mensagem é a mesma. Sua pergunta apresentada não tem uma resposta (ou nenhuma que você goste), mas subjacente é uma questão real e um argumento real a ser feito. Se você quiser vencer esse argumento, terá que mudar de posição um pouco, e eu tentei fornecer alguma ajuda para fazer isso. [Lembre-me para não tentar responder a perguntas como esta novamente - os votos negativos são bem-vindos.]
david.pfx
2
@ Simon: Correndo o risco de me repetir, não há programas que levam uma quantidade infinita de tempo para serem concluídos, porque não existem computadores Turing completos, apenas aproximações finitas para eles. Você não pode provar que um programa arbitrário será concluído em um período específico de tempo por qualquer método mais rápido do que realmente executar o programa. Na prática, qualquer frase com a palavra "infinito" corre o risco de não fazer sentido.
David.pfx
3
while True: print "doing stuff"; print "Finished"; Esse é um exemplo de um programa que leva uma quantidade infinita de tempo para concluir. Há uma quantidade infinita de outros programas que também levam uma quantidade infinita de tempo para serem concluídos. Criamos regularmente programas que levam uma quantidade infinita de tempo para serem concluídos de propósito. Eles são chamados de 'processos de execução longa'. Os sites mais dinâmicos são exemplos de um.
Singletoned
2
A questão é certamente que existem conjuntos de programas de computador que são efetivamente infinitos, eles nunca param sob seu próprio vapor (pressionaremos a interrupção, desligamos a energia etc.) eventualmente, se os programássemos em uma máquina de Turing, seria corra sem parar. A essência do problema da parada é que não há maneira prática ou teoricamente de determinar os programas sem interrupção de maneira algorítmica.
Alistair Mackenzie