
- •Оглавление
- •1. Множества
- •1.1. Основные понятия
- •1.2. Способы задания множеств
- •1.3. Операции над множествами
- •Приоритеты операций над множествами
- •1.4. Свойства операций над множествами
- •1.5. Методы доказательства теоретико-множественных тождеств
- •1.5.1. Метод двух включений
- •1.5.2. Метод эквивалентных преобразований
- •1.5.3. Метод характеристических функций
- •1.5.4. Метод логических функций
- •1.5.5. Теоретико-множественный метод
- •1.6. Способы представления множества в памяти эвм
- •1.7. Алгоритмы реализации операций над множествами
- •Практическое занятие 1.1 Операции над множествами
- •Задания
- •Варианты заданий
- •Практическое занятие 1.2 Теоретико-множественные тождества
- •Задания
- •Варианты заданий
- •Контрольные вопросы
- •2. Комбинаторные объекты
- •2.1. Введение
- •2.2. Метод поиска с возвращением
- •2.3. Подмножества
- •2.4. Перестановки
- •2.5. Размещения
- •2.6. Размещения с повторениями
- •2.7. Сочетания
- •2.8. Перестановки с повторениями
- •2.9. Сочетания с повторениями
- •2.10. Упорядоченные разбиения множества
- •2.11. Разбиения множества
- •2.12. Использование алгоритмов порождения комбинаторных объектов при проектировании полнопереборных алгоритмов решения задач выбора
- •2.13. О неэффективности полнопереборных алгоритмов. Пример
- •Времена обработки деталей на станках a и b
- •Времена окончания обработки деталей на станках a и b
- •Времена окончания обработки деталей на станках a и b
- •Времена окончания обработки деталей на станках a и b
- •Практическое занятие 2.1 Алгоритмы порождения комбинаторных объектов
- •Задания
- •Практическое занятие 2.2 Разбиения множеств
- •Задания
- •Количество упорядоченных разбиений
- •Практическое занятие 2.3
- •Задачи выбора
- •Цель занятия: приобретение практических навыков в использовании алгоритмов порождения комбинаторных объектов при проектировании алгоритмов решения задач выбора.
- •Задания
- •Варианты заданий
- •Контрольные вопросы
- •Библиографический список
2.12. Использование алгоритмов порождения комбинаторных объектов при проектировании полнопереборных алгоритмов решения задач выбора
Задачи, для которых существует конечное множество М объектов, содержащее решение задачи, относятся к классу задач выбора. Элементы множества М называются траекториями задачи. Каждой траектории можно поставить в соответствие некоторую, как правило, числовую характеристику, называемую функционалом, позволяющую распознать траекторию, являющуюся решением задачи.
В общем случае, в постановке задачи выбора может потребоваться:
1) определить, существует ли решение;
2) найти все решения задачи;
3) определить значение функционала “лучшего ” решения;
4) найти одно или все “лучшие ” решения.
Для того, чтобы решить задачу выбора, можно организовать полный перебор всех траекторий и выбрать из них траекторию (траектории), удовлетворяющую условию решения задачи. Такие алгоритмы называют полнопереборными. Одним из методов организации перебора всех траекторий является метод поиска с возвращением, который мы использовали для порождения комбинаторных объектов. Алгоритмы порождения комбинаторных объектов также могут быть использованы для перебора всех траекторий. В этом случае проектирование алгоритма решения задачи выбора заключается в следующем:
1) определение класса комбинаторных объектов, содержащих решение задачи;
2) определение способа вычисления функционала;
3) определение способа распознавания решения по значению функционала.
Алгоритм решения задачи выбора представляет собой порождение комбинаторных объектов, содержащих решение задачи, вычисление функционала для каждого объекта и определение принадлежности объекта множеству решений. Для того, чтобы преобразовать алгоритм порождения комбинаторных объектов в алгоритм решения задачи выбора, достаточно заменить блок вывода сформированного объекта на блок, в котором вычисляется значение функционала для полученного объекта и определяется принадлежность объекта множеству решений.
Рассмотрим примеры задач выбора и способы их решения.
Пример 1. Задача. Дана последовательность из n целых чисел (n>1) и целое число m. Определить, можно ли между каждой парой чисел в последовательности расставить знаки “+” или “-” так, чтобы получилось выражение, значение которого равно m.
Решение. Всего необходимо поставить n-1 знаков. Каждому варианту расстановки знаков можно поставить в соответствие двоичный вектор, в котором значение 1(0) в i-ом разряде соответствует знаку “+”(“-“) между i-ым и i+1-ым числом в последовательности. Траекториями задачи будут являться все двоичные n-1-разрядные вектора.
Функционалом будет являться значение выражения, полученного из
заданной последовательности чисел путём расстановки знаков, соответствующих двоичному вектору. Пусть Р - исходная последовательность чисел, а D – двоичный вектор. Тогда значение выражения S можно вычислить по следующему алгоритму:
1. S:=P1
2. Для всех i от 1 до n-1 выполнить S:=S+ (2*Di-1)*Pi+1
или, более наглядно:
1. S:=P1
2. Для всех i от 1 до n-1 выполнить
если Di=1 то S:=S+Pi+1 иначе S:=S-Pi+1
Если значение выражения S будет равно m, то двоичный вектор соответствует требуемой расстановки знаков, ответ будет положительным и на этом заканчивается решение задачи. Если же ни один вектор не определил требуемую расстановку знаков, то ответ будет отрицательным.
Пример 2. Задача. На предприятии работают n рабочих. В выездной бригаде должны находиться рабочие, которые все вместе владеют заданными специальностями. Множество специальностей, которыми владеет каждый рабочий - известно. Необходимо сформировать бригаду из минимального числа рабочих.
Решение. Бригада из минимального числа рабочих представляет собой подмножество множества всех рабочих, поэтому траекториями данной задачи являются подмножества выбранных рабочих. Учитывая то, что требуется сформировать бригаду из минимального числа рабочих, целесообразно порождать подмножества в порядке увеличения мощности. Это можно сделать, применяя алгоритм порождения сочетаний. Сначала будем порождать сочетания из n по 1 (мажет быть, один из рабочих владеет всеми необходимыми специальностями), затем - сочетания из n по 2 и т.д. до порождения сочетаний из n по n.
Функционалом будет являться множество МS специальностей, которыми владеет множество из k выбранных рабочих. Обозначим М - множество заданных специальностей, Si – множество специальностей, которыми владеет i-ый рабочий, С – сочетание из n по k, записанное в возрастающем порядке. Алгоритм вычисления функционала может быть следующим:
1. MS:=
2. Для всех i от 1 до k выполнить MS:=MSSCi
Если при обработке очередного сочетания окажется, что M является
подмножеством MS, то бригада из минимального числа рабочих соответствует этому сочетанию, решение найдено. Если же MMS будет ложным для всех порождённых подмножеств, то это означает, что сформировать бригаду из имеющихся рабочих, владеющих совместно всеми заданными специальностями, невозможно, задача не имеет решения.
Пример 3. Задача. Коммивояжер (агент по сбыту), отправляясь из своего города, должен ровно по одному разу посетить n-1 заданных городов и вернуться назад, затратив при этом минимальную сумму на поездку. Какой маршрут ему выбрать, если затраты на проезд между городами заданы.
Решение. Обозначим города 0,1,…,n-1, 0 – исходный город, Cij – стоимость проезда от города i до города j. Маршрут коммивояжера представляет собой последовательность (0,i,…,j,0), состоящую из n+1 элементов, причём первый и последний – 0 – фиксированный элемент, а
остальные n-1 – попарно неравные элементы. Эта часть последовательности, от второго элемента до предпоследнего, однозначно определяет маршрут коммивояжера и представляет собой перестановку множества {1..n-1}, поэтому траекториями задачи будут все возможные перестановки n-1-элементного множества.
Функционалом будет являться стоимость маршрута, определяемого перестановкой P n-1-элементного множества. Алгоритм вычисления функционала может быть следующим:
1.
2.
Для всех i
от 2 до n-1
выполнить
Обозначим стоимость маршрута, принятого за оптимальный – MinS, вначале это некоторое заведомо большое число. Если при обработке очередной перестановки получим S<MinS, то эту перестановку нужно запомнить как лучшую и MinS:=S. Решение будет получено только после обработки всех (n-1)! перестановок.