|
Задача первого дня
При решении NP-полных задач, во-первых, может оказаться, что
какой-то экспоненциальный алгоритм работает приемлемое время на реальных данных;
во-вторых, можно пытаться найти (за полиномиальное время - в худшем или в среднем)
не оптимальное решение, а некоторое приближение к нему. На практике такое близкое
к оптимальному решение может быть вполне достаточным. Алгоритмы, дающие такие
решения, называют приближенными алгоритмами.
Удобно оценивать качество алгоритма, измеряя относительную ошибку. Пусть
мы решаем оптимизационную задачу: ищем объект с наибольшей или наименьшей стоимостью
среди множества объектов, на которых задана функция стоимости.
Относительная ошибка определяется (для каждого входа алгоритма) как отношение
|C-C*|/C*,
где C* обозначает стоимость оптимального решения,
C - стоимость решения, выдаваемого алгоритмом.
Часто относительная ошибка уменьшается ценой увеличения времени работы приближенного
алгоритма.
Задача коммивояжера
Задан набор городов в виде неориентированного графа. Коммивояжер
должен объехать все города, побывав в каждом ровно по одному разу, и вернуться
в город, из которого начато путешествие. Города нумеруются целыми числами от
0 до N-1 (1 <= N <= 400), начиная с города, из которого коммивояжер стартует.
Известно, что перелет из города i в город j стоит
c(i,j) рублей (считаем цены целыми положительными числами, c(i,j) = c(j,i)).
Большинство, но не обязательно все, цены пропорциональны геометрическим расстояниям
между городами. Требуется разработать и реализовать приближенный алгоритм, осуществляющий
поиск пути наименьшей стоимости. Исполнение программы должно занимать не более
N*N*0.01 сек. На чтение входных данных отводится N*N*0.01 сек. (но не менее
2 сек.). Результаты будут сравниваться по относительной ошибке по сравнению
с точным решением.
Входные данные: В первой строке файла input.txt записано
число N - количество городов. Каждая следующая строка содержит по три целых
числа, записанных через некоторое количество пробелов - номера городов и стоимость
перелета между ними. Строка может начинаться с пробела. Граф не обязательно
полный, наличие гамильтонова цикла гарантируется. Задача не требует проверки
корректности входных данных.
Выходные данные: Файл output.txt должен содержать в первой строке одно
целое число - стоимость найденного пути. Во второй строке должен быть приведен
сам путь - перечисление вершин, начиная с 0.
Задача второго дня
Перед вами стоит задача: навести порядок в архиве изображений
ftp-сайта. Архив собирался много лет и состоит из изображений реальных сцен
- пейзажей, животных, людей, репродукций картин. Изображения получены разными
способами: цифровой фотографией, сканированием обычных фотографий, оцифровкой
видео- и кинокадров. Изображения хранятся в формате JPG.
Задача состоит в том, что среди изображений много дубликатов - снимков одной
и той же сцены с одного и того же ракурса, или просто копий одного и того же
изображения. Основная же проблема при решении этой задачи состоит в том, что
копии подвергались различной обработке: упаковке алгоритмом JFIF с различными
параметрами, масштабированию (иногда с нарушением отношения высоты к ширине),
цифровому ретушированию и цветокоррекции (иногда весьма непрофессионально),
добавлению различных логотипов и рамок, обрезанию краев, преобразованию в 256
цветов с диффузией ошибки и без и повторному сжатию. Кроме того, сканированные
и оцифрованные кадры могли сканироваться с оригиналов различного качества в
различном разрешении и с различными настройками сканера по яркости, контрастности
и цветопередаче. Все это приводит к тому, что бинарное сравнение изображений
(как упакованных, так и распакованных) ни в коем случае не может служить критерием
их одинаковости.
Вам дана случайная выборка изображений из архива (до 30% его объема). Ваша задача
- написать программу, которая будет просматривать весь архив, и выдавать список
файлов, которые она сочтет дубликатами. Вам предоставляется библиотека libjpeg
для работы (распаковки, упаковки и других преобразований) с изображениями формата
JPG с полной документацией. Кроме того, вы можете пользоваться программами Adobe
Photoshop и AcdSee для просмотра и редактирования изображений.
Формат ввода и вывода: Первым аргументом командной строки программе передается
имя каталога, в котором лежат изображения. Каталог может содержать до 15.000
изображений, но не содержит подкаталогов. Каждое изображение хранится в отдельном
файле с расширением .JPG. На имена файлов распространяются ограничения MSDOS:
имя не более 8 символов и содержит только алфавитно-цифровые символы ASCII и
символы _ и ~. Вторым аргументом передается имя файла, в который следует выдать
список дубликатов. Список имеет форму текстового файла, в котором каждая группа
дубликатов перечислена в одной строке. Имена файлов приводятся без каталога
и расширения, разделяются пробелом. Строки разделяются парой символов Cr-Lf.
Допустимо, чтобы один и тот же файл встречался во многих группах дубликатов.
Ограничения: Программа должна представлять собой консольное приложение
Win32. Программа исполняется на компьютере с ОС Windows NT 4.0 sp 6 с 32 MB
оперативной памяти. Объем своп-файла ограничен 1Gb. Кроме того, ваша программа
может создать неограниченное количество промежуточных файлов общим объемом не
более 1Gb (не считая исходных изображений). Астрономическое время исполнения
программы - не более 10мс*N+1мс*N*N (где N - количество изображений).
Соревнования проводятся в двух номинациях: на наибольшую точность поиска дубликатов
без учета времени и на наименьшее время исполнения при точности поиска не менее
75%.
Дополнение: Некоторые изображения очень низкого качества (сканировались
с низкокачественных оригиналов и/или подвергались многократному редактированию
с последующей переупаковкой JPEG). Кроме указанных в условии изображений, архив
содержит также файлы, не являющиеся изображениями реальных сцен - фоновые картинки
веб-страниц, фракталы, контурные рисунки. Ошибочное признание таких изображений
за дубликаты друг друга и даже за дубликаты "нормальных" изображений
не считается ошибкой при определении точности поиска.
|