Частный случай Задачи Коммивояжера

Тема в разделе "WASM.A&O", создана пользователем Bohdan200, 6 июл 2006.

  1. Bohdan200

    Bohdan200 New Member

    Публикаций:
    0
    Регистрация:
    13 сен 2005
    Сообщения:
    134
    Адрес:
    Lviv
    Народ, подскажите, может кто сталкивался со следующей задачей.
    Есть некоторое, не очень большое (100-300), количество случайных отрезков на плоскости. Необходимо найти КРАТЧАЙШИЙ путь, проходящий через ВСЕ конечные точки отрезков и по САМИМ отрезкам. Может я не очень понятно написал, в атаче картинка с объяснением.
    Помогите плис
     
  2. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    Это задача не о комие ваежоре. А на поиск кротчайшего пути. Посмотри Алгоритм Флойда. Правдо он порядка N^3.
     
  3. Bohdan200

    Bohdan200 New Member

    Публикаций:
    0
    Регистрация:
    13 сен 2005
    Сообщения:
    134
    Адрес:
    Lviv
    Судя по описанию проход по ВСЕМ ребрам не гарантируется.
     
  4. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    Тебе придется добавить отсечение. И после прохода алгоритма выбрать наименьшую длину из всех получившихся.
     
  5. halyavin

    halyavin New Member

    Публикаций:
    0
    Регистрация:
    13 май 2005
    Сообщения:
    252
    Адрес:
    Russia
    Bohdan200
    Не похоже, чтобы для этой задачи существовал полиномиальный алгоритм. Есть стандартный алгоритм ветвей и границ для задачи коммивояджера. Он частенько решает задачи до 100 вершин. Главная идея алгоритма - выбрать наилучшее ребро и рассмотреть 2 случая - ребро входит в путь и не входит. Первым рассматривается случай когда ребро в путь входит. Выбор наилучшего ребра происходит следующим образом. Будем считать, что мы ищем не путь, а цикл. (задача для пути сводится к задаче для цикла, если перебрать все возможности для концов) Составим матрицу расстояний между точками. В каждой строчке найдем минимум. Вычтем из всех расстояний этот минимум и прибавим его к текущему ответу. Потом тоже самое сделаем для всех столбцов. Для каждого нуля в матрице посчитаем 2 по величине число в строке и столбце. Сумма этих чисел - "штраф" за не взятие этого ребра. Соотвественно наилучшим является ребро с наибольшим штрафом. Если в процессе перебора текущий ответ превзойдет оптимальный - перебор заканчиваем. Алгоритм сложный, меньше чем за день его не напишешь.
     
  6. crypto

    crypto Active Member

    Публикаций:
    0
    Регистрация:
    13 дек 2005
    Сообщения:
    2.533
    Обратите внимание, что это не совсем задача на графе. Ведь рассматриваются случайно брошенные на плоскость отрезки. Это можно свести к графу, если только соединить концы каждого отрезка с концами всех остальных и уже на получившемся графе решать задачу нахождения кратчайшего пути.
     
  7. Stiver

    Stiver Партизан дзена

    Публикаций:
    0
    Регистрация:
    18 дек 2004
    Сообщения:
    812
    Адрес:
    Germany
    Если не ошибаюсь, то эту задачу можно свести к классической TSP (Traveling Salesman Problem), если для всех точек, соединенных отрезком, взять в качестве расстояния большие отрицательные значения (что-нибудь вроде -10^12 например). Если же точки не соединены отрезком, брать обычное расстояние. Тогда можно применить любой стандартный алгоритм для TSP (cutting-plane method наверное справится), и итоговый путь будет обязательно содержать все отрезки, т.к. иначе не будет минимальным.
     
  8. Bohdan200

    Bohdan200 New Member

    Публикаций:
    0
    Регистрация:
    13 сен 2005
    Сообщения:
    134
    Адрес:
    Lviv
    Уже неделю парюсь над проблемой. По всей видимости найти решение БЫСТРО не получится, надо искать альтэрнативу - какой-то метод, с достаточно близким к идеалу результатом так как мне абсолютно точного решения не надо.
     
  9. shoo

    shoo New Member

    Публикаций:
    0
    Регистрация:
    17 июл 2003
    Сообщения:
    1.537
    Адрес:
    Ukraine
    а начальная точка любая или фиксированная?
     
  10. Bohdan200

    Bohdan200 New Member

    Публикаций:
    0
    Регистрация:
    13 сен 2005
    Сообщения:
    134
    Адрес:
    Lviv
    В идеале начальная точка - любая. На практике наверно сделаю начальной точкой геом. центр картинки, а обход - перебор всех непройденых точек и выбор ближайшей. Немного не то, но наверно покатит :)
     
  11. shoo

    shoo New Member

    Публикаций:
    0
    Регистрация:
    17 июл 2003
    Сообщения:
    1.537
    Адрес:
    Ukraine
    в общем, я попробовал, но видать мозги подсохли - быстро не получилось, на долго - времени нет :)
    попробуй перебором в виде поиска в глубину:
    построй два списка: сначала берешь первый отрезок (в списке отрезков) за конец А и все концы В (начиная с него) соединяй с концом А следующего, посчитай длину - это будет наилучший вариант. затем строй следующий, меняя маршрут с конца списка - если длина получится меньше чем у первого - значит этот становится наилучшим, продолжай поиск в первом, и т.д. самое сложное здесь - алгоритм выбора следующего конца, так, чтобы не пропускать точки, и исключать те, которые уже есть в списке текущего маршрута... вот-с
     
  12. RRaptor

    RRaptor New Member

    Публикаций:
    0
    Регистрация:
    11 июл 2006
    Сообщения:
    2
    Попробуй использовать генетические алгоритмы для этой задачи, оптимального решения не получишь, но получиши близкое к нему за небольшое время.