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.