Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Разработка эффективных алгоритмов.doc
Скачиваний:
118
Добавлен:
24.11.2019
Размер:
1.2 Mб
Скачать

8.1. Примеры np-полных задач

8.1.1. Задача о коммивояжере

Задан набор городов и стоимость путешествия между любыми двумя из них. Нужно определить такой порядок, в котором следует посетить все города по одному разу и вернуться в исходный город, чтобы общая стоимость путешествия оказалась минимальной.

8 городов можно упорядочить 8!=40320 способами, а для 10 городов это число возрастает до 3 628 800. Поиск кратчайшего пути требует перебора всех этих возможностей. Предположим, у нас есть алгоритм, способный подсчитать стоимость путешествия через 15 городов в указанном порядке. Если за 1 секунду такой алгоритм способен пропустить через себя 100 вариантов, то ему потребуется больше 4-х веков, чтобы исследовать все возможности и найти кратчайший путь. Если в нашем распоряжении 400 таких компьютеров, то у них уйдет на это год, а ведь мы имеем дело всего лишь с 15 городами.

Ясно, что дешевле и быстрее путешествовать хоть как-нибудь, чем ждать, пока компьютер выдадут оптимальное решение. Можно ли найти кратчайший путь, не просматривая их все? До сих пор никому не удалось придумать алгоритм, который не занимается по существу просмотром всех путей.

Задача о коммивояжере может быть сформулирована как задача на графах. Каждый город можно представить вершиной графа, наличие пути между двумя городами – ребром, а стоимость путешествия – весом ребра.

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

Во-первых, мы должны посетить все города, а алгоритм поиска кратчайшего пути дает лишь путь между двумя заданными городами. Если собрать путь из кратчайших кусков, то он будет проходить через некоторые города по несколько раз.

Во-вторых, требуется вернуться в начальную точку, что не надо в кратчайшем пути.

8.1.2. Задача о раскраске графа

Граф G=(V,E) представляет собой набор вершин V и набор ребер Е, соединяющих вершины попарно. Вершины можно раскрасить в разные цвета, которые обозначаются целыми числами. Необходимо раскрасить граф таким образом, чтобы концы каждого ребра были окрашены в разные цвета. Очевидно, что в графе с N вершинами можно покрасить все вершины в N различных цветов, но можно ли обойтись меньшим количеством? Каково минимальное количество цветов, необходимое для раскраски вершин? Можно ли раскрасить вершины в С или менее цветов?

У задачи раскраски графа есть практическое приложение – составление расписаний. Если каждая вершина графа обозначает читаемый в колледже курс, и вершины соединяются ребром, если есть студенты, слушающие оба курса, то получается весьма сложный граф.

Если предположить, что каждый студент слушает 5 курсов, то на студента приходится 10 ребер. Предположим, что на 3500 студентов приходится 500 курсов. Тогда у получившегося графа будет 500 вершин и 35000 ребер.

Если на экзамены отведено 20 дней, то это означает, что вершины графа должны быть раскрашены в 20 цветов, чтобы ни у одного из студентов не приходилось по 2 экзамена в день.

8.1.3. Раскладка по ящикам

Пусть у нас есть несколько ящиков единичной емкости и набор объектов различного размера S1,S2,..Sn. Найти наименьшее количество ящиков, необходимое для раскладки всех объектов, или ( в другой постановке) можно ли упаковать все объекты в В или менее ящиков.

Эта задача возникает при записи информации на диски или во фрагментированной памяти компьютера; при эффективном распределении груза на кораблях; при вырезании кусков из стандартных порций материала по заказам клиентов.

Верхняя граница числа ящиков m равна n, т.е. mmax=n , если i, j Si+Sj>1. Нижняя граница m это mmin = 1, при условии ∑Si ≤1.