Eu gostaria de prefácio que esta pergunta é semelhante, mas minha pergunta não envolve aleatoriedade, apenas determinismo exigente, portanto a resposta de "usar uma semente conhecida" não se aplica realmente. Da mesma forma, essa pergunta é semelhante, mas, novamente, não espero que o algoritmo falhe - apenas não sei de que maneira ele estará correto.
Essa pergunta surgiu ao testar algoritmos gráficos. mas não se limita a eles. Alguns algoritmos como A * podem ter várias respostas corretas. Dependendo da sua implementação exata, você pode obter qualquer uma das várias respostas, cada uma das quais está igualmente correta. No entanto, isso pode dificultar o teste, porque você não sabe qual deles cuspirá antes do tempo e é muito demorado calcular as respostas manualmente.
No meu caso específico, resolvi modificar o Floyd-Warshall para cuspir todos os caminhos mais curtos possíveis e passei o tempo testando isso. Teve o benefício de ser um bom recurso por si só. Depois, pude testar outras funções em termos dos caminhos corretos conhecidos do FW (se o caminho retornado for qualquer um dos caminhos retornados pelo FW para esse par de início / fim, está correto). Obviamente, isso só funciona para gráficos densos devido à forma como o FW funciona, mas ainda é bom.
No entanto, isso nem sempre é viável para todos os algoritmos com essa característica. Até agora, a melhor resposta que encontrei é testar as características de uma resposta correta, em vez da resposta correta em si. Para voltar aos algoritmos de caminho mais curto, você pode verificar o custo do caminho retornado em relação ao custo correto conhecido e garantir que o caminho seja válido.
Isso funciona, mas pode correr o risco de não verificar tudo corretamente, pois existem mais critérios de correção, especialmente se a verificação for complexa (por exemplo, enquanto existem algoritmos corretos , verificar uma árvore de abrangência mínima é um problema difícil conhecido; provavelmente mais difícil do que isso). construindo o próprio MST); nesse caso, agora você precisa testar extensivamente seu código de teste. Pior: presumivelmente, você precisa construir um MST para testar um algoritmo de verificação MST, para ter um ótimo cenário em que seu teste MST se baseia no funcionamento do seu algoritmo de verificação MST e seu teste no algoritmo de verificação MST se baseia no funcionamento do código de geração MST.
Por fim, existe a "maneira barata", que envolve observar a saída, verificá-la manualmente e depois codificar o teste para testar a saída que você acabou de verificar, mas isso não é uma boa idéia, pois você pode precisar revisar o teste toda vez que altere um pouco a implementação (que é o que o teste automatizado deve evitar).
Obviamente, a resposta depende do algoritmo exato que você está testando até certo ponto, mas eu queria saber se havia alguma "prática recomendada" para verificar algoritmos que tenham várias saídas "corretas" determinísticas e definidas, mas essas saídas corretas precisas são difíceis de saber com antecedência e, possivelmente, difícil de verificar após o fato.
fonte
Respostas:
Não tenho certeza se você está tentando testar a propriedade correta, e isso causa sua ambiguidade.
Os algoritmos de gráfico não têm como objetivo encontrar um caminho mais curto (esse é um efeito colateral), mas minimizar ou maximizar alguma função de custo definida no conjunto de arestas e vértices. Assim, você pode verificar a correção de uma solução testando o valor final dessa funcionalidade e afirmando que o primeiro e o último nó são os realmente necessários.
Se você pode pré-calcular o valor da função de custo final para cada caminho possível (geralmente irrealista), basta verificar se o custo da solução fornecida pela implementação em teste é igual ao custo mínimo entre este conjunto (comparação absoluta ) Se você "apenas" possui um algoritmo e / ou implementação padrão-ouro, deve comparar o custo de sua saída com o do algoritmo em teste (comparação relativa)
Por exemplo, uma configuração de teste ingênua seria:
Se você quiser saber mais sobre a otimização baseada em gráficos, pode dar uma olhada nas publicações de Yuri Boykov aqui , embora em outro contexto (problemas de visão computacional).
fonte
Acho que a resposta direta à sua pergunta é escolher melhores casos de teste. Eu me pergunto sobre os casos de teste que você está usando. Os gráficos que você usa podem ser CANNED, onde é relativamente fácil para um ser humano determinar a resposta esperada. Tente descobrir os casos de "borda" com os quais você deseja garantir que seu algoritmo lide e crie um gráfico fixo para cada um dos casos de borda específicos que é fácil para o ser humano calcular. Por exemplo, no caso do algoritmo Djikstra, você provavelmente pode criar alguns gráficos 5x5 ou 7x7 que cobrem todos os seus casos extremos, mesmo que o seu sistema real possa ser 500x500.
Então, como uma verificação final de sanidade, você pode criar um caso de teste gráfico mais realista ou dois. Mas, de qualquer forma, acho que o sansuiso indica onde é indicado que você precisa ter certeza de que está testando a propriedade correta.
fonte