Мегаобучалка Главная | О нас | Обратная связь


Важное свойство этой задачи



2019-10-11 214 Обсуждений (0)
Важное свойство этой задачи 0.00 из 5.00 0 оценок




Введение

 

Существуют задачи для которых нет хорошего метода решения, ответ на них нельзя получить вычислением по формулам. Это как поиск клада без карты. Надо все честно перекопать. Такие задачи называются задачами полного перебора или комбинаторными задачами. Но перебор перебору рознь. Очевидно, что нет смысла копать скальную породу, могут быть и другие разумные ограничения на действия кладоискателя. То есть все возможные ситуации можно разделить на два класса: могущие содержать решение и не могущие содержать решения. Конечно это грубое разбиение, но для нас этого достаточно.

Это очень простая и понятная идея не искать там, где решения нет, но вот в чём проблема, как определить отсутствие клада не копая?

Пример 1.

Дано множество чисел. Составить из них подмножество такое что сумма его элементов будет в точности равна заданному числу А.

Решением задачи может оказаться любое множество из N - элементов. А теперь представьте себе, что в поисках решения вы составили такое множество, в нём N - элементов и в сумме они дают больше чем А. Очевидно, что добавление к этому множеству ещё одного элемента только ухудшит ситуацию. Таким образом, в данной задаче действительно можно иногда установить отсутствие решения, не осуществляя непосредственных построений.

Кстати давайте оценим количество отсекаемых вариантов. Пусть в исходном множестве M элементов и мы для множества из N - элементов установили, что его элементы в сумме дают больше чем А. Это означает, что M-N элементов могут не участвовать в дальнейших построениях. То есть необходимо отказаться от добавления к нашему плохому подмножеству всех подмножеств построенных на M-N элементах.

Комбинаторика говорит, что из К элементов можно построить 2К множеств, следовательно в нашем случае мы отбрасываем 2M-N вариантов. Даже при не очень больших числах выигрыш получится солидный, потому как экспоненциальная функция обладает очень высокой скоростью роста.

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


Важное свойство этой задачи

 

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

 

 

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

Обход всех ветвей можно осуществить, например, по правилу правой или левой руки. Это правило определяет ветвь, по которой нужно идти на очередном шаге поиска. Сформулируем правило.

Пусть на некотором шаге работы алгоритма мы находимся в некоторой вершине дерева и необходимо принять решение о том по какой ветви идти дальше. Учтём, что из каждой вершины произвольное количество ветвей уходит вниз и только одна наверх. Возможны следующие ситуации:

Все ветви уходящие вниз уже пройдены. Физически это может определятся какой-нибудь пометкой устанавливаемой на ветви в том случае если по ней осуществляется возврат. Тогда необходимо идти по ветви идущей вверх и пометить её как пройденную.

Среди ветвей ведущих вниз есть не пройденные. Найдём среди них самую левую и пойдём по ней.

Сформулированное правило никак не учитывает события происходящие в вершинах дерева. Между тем вершина от вершины может отличаться и не только положением в дереве. Например, в рассмотренной выше задаче при переходе вниз нарастает сумма, а при переходе вверх та сумма уменьшается. Таким образом, существует класс задач, для которых к дереву комбинаций данных может быть привязана некоторая величина изменяющаяся закономерным образом. Конечно, это не обязательно увеличение. Попробуем описать поведение этой величины в общем виде. Назовём её характеристикой дерева.

Характеристика изменяется внутри некоторого числового интервала.

Это изменение обладает свойством монотонности при движении по дереву вниз.

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

С учётом таковой характеристики описанное выше правило обхода дерева немного изменяется и теперь выглядит вот так:

Все ветви уходящие вниз уже пройдены. Тогда необходимо идти по ветви идущей вверх и пометить её как пройденную.

Среди ветвей ведущих вниз есть не пройденные, но характеристика достигла своей критической величины. Тогда необходимо идти по ветви идущей вверх и пометить её как пройденную.

Среди ветвей ведущих вниз есть не пройденные и характеристика не достигла критического значения. Найдём среди них самую левую и пойдём по ней.

Обход дерева комбинаций в соответствии с описанным выше правилом и есть метод бектрекинга (BackTracking - обратный ход). Сформулированное правило достаточно общее и под него подходит довольно много задач, но всё-таки это не самая общая формулировка. Думаю, существует много возможностей расширить правило. Например, можно положить, что характеристик несколько и они зависят друг от друга сложным образом. Можно как-то изменить понятие характеристики. Но мы сейчас заниматься этим не будем, Если есть желание попробуйте самостоятельно сформулировать более широкое правило. А мы сейчас рассмотрим пример применения Бектрекинга.

 

Условие задачи

 

Некто, назовём его покупателем, зашел в магазин имея на руках определённую сумму денег. Его цель купить как можно большее количество товара (на вес) в пределах имеющейся суммы денег. Для каждого товара задана цена и вес. Именовать товары будем для простоты номером.

Предварительные замечания.

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

Из сказанного выше следует, что задачу можно решить обычным полным перебором. Так мы и поступим, а затем в переборное решение добавим механизм бектрекинга.

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

 



2019-10-11 214 Обсуждений (0)
Важное свойство этой задачи 0.00 из 5.00 0 оценок









Обсуждение в статье: Важное свойство этой задачи

Обсуждений еще не было, будьте первым... ↓↓↓

Отправить сообщение

Популярное:
Генезис конфликтологии как науки в древней Греции: Для уяснения предыстории конфликтологии существенное значение имеет обращение к античной...
Модели организации как закрытой, открытой, частично открытой системы: Закрытая система имеет жесткие фиксированные границы, ее действия относительно независимы...



©2015-2024 megaobuchalka.ru Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. (214)

Почему 1285321 студент выбрали МегаОбучалку...

Система поиска информации

Мобильная версия сайта

Удобная навигация

Нет шокирующей рекламы



(0.009 сек.)