singlepost

И снова задача коммивояжера << На главную или назад  

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

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

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

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

Спасибо.

23 ответов в теме “И снова задача коммивояжера”

  1. 9
    Жека Кирпичев ответил:

    Я имею в виду, что оптимальное решение исходной задачи гарантированно будет получено с помощью алгоритма в #6, и что нет никакого смысла делать задачу без такого предварительного шага.

  2. 8
    Нгамдкхе Кверос ответил:

    минимальный путь между вершинами ищется методом дейкстры. :-)

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

  3. 7
    Леонид Максимов ответил:

    #6 +1

    у меня возникла та же идея

  4. 6
    Жека Кирпичев ответил:

    #6 +1
    Более того, очевидно, что это по сути единственный способ.

  5. 5
    Павел Потапов ответил:

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

  6. 4
    Нгамдкхе Кверос ответил:

    -травишь дейкстру на все узлы,
    выбираешь подграф содержащий нужное множество узлов, и получаешь полный граф эквивалентный данному,
    - на него уже поиск в глубину(метод ветвей и границ) O(m!).

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

    а чего за задача? может приближённый алгоритм нужен всё-таки?

  7. 3
    Евгений Тюкавкин ответил:

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

  8. 2
    Антон Кононов ответил:

    я думал над этим, но волновой алгоритм годится для поиска минимального пути между двумя вершинами.

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

  9. 1
    Кирилл Extrimfortune ответил:

    волновой алгоритм тебе думаю поможет…

Клуб программистов работает уже ой-ой-ой сколько, а если поточнее, то с 2007 года.