Главная    Почта    Новости    Каталог    Одноклассники    Погода    Работа    Игры     Рефераты     Карты
  
по Казнету new!
по каталогу
в рефератах

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

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

      Если  оно  соблюдается,  можно  предложить  несколько   алгоритмов   с
погрешностью 12. Прежде,  чем  описать  такой  алгоритм,  следует  вспомнить
старинную головоломку. Можно ли начертить  одной  линией  открытый  конверт?
Рис.2 показывает,  что  можно  (цифры  на  отрезках  показывают  порядок  их
проведения). Закрытый конверт (рис.3.) одной линией нарисовать нельзя и  вот
почему. Будем называть линии ребрами, а их перекрестья – вершинами.
      Когда через точку проводится линия, то используется два ребра  –  одно
для входа в вершину, одно – для выхода. Если степень вершины нечетна – то  в
ней линия должна начаться или кончиться. На рис. 3 вершин  нечетной  степени
две: в одной линия начинается, в  другой  –  кончается.  Однако  на  рис.  4
имеется четыре вершины степени три, но у одной линии не  может  быть  четыре
конца. Если же нужно прочертить фигуру одной замкнутой  линией,  то  все  ее
вершины должны иметь четную степень.
      Верно и обратное утверждение: если все вершины имеют  четную  степень,
то фигуру можно нарисовать одной незамкнутой линией. Действительно,  процесс
проведения линии может  кончиться,  только  если  линия  придет  в  вершину,
откуда уже выхода нет: все ребра,  присоединенные  к  этой  вершине  (обычно
говорят:  инцидентные  этой  вершине),  уже  прочерчены.   Если   при   этом
нарисована вся фигура, то нужное утверждение доказано; если нет, удалим  уже
нарисованную часть G’. После этого от графа  останется  одна  или  несколько
связных компонент; пусть G’ – одна из  таких  компонент.  В  силу  связности
исходного графа G, G’ и G’’ имеют хоть одну общую вершину, скажем,  v.  Если
в G’’ удалены какие-то  ребра,  то  по  четному  числу  от  каждой  вершины.
Поэтому G’’ – связный и все его вершины имеют четную степень. Построим  цикл
в G’’ (может быть, не нарисовав всего G’’) и через v  добавим  прорисованную
часть G’’  к  G’.  Увеличивая  таким  образом  прорисованную  часть  G’,  мы
добьемся того, что G’ охватит весь G.
      Эту задачу когда-то решил Эйлер, и замкнутую линию, которая  покрывает
все ребра графа, теперь называю эйлеровым циклом. По существу была  доказана
следующая теорема.
      Эйлеров цикл в графе существует тогда и только тогда, когда  (1)  граф
связный и (2) все его вершины имеют четные степени.

                         1.2.2. Деревянный алгоритм.

       Теперь  можно  обсудить  алгоритм   решения   ЗК   через   построение
кратчайшего остовного дерева. Для краткости  будет  называть  этот  алгоритм
деревянным.
      Вначале обсудим свойство  спрямления.  Рассмотрим  какую-нибудь  цепь,
например,  на  рис.5.  Если   справедливо   неравенство   треугольника,   то
d[1,3](d[1,2]+d[2,3]                 и                  d[3,5](d[3,4]+d[4,5]
                         Сложив     эти     два     неравенства,     получим
d[1,3]+d[3,5](d[1,2]+d[2,3]+d[3,4]+d[4,5].   По   неравенству   треугольника
получим. d[1,5](d[1,3]+d[3,5]. Окончательно
                     d[1,5]( d[1,2]+d[2,3]+d[3,4]+d[4,5]
      Итак, если справедливо неравенство треугольника, то  для  каждой  цепи
верно, что расстояние от начала до конца цепи меньше (или  равно)  суммарной
длины всех ребер цепи. Это обобщение расхожего убеждения, что прямая  короче
кривой.
      Вернемся к ЗК и опишем решающий ее деревянный алгоритм.
     1. Построим на входной сети ЗК кратчайшее остовное дерево и удвоим все
        его ребра. Получим граф G – связный и с вершинами, имеющими  только
        четные степени.
     2. Построим эйлеров  цикл  G,  начиная  с  вершины  1,  цикл  задается
        перечнем вершин.
     3. Просмотрим перечень вершин, начиная с 1, и будем зачеркивать каждую
        вершину, которая повторяет уже  встреченную  в  последовательности.
        Останется тур, который и является результатом алгоритма.
Пример 1. Дана  полная  сеть,  показанная  на  рис.5.  Найти  тур  жадным  и
деревянным алгоритмами.
|- |1 |2 |3 |4 |5 |6 |
|1 |- |6 |4 |8 |7 |14|
|2 |6 |- |7 |11|7 |10|
|3 |4 |7 |- |4 |3 |10|



      Решение. Жадный алгоритм (иди в ближайший город из города 1) дает  тур
1–(4)–3-(3)–5(5)–4–(11)–6–(10)–2–(6)–1,  где  без  скобок  показаны   номера
вершин, а в скобках – длины ребер. Длина тура  равна  39,  тур  показана  на
рис. 5.
      2. Деревянный алгоритм вначале строит остовное дерево,  показанное  на
рис. 6 штриховой линией, затем  эйлеров  цикл  1-2-1-3-4-3-5-6-5-3-1,  затем
тур 1-2-3-4-5-6-1 длиной 43, который показан сплошной линией на рис. 6.
      Теорема. Погрешность деревянного алгоритма равна 1.
      Доказательство. Возьмем минимальный тур длины  fB  и  удалим  из  него
максимальное ребро. Длина получившейся гамильтоновой цепи LHC меньше fB.  Но
эту же цепь  можно  рассматривать  как  остовное  дерево,  т.  к.  эта  цепь
достигает все вершины и не имеет циклов. Длина кратчайшего остовного  дерева
 LMT меньше или равна LHC. Имеем цепочку неравенств
|fB>LHC(LMT                                                                |(6)|


      Но удвоенное  дерево  –  оно  же  эйлеров  граф  –  мы  свели  к  туру
посредством спрямлений, следовательно, длина полученного по  алгоритму  тура
удовлетворяет неравенству
|2LMT>fA                                                                   |(7)|


      Умножая (6) на два и соединяя с (7), получаем цепочку неравенств
|2fB>2LHC(2LMT(fA                                                          |(8)|


      Т.е. 2fB>fA, т.е. fA/fB>1+(; (=1.
      Теорема доказана.
      Таким образом, мы доказали, что деревянный алгоритм  ошибается  менее,
чем в два раза. Такие алгоритмы уже называют приблизительными, а  не  просто
эвристическими.
      Известно еще несколько  простых  алгоритмов,  гарантирующих  в  худшем
случае (=1. Для того, чтобы найти среди  них  алгоритм  поточнее,  зайдем  с
другого конца и для  начала  опишем  «brute-force  enumeration»  -  «перебор
животной силой»,  как его называют в англоязычной литературе.  Понятно,  что
полный  перебор  практически  применим  только  в  задачах  малого  размера.
Напомним, что ЗК с n городами требует при полном переборе  рассмотрения  (n-
1)!/2 туров в  симметричной  задаче  и  (n-1)!  Туров  в  несимметричной,  а
факториал, как показано в следующей таблице, растет удручающе быстро:
|1 |- |0 |0 |3 |3 |6 |
|2 |0 |- |1 |4 |1 |0 |
|3 |1 |2 |- |0 |0 |3 |
|табл. 4                 |


      Изложим алгоритм Литтла на примере 1 предыдущего раздела.. Повторно
запишем матрицу:
|-|1 |2 |3 |4 |5|6 |
|1|- |6 |4 |8 |7|14|

      Нам будет удобнее трактовать Сij как стоимость проезда из города  i  в
город j. Допустим, что добрый мэр города j издал  указ  выплачивать  каждому
въехавшему в город коммивояжеру 5 долларов.  Это  означает,  что  любой  тур
подешевеет на 5 долларов, поскольку в любом туре нужно въехать  в  город  j.
Но поскольку все туры равномерно  подешевели,  то  прежний  минимальный  тур
будет  и  теперь  стоить  меньше  всех.  Добрый  же  поступок   мэра   можно
представить как уменьшение всех чисел j-го столбца матрицы С на 5.  Если  бы
мэр хотел спровадить коммивояжеров из  j-го города и  установил  награду  за
выезд в размере 10 долларов, это можно было бы  выразить  вычитанием  10  из
всех элементов j-й той строки.  Это  снова  бы  изменило  стоимость  каждого
тура, но минимальный тур остался бы минимальным.  Итак,  доказана  следующая
лемма.
      Вычитая любую константу из всех элементов  любой  строки  или  столбца
матрицы С, мы оставляем минимальный тур минимальным.
      Для алгоритма нам будет удобно получить побольше нулей  в  матрице  С,
не получая там, однако, отрицательных чисел. Для этого мы вычтем  из  каждой
строки ее минимальный элемент (это называется приведением  по  строкам,  см.
табл. 3),  а  затем  вычтем  из  каждого  столбца  матрицы,  приведенной  по
строкам, его минимальный элемент, получив матрицу, приведенную по  столбцам,
см. табл. 4).
      Прочерки по диагонали означают, что из  города  i  в  город  i  ходить
нельзя. Заметим, что сумма констант приведения по строкам  равна  27,  сумма
по столбцам 7, сумма сумм равна 34.
        Тур можно задать системой из шести подчеркнутых  (выделенных  другим
цветом) элементов матрицы С, например,  такой,  как  показано  на  табл.  2.
Подчеркивание элемента       означает, что в  туре  из  i-го  элемента  идут
именно в j-тый. Для тура из  шести  городов  подчеркнутых  элементов  должно
быть шесть, так как в  туре  из  шести  городов  есть  шесть  ребер.  Каждый
столбец должен содержать ровно один подчеркнутый элемент   (в  каждый  город
коммивояжер въехал один  раз),  в  каждой  строке  должен  быть  ровно  один
подчеркнутый элемент (из каждого города коммивояжер выехал один раз);  кроме
того, подчеркнутые элементы  должны  описывать  один  тур,  а  не  несколько
меньших циклов. Сумма чисел подчеркнутых элементов есть стоимость  тура.  На
табл. 2 стоимость  равна  36,  это  тот  минимальный  тур,  который  получен
лексикографическим перебором.
      Теперь будем рассуждать от приведенной матрицы на табл. 2. Если в  ней
удастся построить правильную систему подчеркнутых элементов,  т.е.  систему,
удовлетворяющую  трем  выше
1234
скачать работу

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

 

Отправка СМС бесплатно

На правах рекламы


ZERO.kz
 
Модератор сайта RESURS.KZ