Я хотів би передумови, що це питання схоже, але моє запитання не передбачає випадковості, просто вибагливий детермінізм, тому відповідь "використовувати відоме насіння" насправді не застосовується. Так само це питання схоже, але знову ж таки, я не сподіваюсь, що алгоритм колись вийде з ладу - я просто не знаю, яким чином це буде правильним.
Це питання виникло під час тестування алгоритмів графіків. але жодним чином не обмежується ними. Деякі алгоритми, такі як A *, можуть мати кілька правильних відповідей. Залежно від вашої точної реалізації, ви можете отримати будь-який з декількох відповідей, кожен з яких однаково правильний. Це може ускладнити їх тестування, тому що ви не знаєте, який саме буде виплюнути достроково, і дуже багато часу потрібно обчислити відповіді вручну.
У моєму конкретному випадку я обійшов це, змінивши Флойда-Варшалла, щоб виплюнути всі можливі найкоротші шляхи, і витратив час на тестування цього. Користь була хорошою рисою сама по собі. Тоді я міг би перевірити інші функції з точки зору відомих правильних шляхів від FW (якщо повернутий шлях - це будь-який із шляхів, повернутих FW для цієї пари початку / кінця, це правильно). Звичайно, це працює лише для щільних графіків завдяки тому, як працює FW, але це все одно приємно.
Однак це не завжди може бути життєздатним для всіх алгоритмів з цією характеристикою. Поки найкраща відповідь, яку я придумав, - це перевірити на характеристики правильної відповіді, а не на саму правильну відповідь. Щоб повернутися до алгоритмів найкоротшого шляху, ви можете перевірити вартість повернутого шляху відповідно до відомої правильної вартості та переконатися, що шлях дійсний.
Це працює, але може виникнути ризик не перевірити все правильно, тим більше критеріїв правильності є, особливо якщо верифікація сама по собі є складною (наприклад, поки існують правильні алгоритми , перевірка мінімального розміру дерева є відомою важкою проблемою; напевно, важче, ніж побудова самого MST), і в цьому випадку вам доведеться провести тестування коду тестування. Гірше: імовірно, вам доведеться побудувати MST для тестування алгоритму перевірки MST, тому у вас є чудовий сценарій, коли ваш тест MST спирається на роботу вашого алгоритму перевірки MST, а ваш тест алгоритму перевірки MST спирається на ваш код генерації MST.
Нарешті, є "дешевий спосіб", який передбачає спостереження за результатами, перевірку його вручну, а потім жорстке кодування тесту, щоб перевірити вихід, який ви тільки що перевірили, але це не чудова ідея, оскільки вам, можливо, доведеться переглядати тест кожен раз, коли ви трохи змінити реалізацію (чого слід уникати автоматизованого тестування).
Очевидно, що відповідь залежить від точного алгоритму, який ви перевіряєте до певної міри, але мені було цікаво, чи існували "найкращі практики" для перевірки алгоритмів, які мають декілька певних, детермінованих "правильних" результатів, але ці точні правильні результати важко знати заздалегідь, і, можливо, важко навіть перевірити факт.