Блог пользователя wackloner

Автор wackloner, 12 лет назад, По-русски

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

Теперь более официальное условие задачи: есть связный взвешенный неориентированный граф без петель и кратных ребер. Также есть список дел. Требуется из данной вершины S придти в F, при этом выполнив все дела из списка. Дело представляет из себя пару чисел si и fi — номера вершин в графе, для каждого дела нужно сначала посетить si, а затем посетить fi. Надо вывести длину минимального пути из S в F, который покрывает все дела, а также сам этот путь. Пусть будет N вершин, M ребер и K дел. Нужно найти самое оптимальное решение. UPD1: Дела необязательно делать последовательно, можно выполнять несколько дел одновременно в любом порядке, в этом и смысл задачи.

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

UPD2: в комментариях было сказано про метод отжига, статьи о нем можно почитать здесь. Я, если честно, не очень понял, если кто-то может подробно его описать на примере этой задачи, я буду очень благодарен.

  • Проголосовать: нравится
  • +7
  • Проголосовать: не нравится

»
12 лет назад, # |
Rev. 3   Проголосовать: нравится +2 Проголосовать: не нравится

Видимо алгоритм Дейкстры (O((n*n+m)*k) или O(m*log(n)*k)) или Флойда (O(n*n*n+k)), в зависимости от того, что выгоднее.

UPD1. Это будет точное полное решение. Наверное можно придумывать какие-то вероятностные решения, с некоторыми эвристиками и пр., но это не всегда будет 100% оптимально.

UPD2. Думаю, если задача будет отображена на жизнь и реальные карты местности (города), то граф будет разрежен и оптимальнее всего будет алгоритм Дейкстры, работающий за O(m*log(n)), то есть общая сложность алгоритма составит O(m*log(n)*k).

  • »
    »
    12 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится

    А мне показалось, что дела делаются не последовательно, а можно, например, по пути из s1 в f1 пройти через s2 и f2. Если так, это NP, так как сложнее TSP.

    • »
      »
      »
      12 лет назад, # ^ |
        Проголосовать: нравится 0 Проголосовать: не нравится

      А.. блин. Я почему-то подумал, что нельзя выполнять одновременно много дел. Тогда да, задача хана, я не знаю, как такие задачи решать.

  • »
    »
    12 лет назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится

    Дополнил условие, чтобы точно было ясно, что требуется. Кратчайшие пути и я умею искать :)

»
12 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

Видимо в таких задачах метод отжига самое оптимальное.

»
12 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

Точно она решается динамикой по подмножествам, аналогичной TSP, за что-то типа k222k.