Eu sei que os algoritmos de tempo exponencial geralmente devem ser evitados, mas às vezes são necessários. Um caso é o Vendedor Viajante. Quão comuns são esses algoritmos no software de produção? Esses casos geralmente são necessários ou são resultado de trabalhos urgentes? Entendo que muitos podem ser resolvidos com uma boa heurística. O que normalmente é feito com aqueles que não podem?
algorithms
Engenheiro Mundial
fonte
fonte
Respostas:
Algo que não está no software de produção, mas é feito no software de produção é a verificação formal . Provavelmente, ele não é adotado para a maioria dos softwares de clientes, mas é rastreado para sistemas e drivers incorporados, ou seja, para hardware e software cuja correção é importante (e tratável).
Os problemas de verificação que são realmente computáveis (barreira nº 1) costumam ser EXPTIME - difíceis, nos casos de mais sorte você obtém problemas completos com o PSPACE (barreira nº 2). Ambas as classes são (suspeita-se que sejam) mais difíceis que os problemas NP-completos, o que é fácil em comparação. Problemas duplamente exponenciais também são facilmente obtidos.
Nesses casos, as heurísticas (no sentido de resultado final) não são suficientes, pois você precisa de resultados definidos; portanto, você precisa de grandes máquinas e tempo. Existem heurísticas (no sentido de seleção alternativa) que geralmente levam a um tempo de execução mais curto (ou seja, exploração inteligente do espaço de pesquisa quando são pesquisados estados de erro), mas na pior das hipóteses, esperar é tudo o que você pode fazer. Ou você pode fazer uma prova de caneta e papel e verificá- la por máquinas , o que é computacionalmente mais simples.
fonte
O algoritmo comumente usado com complexidade exponencial de pior caso é o método simplex usado na programação linear . No entanto, o que é a complexidade de casos genéricos desse método é uma questão em aberto. Com algumas suposições específicas, é polinomial.
fonte
Os intérpretes da linguagem de programação são piores que o tempo exponencial (no tamanho de sua entrada, ou seja, no tamanho do programa que estão interpretando), e são bastante comuns. Outro exemplo é a prova automática de teoremas / resolução de restrições / resolução de problemas / programação linear inteira. E ainda outro exemplo é a diferenciação simbólica implementada, por exemplo, no Maple / Mathematica (embora seja possível fazer diferenciação simbólica em tempo linear, se você puder compartilhar subexpressões entre nós).
fonte
Deixe-me dar o exemplo do problema do vendedor ambulante. Já trabalhei nisso algumas vezes.
Há algumas vezes em que estou em uma equipe que escreveu a solução para o problema do vendedor ambulante, mas com mais alguns parâmetros. Por exemplo, poderia ser uma loja com uma frota de técnicos e engenheiros, cada um com um conjunto de habilidades exclusivo. Os destinos surgem todos os dias na forma de solicitações de serviço. Todos os programas estão em produção, embora tenham sofrido modificações e manutenção desde a sua criação original.
Foi assim que eles funcionaram. Cada engenheiro receberia uma lista de itens para manutenção em um dispositivo portátil todos os dias. Ao concluir cada tarefa de serviço, eles devem fechar o caso. Os casos deixados de fora se juntam aos casos a serem agendados para o dia seguinte com prioridade um pouco mais alta, pois o cliente já teria expressado alguma insatisfação. Havia um grande conjunto de razões pelas quais um engenheiro não comparecia a um caso. Problemas de trânsito eram mais comuns.
Quão comuns eles são? Pelo menos tão comum quanto o número de solicitações de serviço pós-venda provenientes de clientes. Sem o serviço pós-venda, por exemplo, reter clientes será difícil e conquistar novos clientes será mais difícil.
Com muitas lojas on-line, como a Amazon e outras livrarias e outras lojas bem-sucedidas nos negócios, eu pensaria que os vendedores ambulantes são mais comuns do que costumavam ser. Além disso, pode haver muitas variações do problema do vendedor ambulante que são ensinadas nos livros didáticos.
fonte