Вы должны разделить две проблемы здесь.Качество ваших приближенных алгоритмов и правильность реализации этих алгоритмов.
Проверка качества алгоритма аппроксимации обычно не поддается методам модульного тестирования, используемым при разработке программного обеспечения.Например, вам нужно будет генерировать случайные задачи, представляющие реальные размеры проблем.Возможно, вам придется выполнить математическую работу, чтобы получить верхнюю / нижнюю границу, чтобы оценить качество ваших алгоритмов для неразрешимых больших экземпляров.Или используйте тестовые наборы проблем, которые имеют известные или наиболее известные решения, и сравните свои результаты.Но в любом случае модульное тестирование мало поможет вам в улучшении качества алгоритмов аппроксимации.Здесь вам помогут знания предметной области в области оптимизации и математики.
Правильность вашей реализации - это то, где модульные тесты будут действительно полезны.Здесь вы можете использовать задачи размером с игрушку и сравнить известные результаты (решение вручную или тщательная пошаговая отладка кода) с тем, что генерирует ваш код.Наличие небольших проблем не только достаточно, но и желательно, чтобы тесты выполнялись быстро и могли запускаться много раз в течение цикла разработки.Эти типы тестов удостоверяются, что общий алгоритм достигает правильного результата.Это что-то среднее между модульным тестом и интеграционными тестами, поскольку вы тестируете большую часть кода в виде черного ящика.Но я обнаружил, что эти типы тестов чрезвычайно полезны в области оптимизации.Одна вещь, которую я рекомендую сделать для этого типа тестирования, - удалить все случайности в ваших алгоритмах через фиксированные начальные числа для генераторов случайных чисел.Эти тесты должны всегда выполняться детерминистическим образом и давать точно такой же результат 100% времени.Я также рекомендую юнит-тестирование на модулях более низкого уровня ваших алгоритмов.Изолируйте этот метод, который присваивает веса дугам на графике, и проверьте, назначены ли правильные веса.Изолируйте вашу функцию вычисления значения целевой функции и проверьте ее.Вы поняли мою точку зрения.
Еще одна проблема, которая обрезает оба этих среза, - это производительность.Вы не можете надежно протестировать производительность с небольшими игрушечными проблемами.Также очень желательно реализовать изменение, которое значительно снижает производительность рабочего алгоритма.Когда у вас есть работающая версия ваших алгоритмов, вы можете создавать более сложные тестовые задачи, где вы измеряете производительность и автоматизируете ее для тестирования производительности / интеграции.Вы можете запускать их реже, так как они будут занимать больше времени, но, по крайней мере, заблаговременно уведомят вас о недавно появившихся узких местах производительности во время рефакторинга или о новых возможностях, добавленных в алгоритмы