Анализ алгоритма сканирования Грэма выпуклой оболочки

Я сделал код для реализации алгоритма Graham Scan выпуклой оболочки. Я протестировал программу, создав несколько тестовых случаев. Во всех случаях дает точный результат. Но мой вопрос в том, можно ли сгенерировать несколько сложных тестовых случаев, когда программа может не выдать идеальную выпуклую оболочку в качестве вывода? Какова процедура генерации таких случаев?


person Community    schedule 17.09.2016    source источник
comment
Просто сгенерируйте несколько случайных тестов и проверьте свое решение. Для больших экземпляров легко проверить, содержит ли он все точки. Чтобы проверить, является ли это минимальным корпусом, вы можете создать небольшие тестовые примеры и сравнить их с полным перебором. Невозможно генерировать жесткие экземпляры без знания вашего алгоритма. Вы также можете реализовать функцию, генерирующую экземпляры, где вы знаете оптимальное решение (по построению). Но это будет более предвзято.   -  person sascha    schedule 18.09.2016
comment
Иногда код выпуклой оболочки ломается, когда точки коллинеарны, особенно на самой оболочке.   -  person Joseph O'Rourke    schedule 18.09.2016
comment
Стресс-тест заключается в том, что все сайты расположены на одной прямой, либо по горизонтали/вертикали, либо по наклонной линии. Также дублируются вершины. Если вы использовали реализацию на основе полярных координат, попробуйте конфигурации с сайтами, выровненными по центру.   -  person Yves Daoust    schedule 20.09.2016
comment
Чтобы попробовать: девять точек, определяемых квадратом, разделенным на четыре части. Затем попробуйте все 2 ^ 9 подмножеств этих точек.   -  person Yves Daoust    schedule 20.09.2016
comment
не могли бы вы предоставить тестовые данные, содержащие вершины? @Ив Дауст   -  person    schedule 20.09.2016
comment
@ user6823702: Нет.   -  person Yves Daoust    schedule 20.09.2016


Ответы (1)


Как ответил Саша в комментарии, невозможно помочь вам создать сложные тестовые примеры или узнать, возможно ли это, не зная, как вы реализовали алгоритм.

Сам алгоритм, конечно же, доказал свою правильность и решил проблему. Таким образом, речь идет только о тестировании того, что ваша реализация делает то, что говорит алгоритм.

Я бы предложил попробовать доказать себе свою реализацию - доказать, что вы получаете правильную точку в качестве отправной точки, доказать, почему вычисления, которые вы делаете для сортировки, дают правильный порядок сортировки по углу, доказать, что вычисления, на основе которых принимается решение отбросить точку или продолжить основано на эквивалентности (или непосредственном выяснении) вопроса о повороте направо или налево и доказать, что каждый шаг алгоритма выполняется в вашей реализации.

Все эти доказательства можно выполнить дважды: один раз теоретически, а затем с помощью тестовых кодов, которые будут нацелены на конкретные вопросы с построенными для них тестовыми примерами (например, чтобы проверить, правильно ли выполняются расчеты правого/левого поворота, которые вы не выполняете). нужна остальная часть алгоритма - просто протестируйте множество наборов из 3 точек с каждым возможным созвездием против известного правильного результата, чтобы проверить, дает ли расчет, который вы используете, правильный ответ).

person et_l    schedule 17.09.2016