4.3.1. Общая схема метода «ветвей и границ». Другим широко применяемым для решения задач дискретного програм­мирования методом является метод ветвей и границ . Впервые данный метод для решения ЦЗЛП предложили в 1960 г. Лэнг и Дойг, а его «второе рождение» произошло в 1963 г. в связи с выходом работы Литтла, Мурти, Суини и Кэрел, посвященной решению задачи о коммивояжере .

Вообще говоря, термин «метод ветвей и границ» является соби­рательным и включает в себе целое семейство методов, применяе­мых для решения как линейных, так и нелинейных дискретных задач, объединяемое общими принципами. Кратко изложим их.

Пусть стоит задача:

где D - конечное множество.

Алгоритм является итеративным, и на каждой итерации про­исходит работа с некоторым подмножеством множества D . На­зовем это подмножество текущим и будем обозначать его как D ( q ) , где q - индекс итерации. Перед началом первой итерации в качестве текущего множества выбирается все множество D (D (1) =D ), и для него некоторым способом вычисляется значе­ние верхней оценки для целевой функции max f(x) ≤ ξ( D (1)). Стандартная итерация алгоритма состоит из следующих этапов:

1°. Если можно указать план x (q ) ∊D (q ) , для которого f(x (q ) ) ≤ξ( D (q )), то x (q ) =х* - решение задачи (4.29).

2°. Если такой план не найден, то область определения D (q ) некоторым образом разбивается на подмножества D 1 (q ) , D 2 (q ) , ..., D lq (q ) , удовлетворяющие условиям:

Для каждого подмножества находятся оценки сверху (вер­хние границы) для целевой функции ξD 1 ( q ) , ξD 2 ( q ) , ..., ξD l 1 ( q ) , уточняющие ранее полученную оценку ξD ( q ) , то есть ξD i ( q ) ≤ ξD ( q ) , i ∊1:l q . Возможно одно из двух:

2.1. Если существует такой план х ( q ) , что

то этот план оптимальный.

2.2. Если такой план не найден, то выбирается одно из мно­жеств D i ( q ) , i ∊1:l q (как правило, имеющее наибольшую оценку

Все имеющиеся к текущему моменту концевые подмножества, т. е. те подмножества, которые еще не подверглись процессу дробления, переобозначаются как D 1 ( q +1) , D 2 ( q +1) ,..., D l ( q +1) ( q +1) , после чего процесс повторяется.

Схема дробления множества D представлена на рис. 4.3 в виде графа. Существуют и более сложные системы индексации подмножеств, при которых не требуется их переобозначение на каждом шаге.

Конкретные реализации метода ветвей и границ связаны с правилами разбиения на подмножества (правилами ветвления) и построения оценок значений целевых функций на данных под­множествах (границ).


4.3.2. Решение ЦЗЛП методом ветвей и границ. Рас­смотрим применение алгоритма метода ветвей и границ для решения ЦЗЛП (4.2)-(4.3). Как уже упоминалось, через D ( q ) обозначается подмножество множества допустимых планов за­дачи. Перед началом первой итерации (q = 1) в качестве теку­щего множества берется все множество D (D (1) = D ), после чего решается стандартная задача линейного программирования (D (1) , f ). Нетрудно заметить, что она является непрерывным аналогом

исходной задачи (4.2)-(4.3). Если найденный оптималь­ный план (1) содержит только целочисленные компоненты, то он является и оптимальным планом для (4.2)-(4.3): (1) = x* . В противном случае значение f ( (1)) становится оценкой (верх­ней границей) значения целевой функции на множестве D (1) , и мы переходим к выполнению стандартной итерации алгоритма. Опишем входящие в нее этапы.

1) Выбирается некоторая нецелочисленная компонента пла­на k ( q ) . Поскольку в оптимальном плане она должна быть це­лой, то можно наложить ограничения x k ≤ [ k ( q ) ] и x k ≥ [ k ( q ) ]+1. Таким образом, D ( q ) разбивается на подмножества

Графическая интерпретация такого разбиения множества D ( q ) приведена на рис. 4.4.

2) Решаются задачи линейного программирования

Соответствующие максимальные значения целевой функции принимаются как ее оценки на этих множествах:

Если оптимальный план для одной из решенных задач удов­летворяет условию

и содержит только целые компоненты, то, значит, найдено ре­шение основной задачи (4.2)-(4.3). В противном случае среди всех концевых подмножеств , полученных как на предыду­щих (D i ( q )), так и на текущем (D 1 ( q ) , D 2 ( q )) этапе, выбирается об­ласть с наибольшей оценкой ξ(D i ( q )). Она становится текущим рассматриваемым подмножеством (D ( q +1)). Далее производится перенумерация концевых множеств и вычислительный процесс итеративно повторяется.

При решении задач (D 1 ( q ) , f ) и (D 2 ( q ) , f ) можно воспользовать­ся результатами решения предыдущей задачи (D ( q ) , f ). Рас­смотрим вариант организации вычислительного процесса на примере задачи ( 1 ( q ) , f ) (для ( 2 ( q ) , f ) он выглядит аналогично с точностью до знаков неравенств).

Предположим, что на последнем шаге решения задачи (D ( q ) , f ) был получен оптимальный базис β. Без ограничения общности можно считать, что он состоит из первых m столбцов матрицы задачи. Данное предположение делается исключитель­но для обеспечения наглядности дальнейшего изложения и оче­видно, что его выполнения можно всегда добиться за счет про­стой перенумерации векторов а j . По аналогии с предыдущим параграфом введем обозначения для элементов матрицы задачи (D ( q ) , f ) и ее вектора ограничений относительно базиса :

Тогда система ограничений задачи (D ( q ) , f ) может быть пред­ставлена как

а получаемая на ее основе система ограничений задачи ( 1 ( q ) , f ) как

где х n +1 ≥ 0 - фиктивная переменная, которой соответствует нулевой коэффициент в целевой функции, добавляемая для пре­образования неравенства в строгое равенство.

Очевидно, что 1≤k≤m , т. к. небазисные компоненты опти­мального плана (m +1≤j≤n ) равны нулю, т. е. являются заведо­мо целочисленными. Тогда с учетом сделанных предположений о виде базиса можно записать:

Как видно из (4.39), в k -м столбце имеется всего два отлич­ных от нуля элемента: в k -й и (m +1)-й строках. Если вычесть из (m +1)-го уравнения k -e, то, учитывая, что [ά k ] – ά k =-{ά k }, по­лучим эквивалентную систему:

Проведенные преобразования системы ограничений D 1 ( q ) по­зволили явно выделить сопряженный базис, образуемый столб­цами с номерами 1,..., m , n +1, и соответствующий ему псевдо­план (ά 1 , ..., ά m , 0,...., 0, -{ά k }), т.е. для решения задачи (D 1 ( q ) , f ) может быть применен алгоритм двойственного симплекс-мето­да. Практически вычислительный процесс для данного этапа сводится к преобразованию к симплекс-таблицы, показанному на рис. 4.5.

Для случая задачи (D 2 ( q ) , f ) преобразование симплекс-табли­цы, получаемое на базе аналогичных рассуждений, приведено на рис. 4.6.

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

Подчеркнем, что приведенная реализация метода ветвей и границ является одной из многих . Помимо нее, например, очень популярна версия метода решения задачи коммивояжера, в которой для ветвления и построения оценок используют специфические свойства данной модели. При желании о ней мож­но прочесть в .

КЛЮЧЕВЫЕ ПОНЯТИЯ

Ø Ø Задачи с неделимостями.

Ø Ø Экстремальные комбинаторные задачи.

Ø Ø Задачи с разрывными целевыми функциями.

Ø Ø Правильное отсечение.

Ø Ø Метод Гомори.

Ø Ø Методы ветвей и границ.

КОНТРОЛЬНЫЕ ВОПРОСЫ

4.1. Какие основные проблемы возникают при решении дис­кретных задач?

4.2. Сформулируйте задачу о ранце.

4.3. Какие экономико-математические модели могут быть све­дены к задаче о коммивояжере?

4.4. Приведите пример моделей с разрывными целевыми функ­циями.

4.5. Какой принцип используется для построения правильно­го отсечения в методе Гомори?

4.6. Перечислите основные этапы, входящие в «большую» итерацию метода Гомори.

4.7. Какую роль играет алгоритм двойственного симплекс-ме­тода при решении целочисленной

линейной задачи мето­дом Гомори?

4.8. Перечислите принципиальные идеи, лежащие в основе ме­тодов ветвей и границ.

4.9. Как производится построение отсечения при решении це­лочисленной линейной задачи методом

ветвей и границ?

4.10. Опишите схему решения целочисленной задачи линейно­го программирования методом ветвей и

4.11. За счет каких преобразований удается построить сопря­женный базис при добавлении

отсекающего ограничения?

Рассмотрим следующую задачу целочисленного линейного программирования. Максимизировать при ограничениях

На рис.1 пространство допустимых решений задачи целочисленного линейного программирования представлено точками. Соответствующая начальная задача линейного программирования (обозначим ее ЛП0) получается путем отбрасывания условия целочисленности. Ее оптимальным решением будет =3.75, =1.25, z=23.75.

Рис.1.

Так как оптимальное решение задачи ЛП0 не удовлетворяет условия целочисленности, метод ветвей и границ изменяет пространство решений задачи линейного программирования так, что в конечном счете получается оптимальное решение задачи целочисленного линейного программирования. Для этого сначала выбирается одна из целочисленных переменных, значение которой в оптимальном решении задачи ЛП0 не является целочисленным. Например, выбирая (=3.75), замечаем, что область 3 ? ?4 пространства допустимых решений задачи ЛП0 не содержит целочисленных значений переменной и, следовательно, может быть исключена из рассмотрения, как бесперспективная. Это эквивалентно замене исходной задачи ЛП0 двумя новыми задачами линейного программирования ЛП1 и ЛП2, которые определяются следующим образом:

Пространство допустимых решений ЛП1 = пространство допустимых решений ЛП0 + (), пространство допустимых решений ЛП2 = пространство допустимых решений ЛП0 + ().

На рис.2 изображены пространства допустимы решений задач ЛП1 И ЛП2 . Оба пространства содержат все допустимые решения исходной задачи ЦЛП. Это обозначает, что задачи ЛП1 и ЛП2 «не потеряют» решения начальной задачи ЛП0.

Рис.2.

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

Новые ограничения и взаимоисключаемы, так что задачи ЛП1 и ЛП2 необходимо рассматривать как независимые задачи линейного программирования, что и показано на Рис.3. Дихотомизация задач ЛП - основа концепции ветвления в методе ветвей и границ. В этом случае называется переменной ветвления.

Рис.3.

Оптимальное решение задачи ЦЛП находятся в пространстве допустимых решений либо в ЛП1, либо в ЛП2. Следовательно, обе подзадачи должны быть решены. Выбираем сначала задачу ЛП1 (выбор произволен), имеющую дополнительное ограничение?3.

Максимизировать при ограничениях

Оптимальным решением задачи ЛП1 является, и. Оптимальное решение задачи ЛП1 удовлетворяет требованию целочисленности переменных и. В этом случае говорят что задача прозондирована. Это означает, что задача ЛП1 не должна больше зондироваться, так как она не может содержать лучшего решения задачи ЦЛП.

Мы не можем в этой ситуации оценить качество целочисленного решения, полученного из рассмотрения задачи ЛП1, ибо решение задачи ЛП2 может привести к лучшему целочисленному решению (с большим решением в целевой функции z). Пока мы можем лишь сказать, что значение является нижней границей оптимального (максимального) значения целевой функции исходной задачи ЦЛП. Это значит, что любая нерассмотренная подзадача, которая не может привести к целочисленному решению с большим значением целевой функции, должна быть исключена, как бесперспективная. Если же нерассмотренная подзадача может привести к лучшему целочисленному решению, то нижняя граница должна быть надлежащим образом изменена.

При значении нижней границы исследуем ЛП2. Так как в задачи ЛП0 оптимальное значение целевой функции равно 23.75 и вес ее коэффициенты являются целыми числами, то невозможно получить целочисленное решение задачи ЛП2, которое будет лучше имеющегося. В результате мы отбрасываем подзадачу ЛП2 и считаем ее прозондированной.

Реализация метода ветвей и границ завершена, так как обе подзадачи ЛП1 и ЛП2 прозондированы. Следовательно, мы заключаем, что оптимальным решением задачи ЦЛП является решение, соответствующей нижней границе, а именно, и.

Если бы мы выбрали в качестве ветвлении переменную то ветвления и скорость нахождения оптимального решения были бы другими Рис.4.

Рис.4. Дерево ветвлений решений

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

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

Для каждой конкретной задачи целочисленного программирования (другими словами, дискретной оптимизации) метод ветвей и границ реализуется по-своему. Есть много модификаций этого метода.

Рассмотрим реализацию метода ветвей и границ для задачи коммивояжёра и задачи о рюкзаке.

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



Пример.

Пусть в задаче коммивояжера задана следующая матрица стоимостей переездов

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

.

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

,

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

Суммируя элементы и , получим константу приведения:

.

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

.

Выбираем дугу , для которой степень нулевого элемента достигает максимального значения

Разбиваем множество всех допустимых маршрутов на два подмножества:

– подмножество, содержащее дугу ;

– подмножество, не содержащее дугу

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

Голосование: 25, 14

Что это такое?

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

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

Методы решения труднорешаемых задач

  • Метод ветвей и границ состоит в отбрасывании заведомо неоптимальных решений целыми классами в соответствии с некоторой оценкой
  • состоит в поиске более оптимального решения в окрестности некоторого текущего решения
  • Приближенные и эвристические методы состоят в применении эвристик для выбора элементов решения
  • Псевдополиномиальные алгоритмы представляют собой подкласс динамического программирования
  • Метод случайного поиска состоит в представлении выбора последовательностью случайных выборов

Оценки качества приближенных алгоритмов

Пусть мы решаем оптимизационную задачу, то есть ищем объект с наибольшей или наименьшей стоимостью среди множества объектов, на которых задана функция стоимости. Обозначим оптимальное решение как С *. А решение, которое дает нам алгоритм как С.

Мы будем говорить, что алгоритм решает задачу с ошибкой не более чем в ρ (n) раз, если

Max(C ⁄ C *, C * ⁄ C) ≤ ρ (n)

Заметим, что поскольку максимум из двух взаимно обратных величин не меньше 1, то

Иногда удобнее использовать относительную ошибку, которая определяется как | C − C *| ⁄ C *

Мы будем говорить, что алгоритм имеет ошибку не более ε (n), если

| C − C *| ⁄ C * ≤ ε (n)

Легко проверить, что ε (n) может быть ограничена сверху через функцию ρ (n), а именно ε (n) ≤ ρ (n) − 1. В самом деле для задач на минимум это неравенство превращается в равенство. Для задач на максимум ε (n) = (ρ (n) − 1) ⁄ ρ (n) (далее нужно вспомнить, что ρ (n) ≥ 1.

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

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

Схема приближения называется полиномиальной, если для любого фиксированного ε > 0 время её работы не превосходит некоторого полинома от n . Схема приближения называется полностью полиномиальной, если время её работы ограничено некоторым полиномом от n и от 1 ⁄ ε .

Задача коммивояжера — полигон для испытания оптимизационных методов

Формулировка задачи коммивояжера (1934 г.):

Коммивояжер должен выйти из первого города, посетить по разу в неизвестном порядке города 2, 3, …, n и вернуться в первый город. Расстояния между городами известны. В каком порядке следует обходить города, чтобы замкнутый путь (тур) коммивояжера был кратчайшим?

В терминах теории графов задачу можно сформулировать так: имеется полный ориентированный граф G = (V , E), каждой дуге (u , v) которого сопоставлен вес c (u , v). Требуется найти в этом графе гамильтонов контур наименьшей стоимости.

Обратим внимание на детали, которые будут очень существенными для алгоритмов решения задачи:

  1. В обеих формулировках предполагается c (u , v) ≥ 0; c (u , u) = ∞ для всех u , v ∈ V .
  2. В наивной формулировке предполагается c (u , v) = c (v , u) для всех u , v ∈ V , т. е. граф можно считать неориентированным. Такая задача называется симметричной задачей коммивояжера. Однако, в общем случае, это необязательно.
  3. В наивной формулировке предполагаем, что для всех u , v , w ∈ V с (u , v) ≤ c (u , w) + c (w , v) (неравенство треугольника), что нередко выполняется в практических задачах. Однако вообще говоря, это неверно.

Теорема

Пусть P ≠ NP , ρ ≥ 1. Тогда не существует полиномиального приближенного алгоритма, решающего общую (более того, симметричную) задачу коммивояжера с ошибкой не более чем в ρ раз.

Доказательство. Для доказательства заметим, что взяв произвольный граф G = (V , E) и сопоставив ему полный граф G ′ с функцией стоимости c (u , v) = 1, если (u , v) ∈ E и ρ | V | + 1 иначе. Убедимся, что наш полиномиальный алгоритм будет определять, есть ли в графе G гамильтонов цикл, что невозможно.

Метод ветвей и границ ("поиск с возвратом", "backtracking")

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

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

Рассмотрим дискретную экстремальную (для определенности — на минимум) задачу в общем виде:

Пусть задано дискретное множество A и определенная на нем функция f . Обозначим минимум функции f на X как F (X).

Требуется найти x 0 ∈ A: f (x 0) = F (A)

Замечание 1

Пусть A = A 0 ∪ A 1 ∪ … ∪ A k , A i ∩ A j = Ø, i ≠ j . Причем F (A) < F (A 0), т. е. на A 0 минимум не достигается.

Тогда справедливо следующее: F (A) = min { F (A i) | i ∈ 1: k }

Замечание 2

Пусть Φ — функция, заданная на совокупности подмножеств множества A так, что Φ (X) ≤ F (X) ∀ X ⊂ A

Пусть x * — произвольный элемент A и пусть f * = f (x *).

Тогда справедливо следующее: F (A) = min { f *, min { F (A i) | i ∈ 1: k , Φ (A i) ≤ f *} }

Эти два соображения позволяют предложить следующую технологию поиска минимума. Разобьем множество A на какие-либо подмножества A i и на каждом из них найдем нижнюю оценку Φ . Для элементов множества A будем вычислять значения функции f и запоминать наименьшее в качестве рекордного значения. Все подмножества, у которых оценка выше рекордного значения функции (f *), объединим в подмножество A 0 , чтобы в дальнейшем не рассматривать.

Теперь выберем какое-либо из множеств A i , i > 0. Разобьем это множество на несколько более мелких подмножеств. При этом мы будем продолжать улучшать рекордное значение f *. Этот процесс продолжается до тех пор, пока не будут просмотрены все множества A i , i > 0.

Более наглядно метод ветвей и границ (поиск с возвратом) можно объяснить с помощью дерева возможностей. Узлы такого дерева можно рассматривать как совокупности конфигураций (подмножества A i множества A), а каждый потомок некоторого узла представляет подмножество этой совокупности. Наконец, каждый лист представляет собой отдельную конфигурацию.

Пример 1. Задача коммивояжера (алгоритм Литтла)

Рассмотрим работу этого алгоритма на конкретном примере.

Пусть имеется граф, заданный матрицей смежности:

6 4 8 7 14
6 7 11 7 10
4 7 4 3 10
8 11 4 5 11
7 7 3 5 7
14 10 10 11 7

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

Приведем исходную матрицу по строкам

Исходная

6 4 8 7 14
6 7 11 7 10
4 7 4 3 10
8 11 4 5 11
7 7 3 5 7
14 10 10 11 7

Приведенная по строкам

2 0 4 3 10 |4
0 1 5 1 4 |6
1 4 1 0 7 |3
4 7 0 1 7 |4
4 4 0 2 4 |3
7 3 3 4 0 |7

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

(Отметим, что сумма констант приведения есть 4 + 6 + 3 + 4 + 3 + 7 = 27)

А затем по столбцам:

0 0 3 3 6
0 1 4 1 0
1 2 0 0 3
4 5 0 1 3
4 2 0 1 0
7 1 3 3 0
0 2 0 1 0 4

(Отметим, что сумма констант приведения здесь есть 0 + 2 + 0 + 1 + 0 + 4 = 7, а всех констант: 27 + 7 = 34)

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

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

Назовем оценкой нуля в позиции (i , j) в матрице сумму минимальных элементов в i -й строке и j -м столбце (не считая сам этот ноль). Оценим теперь каждый ноль в приведенной матрице:

1 2 3 4 5 6
1 0 1 0 3 3 6
2 0 1 1 4 1 0
3 1 2 0 1 0 3
4 4 5 0 1 1 3
5 4 2 0 1 0
6 7 1 3 3 0 1

Оценки, равные нулю, не указаны. Оценка k нуля, в позиции (i , j) означает буквально следующее: если в тур не будет включен путь из i в j (стоимостью 0), то придется доплатить как минимум k. Поэтому, можно разделить класс всех возможных туров на два: туры, содержащие ребро (i , j) и туры, не содержащие его. Для последних минимальная оценка увеличится на k .

Рассмотрим ребро, соответствующее нулю с максимальной оценкой. В данном случае это ребро (1, 2). Таким образом, как только что было замечено, класс всех туров разбивается на два: содержащих ребро (1, 2) и не содержащих его. Нижняя оценка стоимости второго класса туров увеличивается до 35. Чтобы определить оценку для первого класса туров удалим из матрицы строку 1 и столбец 2 (Обозначим ее как C [(1,2)]):

Т. к. матрицу удалось привести на 1 (по 1-му столбцу), то оценка класса туров с ребром (1, 2) увеличивается на 1 и становится равной 35.

Разбиение на классы и сами оценки можно представить в виде дерева:

Таким образом, класс (ВСЕ) был разбит на два и были вычислены соответствующие оценки.

Выберем теперь класс с наименьшей оценкой и повторим этот процесс для него. Затем из двух полученных классов выберем тот, у которого оценка минимальна и разобьем его. Так будем повторять до тех пор, пока не достигнем листа дерева. Т. е. пока не получим матрицу 0×0:

C [(1, 2); [−](a 1 , b 1); [−](a 2 , b 2); … [−](a k , b k)]

Где (каждое) −(x , y) означает, что матрица соответствует классу, не содержащему ребро (x , y) Удалив из обозначения матрицы элементы вида −(x , y), получим следующее:

(c 0 , d 0); (c 1 , d 1); … (c n , d n)

Вершина (5, 4) дерева будет соответствовать классу, содержащему ребра: (1, 2); (3, 1); (6, 5); (2, 6); (4, 3); (5, 4). Этот класс, очевидно, состоит из одного полного тура (1, 2, 6, 5, 4, 3, 1) со стоимостью = 36 (для полного тура его минимальная оценка равна точной стоимости)


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


Матрица, соответствующая классу туров, не содержащих ребро (1, 2), приведенная по второму столбцу, будет выглядеть так:

1 2 3 4 5 6
1 0 3 3 3 6
2 0 1 1 4 1 0
3 1 1 0 1 0 3
4 4 4 0 1 1 3
5 4 1 0 1 0
6 7 0 1 3 3 0

Она была получена из матрицы, соответствующей классу всех туров путем установки прочерка (обозначающего бесконечную стоимость перелета) вместо элемента (1, 2). Т.е. с 1,2 = ∞. Обозначим ее как C [−(1,2)]

Т. к. максимальная оценка нуля 3 (элемент 1,3) получаем, что оценка для ветви −(1,3) равна 38.

Вычеркивая первую строку и первый столбец, получим матрицу, приводимую на 1 по четвертой строке. То есть оценка ветви −(1,2)(1,3) становится равной 36. Дальнейшее ветвление будем продолжать уже с учетом найденного рекордного значения (36):

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

Удовлетворительных теоретических оценок алгоритма Литтла и ему подобных нет, но практика показывает, что на современных машинах они позволяют решать задачу коммивояжера с количеством вершин ≈ 100. Кроме того, алгоритмы типа ветвей и границ являются эффективными эвристическими процедурами. Если нет возможности доводить их до конца.

Пример 2. Задача о размыкании контуров

Тот же подход можно применить к задаче о размыкании контуров. Постановка задачи:

Пусть задан граф G = (V , E), каждой дуге (u , v) которого сопоставлено положительное число c (u , v) — вес этой дуги.

Требуется найти E 0 ⊂ E так, чтобы граф (V , E 0) не имел контуров и сумма весов дуг (из E 0) была максимальной.

Рассмотрим вспомогательную задачу (обозначим ее (E , E *)) аналогичную только что сформулированной, но с дополнительным параметром — множеством E * ⊂ E из которого дуги удалять нельзя (при этом будем требовать, чтобы в графе (V , E *) не было контуров).

Если имеется задача (E , E *) то возможно все множество ее решений разбить на два класса следующим образом.

Рассмотрим дугу (u , v) ∈ E \ E * такую, что в графе (V , E * ∪ (u , v)) нет контуров.

Тогда множество решений задачи можно разбить на два:

  1. множество решений задачи (E \ (u , v), E *)
  2. множество решений задачи (E , E* ∪ (u , v))

Исходная задача о размыкании контуров, очевидно, является задачей (E , Ø).

Введем теперь функцию est(E , E 0) следующим образом:

  1. если граф (V , E) не содержит циклов, то est(E , E 0) = 0
  2. иначе, пусть E cyc — цикл, тогда: est(E , E 0) = est(E \ E cyc , E 0) + c cyc , где c cyc = min{ c (u , v) | (u , v) ∈ E cyc \ E 0 } (т. е. мин. вес, которым можно разомкнуть этот цикл)

Несложно показать, что

V (E , E 0) ≥ est(E , E 0),

где v (E , E 0) — минимум суммы весов дуг, удаление которых из E \ E 0 размыкает все контуры графа.

Метод локальных улучшений ("локальный поиск")

Идея этого метода заключается в том, что для каждого решения экстремальной задачи x ∈ X определяется окрестность близких решений A (x) и на каждой итерации вычислительного процесса при заданном текущем решении x делается попытка найти в его окрестности решение, которое имело бы лучшее значение целевой функции. Если такое решение удается найти, оно само становится текущим решением, если нет — поиск заканчивается.

Более конкретно стратегия локального поиска такова:

  • Начните с произвольного решения
  • Для улучшения текущего решения примените к нему какое-либо преобразование из заданной совокупности преобразований. Это улучшенное решение становится текущим решением
  • Повторяйте указанную процедуру до тех пор, пока ни одно из преобразований в заданной совокупности не позволит улучшить текущее решение

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

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


Рассмотрим точный алгоритм нахождения минимального остовного дерева в графе с помощью метода локального поиска. Локальные преобразования будут таковы: мы берем то или иное ребро, не относящееся к текущему остовному дереву и добавляем его к дереву (получая цикл), а затем убираем из этого цикла одно ребро (с наивысшей стоимостью). Это продолжается, пока все ребра вне дерева не будут иметь наивысшую стоимость среди всех ребер в цикле, который образуется при добавлении его к дереву (одна эта проверка требует времени O (| V || E |)). Этот алгоритм работает медленнее, чем алгоритмы Прима и Крускала, и служит примером нерационального использования локального поиска для не NP-полных задач.


Пример 2. Задача коммивояжера ("двойной выбор")

Простейшее преобразование, которым можно воспользоваться в симметричной задаче коммивояжера, является так называемый "двойной выбор" . Он заключается в том, что мы выбираем любые два ребра (например (a , b) и (c , d)), удаляем их и "перекоммутируем" соединявшиеся ими точки так, чтобы образовался новый маршрут. Если сумма стоимостей двух новых ребер оказалась меньше, чем двух старых, то мы нашли улучшенный маршрут.

Рассмотрим тот же граф, для которого мы строили остовное дерево. Выберем в качестве начального маршрута (a , b , c , d , e) и применим к нему "двойной выбор". Легко убедиться, что на рисунке "в" нельзя удалить ни одну пару ребер, выгодно заменив её другой.


Двойной выбор можно обобщить на k -выбор. В этом случае мы удаляем до k ребер и "перекоммутируем" оставшиеся элементы в любом порядке, пытаясь получить маршрут. Мы, вообще говоря, не требуем, чтобы удаляемые ребра были несмежными.

Легко убедиться в том, что количество различных преобразований, которые нужно рассмотреть при k -выборе равно O (| V | k). Однако время, требуемое для получения какого-либо оптимального маршрута, может оказаться значительно больше.

На практике очень эффективным является "выбор с переменной глубиной". Он с большой вероятностью обеспечивает получение оптимального маршрута для | V | = 40 − 100.

Пример 3. Задача размещения блоков

Формулировка задачи одномерного размещения блоков: требуется упорядочить вершины неориентированного графа G = (V , E) с весами на ребрах c (u , v), пронумеровав их числами 1 … n так, чтобы минимизировать ∑ i , j = 1… n | i − j | c (v i , v j); n = | V |.

Вершины графа обычно называют "блоками", а веса интерпретируют как количество "проводов" между блоками. Тогда суть задачи становится понятна: требуется расположить элементы на прямой так, чтобы длина проводов, требуемая для их соединения была минимальной.

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

Для нахождения локально-оптимальных решений задачи размещения блоков можно использовать такие локальные преобразования:

  1. Произвести взаимную перестановку смежных блоков v i и v i +1 , если результирующий порядок имеет меньшую стоимость. Пусть

    L (j) = ∑ k =1… j −1 c (v k , v j);
    R (j) = ∑ k = j +1… n c (v k , v j).

    Улучшение можно выполнить, если

    L (i) − R (i) + R (i +1) − L (i +1) + 2 c (v i , v i +1) < 0

  2. Взять блок v i и вставить его между некоторыми блоками v i и v i +1 при некоторых значениях i и j .
  3. Выполнить взаимную перестановку двух блоков v i и v j .

Как и в задаче коммивояжера мы не в состоянии точно оценить время, необходимое для нахождения локального оптимума. Можно показать, что, если ограничиться преобразованием (1 ), времени O (| V |) будет достаточно, чтобы проверить, является ли выполняемое преобразование улучшающим, и вычислять L (i) и R (i). Для преобразований (2 ) и (3 ) это время увеличивается до O (| V | 2). Но это не есть оценка времени нахождения локального оптимума, так как каждое улучшение может создавать возможности для новых улучшений.

Приближенные и эвристические методы

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

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

Пример 1. Задача коммивояжера (деревянный алгоритм)

Рассмотрим три эвристических алгоритма, решающих симметричную задачу коммивояжера с неравенством треугольника с ошибкой не более чем в два раза (ρ = 2).

Первый из них, так называемый деревянный алгоритм, состоит в следующем: построим для нашего графа минимальное покрывающее дерево с помощью алгоритма Прима, а затем совершим обход дерева в порядке root-left-right , удаляя повторяющиеся вершины.

Время работы этого алгоритма равно Θ(E) = Θ(V 2).

Пример 1. Задача коммивояжера (жадный алгоритм и алгоритм Карга-Томпсона)

Самый очевидный алгоритм решения задачи коммивояжера — жадный: из текущего города иди в ближайший из тех, куда ещё не ходил. Если выполняется неравенство треугольника, нетрудно доказать, что этот алгоритм ошибается не более, чем в два раза. Трудоемкость этого алгоритма O (V 2).

Алгоритм Карга-Томпсона (эвристика ближайшей точки) чуть менее очевиден: сначала возьмем две ближайшие вершины (вырожденный тур), затем в цикле по всем ребрам уже построенного тура для каждого ребра (u , v) выберем из свободных вершин такую w , чтобы c (u , w) + c (w , v) − c (u , v) было минимальным и включим w в тур между u и v . Для этого способа также ρ = 2, однако его трудоемкость составляет уже O (V 3).


Пример 2. Задача о вершинном покрытии

Напомним, что вершинным покрытием неориентированного графа G =(V , E) мы называем некоторое семейство его вершин V ′ с таким свойством: для всякого ребра (u , v) графа G хотя бы один из его концов u или v содержится в V ′. Размером вершинного покрытия считаем количество входящих в него вершин.

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

Пусть С — это уже построенная часть вершинного покрытия, а E ′ содержит непокрытые ребра графа. На каждом шаге мы берем ребро из E ′ и добавляем его концы u и v в C , а из E ′ изымаем все ребра имеющие своим концом u или v . И так пока множество E ′ не станет пустым. Время работы этого алгоритма есть O (E).

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

Дано конечно множество X и семейство его подмножеств F . При этом:

X =∪ S ∈ F S

Мы ищем минимальное число подмножеств из F , которые вместе покрывают множество X , т. е. семейство С наименьшей мощности, для которого:

X =∪ S ∈ C S

Такое семейство С будем называть покрытием множества X . Например, на рисунке черные кружки — элементы множества X , контуры — подмножества из F . Три светлых сплошных контура составляют минимальное покрытие, жадный алгоритм дает покрытие мощностью на единицу больше (включает ещё и пунктирный контур).

Мы будем решать задачу с помощью жадного приближенного алгоритма. Пусть множество U содержит ещё не покрытые элементы, а семейство C — уже включенные в покрытие подмножества. На каждом шаге производится жадный выбор: в качестве S берется множество, покрывающее наибольшее число ещё не покрытых элементов.

Так происходит, пока U не пусто. Трудоемкость алгоритма составляет O (| X |·| F |·min(| X |,| F |)).

Размер покрытия, даваемого этим алгоритмом, превосходит минимально возможный не более чем в H (max{| S |: S ∈ F }) раз (где H (d) — сумма первых d членов гармонического ряда) или, что тоже самое, в (ln| X | + 1) раз.

Псевдополиномиальные алгоритмы

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

Пример 1. Задача о суммах подмножеств ("табличный" алгоритм)

Пусть задана пара (S , t), где S = { x 1 , x 2 , …, x n } представляет собой множество положительных целых чисел, а t — положительное целое число. Требуется отыскать среди подмножеств множества S , сумма которых не превосходит t , такое, у которого сумма ближе всего к t .

Пусть | S | = n . Обозначим (k , w) — задачу, в которой имеется k первых чисел из S и нужно набрать сумму w . Таким образом исходная задача — это задача (n , t).

Для решения задачи построим таблицу T [ n , t + 1], в клетку T [ i , j ] которой будем записывать оптимальное решение задачи (i , j).

Первый столбец заполним нулями. Первую строку заполним сначала нулями, а начиная с клетки (1, x 1) — числами x 1 . Клетку T [ i , j ] (i , j > 1) будем заполнять по правилу:

  1. Если j − x i > 0, то y:= T [ i − 1, j − x i ], иначе y:= 0;
  2. T [ i , j ] := max(T [ i − 1, j ], y + x i)
0 1 2 3 4 5 6 7 8 9 10 11 12 13
3 0 0 0 3 3 3 3 3 3 3 3 3 3 3
5 0 0 0 3 3 5 5 5 8 8 8 8 8 8
7 0 0 0 3 3 5 5 7 8 8 10 10 12 12
9 0 0 0 3 3 5 5 7 8 9 10 10 12 12
11 0 0 0 3 3 5 5 7 8 9 10 11 12 12

S = {3, 5, 7, 9, 11} t = 13;

Таблица примет такой вид. Ответ: нет подмножества весом 13, ближе всего снизу 12.

Условие (2) говорит о том, что оптимальная сумма может достигаться либо без использования x i (T [ i − 1, j ]), либо если x i входит в сумму (y + x i). В этом случае его надо прибавить к решению задачи (i − 1, j − x i), что и сохраняется в переменной y в условии (1). Из получившейся таблицы можно узнать и состав оптимальной суммы.

Трудоемкость этого алгоритма составляет O (n t) операций. Таким образом, если t будет велико, можно будет все числа поделить, к примеру, на 10, округлить и получить приближенный алгоритм.

Пример 2. Задача о суммах подмножеств ("списковый" алгоритм)

Пусть L — набор чисел, а x — некоторое число, тогда через L + x обозначим набор чисел, который получится, если ко всем элементам L прибавить x . В этом алгоритме также используется тот факт, что x i может как входить в сумму, так и не входить, то есть:

L i = L i −1 ∪ (L i −1 + x i)

Выкидывая из списка элементы, большие t получим L n — упорядоченный список всех возможных удовлетворяющих нас сумм подмножеств S . Остается взять максимальный (последний) элемент, чтобы получить решение задачи. Список L n может содержать до 2 n элементов (т. е. алгоритм экспоненциален), однако, т.к. все элементы различны, их не может быть более t . Налицо псевдополиномиальность.

Схемы приближения

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

Мы рассмотрим две схемы приближения для задачи о сумме подмножеств. Одна из них получается из "спискового" алгоритма, а другая называется алгоритмом Джонсона.

Пример 1. Задача о суммах подмножеств (полностью полиномиальная схема приближения)

Такая схема получается из "спискового" алгоритма, если хранить список L в сокращенной форме. Список L ′ называется δ -сокращением списка L , если L ′ является частью L и

∀ y ∈ L ∃ z ∈ L ′: z ≤ y , (y − z) ⁄ y ≤ δ

Например для δ = 0,1 и L = <10, 11, 12, 15, 20, 21, 22, 23, 24, 29> список L ′ = <10, 12, 15, 20, 23, 29> является δ -сокращением. Сокращение упорядоченного списка из m элементов требует Θ (m) операций. Таким образом, можно доказать, что "списковый" алгоритм, хранящий вместо полного списка сокращенный является полностью полиномиальной схемой приближения.

Пример 2. Задача о суммах подмножеств (алгоритм Джонсона)

Алгоритм, кроме множества S и числа t принимает на вход целочисленный параметр m > 2. Назовем i -е число большим, если x i > t ⁄(m +1). Описание алгоритма:

  1. Перебрать все подмножества из больших чисел и найти множество больших чисел с суммой t ′: t ′ < t , Δ = t − t ′ min
  2. Если Δ = 0, алгоритм закончен.
  3. Перебрать все малые числа в порядке убывания. Если очередное x i ≤ Δ , то t ′:= t ′ + x i , Δ := Δ − x i ;
  4. Когда перебор по малым числам закончен, выдать t ′ в качестве ответа.

Пусть k — количество больших чисел. Тогда можно доказать, что количество подходящих нам подмножеств из больших чисел составляет O (k m) ≤ O (n m). Таким образом, перебор имеет полиномиальную, возрастающую с m сложность. Корме того, можно показать, что:

T ′⁄ t ≥ 1 − 1 ⁄ (m + 1) 1 − 1 ⁄ (m + 1) ≤ t ′⁄ t* ≤ 1

то есть относительная погрешность ε = 1⁄ (m +1). Таким образом, эта схема приближения является полиномиальной, но не является полностью полиномиальной.

Метод случайного поиска

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

Очень бы хотелось побольше информации про метод случайного поиска и увидеть конкретный пример решения какой-либо задачи данным методом..........

Пожалуйста. На запрос "метод случайного поиска" поисковик Google анонсирует более 300000 ссылок. Этой информации должно хватить..........

Благодарю за статью, разобрался с алгоритмом Литтла. Хотел запомнить сайт и был удивлен, увидев домен родного университета:)

Про запрет переходов выше замечено верно - хотелось бы видеть здесь пояснения.

Спасибо за понятное разъяснение алгоритма Литтла. Но не учтена важная деталь: при выборе следующего ребра нужно учитывать, чтобы путь из набора ребер последовательно охватывал все точки. Так как ребра добавляем в случайном порядке, то приходится отслеживать наличие микроциклов (например выбрали ребро 1,0 - значит 0, 1 уже нельзя выбирать, или выбрали 0,1 и 1,2 - тогда нельзя выбирать 2,0 и 2,1 и т.д.), что отследить не так уж и просто. Я реализовал алгоритм на C#, циклы отслеживал с помощью специального класса, который содержал набор микроциклов и вычеркивал запрещенные ребра при добавлении в него новых и ребер и восстанавливал ребра при удалении ребер.

Реализация алгоритма оказалась очень сложна на практике, а его отладка просто ад. Код занял 512 строк. 20 точек обрабатывает за 0.1 - 10 секунд - длительность сильно зависит от входного набора. Большее количество уже за адекватное время не решает. Простейший переборщик у меня находит решение для 13 вершин за 1 секунду.

Если нужна реализация алгоритма на C# - пишите на почту [email protected].

Решение задачи коммивояжера методом ветвей и границ (алгоритм Литтла)

http://igorvn.ucoz.ru/load/kursovye/kommivojazher/2-1-0-15

Метод Литла работает только на небольшом количестве точек поэтому во всех примерах их не более 10 Начиная 15 точек он дает приближенный результат 1-2 % больше минимального и это заложено в порядке определения каждого хода (редукции) непонятно на каком основании это делается.Ведь формально мы получаем другую матрицу.

Высылаю вам "Русский метод" для подтверждения моего комментария.

Благодарим. Не сомневаемся в Вашей добросовестности и компетентности. Но файлы *.doc мы не размещаем. Если выложите его содержимое в общедоступное место со статусом постоянного хранения и включите ссылку в текст своего нового комментария, опубликуем для всеобщего обозрения.

Всем, кто хочет узнать про все теоретические ошибки метода Литтла, прошу сначала объяснить себе, что такое редукция и на каком это математическом основании оно проводится. Кроме того, Русский метод, разработанный мной, могу выслать совершенно бесплатно. Мой email: [email protected]

Одна из самых известных и важных задач транспортной логистики (и класса задач оптимизации в целом) – задача коммивояжера (англ. «Travelling salesman problem», TSP ). Также встречается название «задача о бродячем торговце ». Суть задачи сводится к поиску оптимального, то есть кратчайшего пути проходящего через некие пункты по одному разу. Например, задача коммивояжера может применяться для нахождения самого выгодного маршрута, позволяющего объехать определенные города со своим товаром по одному разу и вернуться в исходную точку. Мерой выгодности маршрута будет минимальное время, проведенное в пути, минимальные расходы на дорогу или, в простейшем случае, минимальная длина пути.

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

Общий план решения задачи коммивояжера

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

  1. Построение матрицы с исходными данными.
  2. Нахождение минимума по строкам.
  3. Редукция строк.
  4. Нахождение минимума по столбцам.
  5. Редукция столбцов.
  6. Вычисление оценок нулевых клеток.
  7. Редукция матрицы.
  8. Если полный путь еще не найден, переходим к пункту 2, если найден к пункту 9.
  9. Вычисление итоговой длины пути и построение маршрута.

Более подробно эти этапы решения задачи о бродячем торговце раскрыты ниже.

Подробная методика решения задачи коммивояжера

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

Итак, методика решения задачи коммивояжера:

1. Построение матрицы с исходными данными

Сначала необходимо длины дорог соединяющих города представить в виде следующей таблицы:

В нашем примере у нас 4 города и в таблице указано расстояние от каждого города к 3-м другим, в зависимости от направления движения (т.к. некоторые ж/д пути могут быть с односторонним движением и т.д.).

Расстояние от города к этому же городу обозначено буквой M. Также используется знак бесконечности. Это сделано для того, чтобы данный отрезок путь был условно принят за бесконечно длинный. Тогда не будет смысла выбрать движение от 1-ого города к 1-му, от 2-ого ко 2-му, и т.п. в качестве отрезка маршрута.

2. Нахождение минимума по строкам

Находим минимальное значение в каждой строке (di ) и выписываем его в отдельный столбец.

3. Редукция строк

Производим редукцию строк – из каждого элемента в строке вычитаем соответствующее значение найденного минимума (di).

В итоге в каждой строке будет хотя бы одна нулевая клетка .

4. Нахождение минимума по столбцам

5. Редукция столбцов

Вычитаем из каждого элемента матрицы соответствующее ему dj.

В итоге в каждом столбце будет хотя бы одна нулевая клетка .

6. Вычисление оценок нулевых клеток

Для каждой нулевой клетки получившейся преобразованной матрицы находим «оценку ». Ею будет сумма минимального элемента по строке и минимального элемента по столбцу, в которых размещена данная нулевая клетка. Сама она при этом не учитывается. Найденные ранее di и dj не учитываются. Полученную оценку записываем рядом с нулем, в скобках.

И так по всем нулевым клеткам:

7. Редукция матрицы

Выбираем нулевую клетку с наибольшей оценкой. Заменяем ее на «М ». Мы нашли один из отрезков пути. Выписываем его (от какого города к какому движемся, в нашем примере от 4-ого к 2-му).

Ту строку и тот столбец, где образовалось две «М» полностью вычеркиваем. В клетку, соответствующую обратному пути , ставим еще одну букву «М» (т.к. мы уже не будем возвращаться обратно).

8. Если полный путь еще не найден, переходим к пункту 2, если найден к пункту 9

Если мы еще не нашли все отрезки пути, то возвращаемся ко 2 -му пункту и вновь ищем минимумы по строкам и столбцам, проводим их редукцию, считаем оценки нулевых клеток и т.д.

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

9. Вычисление итоговой длины пути и построение маршрута

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

В нашем примере маршрут получился следующий: 4 2 3 1 4 .

Общая длина пути: L = 30 .

Практическое применение задачи коммивояжера

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

Решение задачи коммивояжера онлайн

Галяутдинов Р.Р.


© Копирование материала допустимо только при указании прямой гиперссылки на