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

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

описанным  требованиям,  и  этими   подчеркнутыми
элементами будут только нули, то ясно,  что  для  этой  матрицы  мы  получим
минимальный тур. Но он же  будет  минимальным  и  для  исходной  матрицы  С,
только для того, чтобы  получить  правильную  стоимость  тура,  нужно  будет
обратно прибавить все константы приведения, и стоимость тура изменится  с  0
до 34. Таким образом, минимальный тур не может быть меньше 34.  Мы  получили
оценку снизу для всех туров.
      Теперь приступим к ветвлению. Для этого проделаем  шаг  оценки  нулей.
Рассмотрим нуль в клетке (1,2) приведенной матрицы. Он  означает,  что  цена
перехода из города 1 в город 2 равна 0. А если мы не пойдем из  города  1  в
город 2? Тогда все равно нужно въехать в  город  2  за  цены,  указанные  во
втором столбце; дешевле всего за 1 (из города  6).  Далее,  все  равно  надо
будет выехать из города 1 за цену, указанную в первой строке; дешевле  всего
в город 3 за 0. Суммируя эти два минимума, имеем 1+0=1: если  не  ехать  «по
нулю» из города 1 в город 2, то надо заплатить  не  меньше  1.  Это  и  есть
оценка нуля. Оценки всех нулей поставлены на табл.  5  правее  и  выше  нуля
(оценки нуля, равные нулю, не ставились).
      Выберем максимальную из этих оценок (в примере есть несколько  оценок,
равных единице, выберем первую из них, в клетке (1,2)).
      Итак, выбрано нулевое ребро (1,2). Разобьем все туры на два  класса  –
включающие ребро (1,2) и не включающие ребро (1,2). Про второй  класс  можно
сказать, что придется приплатить еще 1, так что туры этого класса  стоят  35
или больше.
      Что касается первого класса, то в  нем  надо  рассмотреть  матрицу  на
табл. 6 с вычеркнутой первой строкой и вторым столбцом.
| |1|2|3|4|5|6|
|1|-|0|0|3|3|6|
| | |1| | | | |
|2|0|-|1|4|1|0|
| |1| | | | | |
|3|1|2|-|0|0|3|
| | | | |1| | |
| |1|3|4|5|6|
|2|0|1|4|1|0|
| |1| | | | |
|3|1|-|0|0|3|
| | | |1| | |
|4|4|0|-|1|3|
| | |1| | | |
|5|4|0|1|-|0|
|6|7|3|3|0|-|
| | | | |1| |
|табл. 6         |
| |1|3|4|5|6|
|2|0|1|4|1|0|
| |1| | | | |
|3|0|-|0|0|3|
| |3| |1| | |
|4|3|0|-|1|3|
| | |1| | | |
|5|3|0|1|-|0|
|6|6|3|3|0|-|
| | | | |1| |
|табл. 7         |
| |3|4|5|6|
|2|1|4|1|0|
|4|0|-|1|3|
| |1| | | |
|5|0|1|-|0|
|6|3|3|0|-|
| | | |1| |
|табл. 8       |



      Дополнительно в уменьшенной матрице поставлен запрет в  клетке  (2,1),
т. к. выбрано  ребро  (1,2)  и  замыкать  преждевременно  тур  ребром  (2,1)
нельзя. Уменьшенную матрицу можно привести на 1 по первому столбцу, так  что
каждый тур, ей отвечающий, стоит не меньше 35. Результат наших  ветвлений  и
получения оценок показан на рис.6.
Кружки представляют классы: верхний кружок – класс всех туров; нижний  левый
– класс всех туров, включающих ребро  (1,2);  нижний  правый  –  класс  всех
туров, не включающих ребро (1,2). Числа над кружками – оценки снизу.
      Продолжим ветвление в положительную сторону: влево - вниз.  Для  этого
оценим нули в уменьшенной матрице C[1,2] на табл. 7. Максимальная  оценка  в
клетке (3,1) равна 3. Таким образом, оценка для  правой  нижней  вершины  на
рис. 7 есть 35+3=38. Для  оценки  левой  нижней  вершины  на  рис.  7  нужно
вычеркнуть из матрицы C[1,2] еще строку  3  и  столбец  1,  получив  матрицу
C[(1,2),(3,1)] на табл. 8. В эту матрицу нужно  поставить  запрет  в  клетку
(2,3), так как уже построен фрагмент тура  из  ребер  (1,2)  и  (3,1),  т.е.
[3,1,2], и нужно запретить  преждевременное  замыкание  (2,3).  Эта  матрица
приводится  по  столбцу  на  1  (табл.  9),  таким   образом,   каждый   тур
соответствующего класса (т.е. тур, содержащий ребра (1,2) и (3,1)) стоит  36
и более.
|  |3 |4 |5 |6 |
|2 |1 |3 |1 |0 |
|4 |01|- |1 |3 |
|5 |0 |02|- |0 |
|6 |3 |2 |03|- |
|табл. 9          |
| |3|4|6|
|2|1|3|0|
| | | |3|
|4|0|-|3|
| |3| | |
|5|0|0|0|
| | |3| |
|табл. 10  |
|  |3 |4 |
|4 |0 |- |
|5 |0 |0 |
|табл. 11  |


Оцениваем  теперь  нули  в  приведенной  матрице   C[(1,2),(3,1)]   нуль   с
максимальной оценкой 3  находится  в  клетке  (6,5).  Отрицательный  вариант
имеет оценку 38+3=41. Для получения оценки положительного  варианта  убираем
строчку 6 и столбец 5, ставим запрет в  клетку  (5,6),  см.  табл.  10.  Эта
матрица  неприводима.  Следовательно,  оценка  положительного  варианта   не
увеличивается (рис.8).
      Оценивая нули в матрице на табл.  10,  получаем  ветвление  по  выбору
ребра (2,6), отрицательный вариант получает оценку 36+3=39, а для  получения
оценки положительного варианта вычеркиваем вторую строку и  шестой  столбец,
получая матрицу на табл. 11.
      В матрицу надо добавить  запрет  в  клетку  (5,3),  ибо  уже  построен
фрагмент тура [3,1,2,6,5] и надо запретить  преждевременный  возврат  (5,3).
Теперь, когда осталась матрица 2х2 с  запретами  по  диагонали,  достраиваем
тур ребрами (4,3) и (5,4). Мы не зря ветвились, по положительным  вариантам.
Сейчас получен тур: 1>2>6>5>4>3>1 стоимостью в 36. При  достижении  низа  по
дереву  перебора  класс  туров  сузился  до  одного  тура,  а  оценка  снизу
превратилась в точную стоимость.
      Итак, все классы, имеющие оценку 36 и выше, лучшего тура не  содержат.
Поэтому соответствующие вершины вычеркиваются. Вычеркиваются также  вершины,
оба потомка которой вычеркнуты. Мы  колоссально  сократили  полный  перебор.
Осталось проверить, не  содержит  ли  лучшего  тура  класс,  соответствующий
матрице С[Not(1,2)], т.е. приведенной матрице С с  запретом  в  клетке  1,2,
приведенной на 1 по столбцу (что дало оценку 34+1=35). Оценка нулей  дает  3
для нуля в  клетке  (1,3),  так  что  оценка  отрицательного  варианта  35+3
превосходит стоимость  уже  полученного  тура  36  и  отрицательный  вариант
отсекается.
      Для получения оценки  положительного  варианта  исключаем  из  матрицы
первую строку и третий столбец, ставим запрет (3,1) и получаем матрицу.  Эта
матрица приводится по четвертой строке на 1, оценка класса  достигает  36  и
кружок зачеркивается. Поскольку у  вершины  «все»  убиты  оба  потомка,  она
убивается тоже. Вершин не осталось, перебор  окончен.  Мы  получили  тот  же
минимальный тур, который показан подчеркиванием на табл. 2.
       Удовлетворительных  теоретических  оценок  быстродействия   алгоритма
Литтла  и  родственных  алгоритмов  нет,  но  практика  показывает,  что  на
современных ЭВМ они часто позволяют решить  ЗК  с  n  =  100.  Это  огромный
прогресс по сравнению с полным перебором. Кроме того, алгоритмы типа  ветвей
и границ являются, если нет возможности доводить их до  конца,  эффективными
эвристическими процедурами.

                          1.2.4. Алгоритм Дейкстры

      Одним из вариантов решения ЗК является вариант  нахождения  кратчайшей
цепи, содержащей все города. Затем  полученная  цепь  дополняется  начальным
городом – получается искомый тур.
       Можно  предложить  много  процедур  решения  этой  задачи,  например,
физическое моделирование. На  плоской  доске  рисуется  карта  местности,  в
города, лежащие на  развилке  дорог,  вбиваются  гвозди,  на  каждый  гвоздь
надевается кольцо, дороги укладываются верёвками,  которые  привязываются  к
соответствующим кольцам. Чтобы найти кратчайшее  расстояние  между  i  и  k,
нужно взять I в одну руку и k в другую  и  растянуть.  Те  верёвки,  которые
натянутся и не дадут разводить руки шире и образуют кратчайший путь между  i
и k. Однако математическая процедура, которая промоделирует эту  физическую,
выглядит очень сложно. Известны алгоритмы попроще. Один из  них  –  алгоритм
Дейкстры, предложенный Дейкстрой ещё в 1959г.  Этот  алгоритм  решает  общую
задачу:
      В ориентированной, неориентированной или смешанной (т. е.  такой,  где
часть дорог имеет одностороннее движение) сети найти кратчайший  путь  между
двумя заданными вершинами.
      Алгоритм использует три массива из  n  (=  числу  вершин  сети)  чисел
каждый. Первый массив a содержит метки с двумя значениями:  0  (вершина  ещё
не рассмотрена) и 1 (вершина уже  рассмотрена);  второй  массив  b  содержит
расстояния  –  текущие  кратчайшие  расстояния  от  vi  до   соответствующей
вершины; третий массив c содержит номера вершин – k-й элемент ck есть  номер
предпоследней вершины на  текущем  кратчайшем  пути  из  vi  в  vk.  Матрица
расстояний  Dik  задаёт  длины  дуг  dik;  если  такой  дуги  нет,  то   dik
присваивается большое число Б, равное «машинной бесконечности».
      Теперь можно описать:
                              Алгоритм Дейкстры
      1(инициализация).
      В цикле от одного до n заполнить нулями массив а; заполнить  числом  i
      массив с: перенести i-тую строку матрицы D в массив b;
      a[i]:=1; c[i]:=0; {i-номер стартовой вершины}
      2(общий шаг).
      Найти минимум среди неотмеченных (т. е. тех k,  для  которых  a[k]=0);
      пусть минимум достигается на индексе j, т. е. bj(bk; a[j]:=1;


      если bk>bj+djk то (bk:=bj+djk;  ck:=j)  {Условие  означает,  что  путь
      vi..vk длиннее, чем путь  vi..vj,vk . Если все a[k] отмечены, то длина
      пути vi..vk равна b[k]. Теперь надо перечислить  вершины,  входящие  в
      кратчайший путь}
      3(выдача ответа).
      {Путь vi..vk выдаётся в обратном порядке следующей процедурой:}
   3.1. z:=c[k];
      3.2. Выдать z;
      3.3. z:=c[z]; Если z = 0, то конец, иначе перейти к 3.2.
      Для выполнения алгоритма нужно  n   раз  просмотреть  массив  b  из  n
элементов,  т.  е.   алгоритм   Дейкстры   имеет   квадратичную   сложность.
Проиллюстрируем работу алгоритма Дейкстры численным  примером  (для  большей
сложности, считаем, что некоторые города (вершины)  i,j не  соединены  между
собой, т. е. D[i,j]=?). Пусть, например,  i=3.  Требуется  найти  кратчайшие
пути из вершины  3.  Содержимое  массивов  a,b,c  после  выполнения  первого
пункта показано на табл. 12:


Очевидно, содерж
1234
скачать работу

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

 

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

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


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