Алгоритми за двупосочни графи

Да кажем, че имам графика (мрежа) от възли с тежести на следното: 1. пътуване в една посока по връзка между два възела. 2. пътуване в другата посока по връзка между два възела (те може да са различни). 3. преминаване от една връзка към друга.

Освен това някои от възлите са само еднопосочни.

В този случай какви биха били най-добрите алгоритми за: а) намиране на минимално обхващащо дърво б) намиране на най-краткия маршрут между два възела в) намиране на пътя на „пътуващия търговец“ (т.е. най-краткия маршрут, който минава навсякъде, с минимално дублиране) ?

Също така, би ли било най-добре двупосочното нещо да се третира като два еднопосочни пътя, а не двупосочен път с различни тегла във всяка посока?

---пример---

              3
  A --<2/3>-- B --<3/2>-- C
  | 1        2|3
  |           |
  ^1/4       ^4/3
  |           |
  |3         4|
8 D --<3/5>-- E
  |2
  |
1 ^3/1
  |
  |
  F

Където ‹2/3> означава тегло на 2, движещи се наляво и 3, движещи се надясно. ^1/4 означава, че 1 пътува нагоре и 4 пътува надолу. Едно число между две връзки е цената за промяна на връзките - например преминаването от AD към DF струва 8, а от AB към BE струва 2.

Дано има смисъл...

Саймън

(p.s. извинения за лошата терминология - "връзки", "ръбове" - както искате ;) )


За да опитате да обясните по-добре типовете претегляния, представете си, че краищата са влакови релси, а възлите са гари. Разходите на ръба са времето за пътуване с влак между две гари, а разходите на възлите са колко дълго е времето за обмен (което може да варира между ръбовете дори в един и същ възел, в зависимост от това колко далеч е платформата, колко редовна е услугата и т.н.).


person simonalexander2005    schedule 26.04.2011    source източник
comment
Малко съм объркан от смяната на една връзка (/ръб) с друга. Имате предвид промяна на графиката? За най-краткия път и пътуващия търговец всичко, което има значение, е теглото между възлите.   -  person Kathy Van Stone    schedule 27.04.2011
comment
Това, което имам тук, е тежест при преминаване през всеки възел, както и тежест при пътуване по ръба. Мислейки за това като пътна система, това е еквивалентът на разходите за смяна на пътища, както и за пътуване по един (като възлите са кръстовища/кръстовища).   -  person simonalexander2005    schedule 27.04.2011


Отговори (2)


Да, третирайте ги като два ръба вместо един. След това можете да използвате традиционни алгоритми на теория на графите за това без проблем, особено ако винаги е гарантирано, че имате тегла във всяка посока. Тези алгоритми са лесни за намиране, ако просто използвате „нормална“ графика, каквато току-що ви помогнах да създадете.

Можете да използвате Dijkstra's за най-краткия път.

Можете да Prim's за минимално обхващащо дърво.

Можете да потърсите в Google асиметричния TSP, за да опитате да намерите алгоритъм за това и съм почти сигурен, че Въведение в алгоритмите също има нещо по въпроса. Съжалявам, че не можах да намеря добро изпълнение на това за вас. Тук има и няколко добри въпроса относно асиметричния TSP, след като вече знаете, че се нарича асиметричен TSP.

Късмет! Обичам теорията на графите.

-Брайън Дж. Стинар-

person Brian Stinar    schedule 26.04.2011
comment
На Dijkstra и Prim са добре - благодаря :) ... Що се отнася до Asymmetric TSP, мога да намеря само един въпрос тук, който беше затворен като несъщински въпрос... можете ли да ме свържете с един от добрите въпроси? Наздраве :) - person simonalexander2005; 27.04.2011
comment
Опитвам се да обмисля тази структура на графиката по отношение на тези на Дейкстра и Прим. Това не е вашата типична неотрицателна претеглена графика, защото изглежда, че има претеглени върхове, както и ръбове. Необходимо ли е първо да се разпредели тежестта върху върховете към ръбовете? - person ThomasMcLeod; 27.04.2011
comment
Мисля, че разпределението на теглото може да се направи с помощта на матрица, където всеки ред е уравнение за тегло на върха, а всяка колона е ребро. След това използвайте елиминирането на Гаус, за да намерите допълнителното тегло на ръбовете. - person ThomasMcLeod; 27.04.2011
comment
Имам малък проблем да разбера какво всъщност означава тежестта върху самия връх за този случай. Разбирам, че тежестта на ръба представлява цената за преход от един връх към друг връх, използвайки този ръб, но какво представлява тежестта на върха? Също така не ми е ясно предложението да се използва Гаусова елиминация, имате ли предвид, че действителното уравнение за тегло на ръба е просто сбор от тегло на ръба + връх и вие ще изчислите тази сума за всички ръбове във вашата матрица на съседство? - person Brian Stinar; 27.04.2011
comment
Добре, всъщност има много добри въпроси за асиметричния и за TSP... Статията в wikipedia не е лоша, но всъщност не видях реализация за вас. :-( en.wikipedia.org/wiki/ - person Brian Stinar; 27.04.2011
comment
Помислете за това като за пътна система - ръбът има разходите за пътуване надолу по пътя, а възелът има разходите за смяна на пътища (например може би отнема 1 минута, за да завиете наляво, но две минути, за да завиете надясно). След като разгледах това и се замислих малко, реших, че може да е по-лесно да третирам всеки възел като множество възли (в зависимост от това колко ръбове се свързват с него). Например D-‹4/1›-A(1)-‹2/3›-B може да бъде представено като D-‹4/1›-A'-‹1/1›-A''-‹2 /3›-B ... ако това има смисъл? Това премахва необходимостта да се тревожите за претеглените възли и след това може да се третира като стандартна двупосочна графика. - person simonalexander2005; 27.04.2011
comment
...или ако желаете, цената на всеки възел е цената на прехода между ръбовете. - person simonalexander2005; 27.04.2011
comment
Вземете пътуването с влак като пример - както седенето във влака, така и смяната от един влак на друг отнема време - и двете трябва да бъдат отчетени. Единият е разход на ръб (или писта), а другият е разход на възел (или станция). - person simonalexander2005; 27.04.2011
comment
Защо просто не добавите тази „цена на възел“ към всеки ръб, излизащ от възела (или всеки път, когато разходите са направени)? Тогава можете да избегнете създаването на виртуални възли за това, което ще го направи по-просто. Мисля, че вашата идея за виртуален възел ще работи, но изглежда, че ще направи нещата по-сложни от простото добавяне на разходите към краищата. - person Brian Stinar; 28.04.2011
comment
проблемът е, че цената е уникална в зависимост от два ръба - този, през който влизате във възела, и този, през който излизате - следователно не може да се добави към изходящите ръбове, тъй като не знаете какъв е бил предишният ръб ( има потенциално множество опции)... - person simonalexander2005; 28.04.2011
comment
Да, мисля, че сега разбирам мисълта ти. За да се подредя с вашата аналогия с реалния свят, бих имал връх от едно място до мястото, където трябва да направя своя ред. Между тях ще има ръб с тежест. След това, ако избера да завия наляво, ще имам друг връх след левия завой, като ръбът между тях има времето на завоя. По същия начин за десния завой. Ако избера да вървя направо, ще имам предимство между моята повратна точка на решение и следващата дестинация, с предимство между тях с тежест. Всички алгоритми ще очакват нещо подобно, - person Brian Stinar; 28.04.2011
comment
и това ще помогне на хора, които са използвали теория на графите преди да ви помогнат, тъй като това е начинът, по който всички учебници представят графиките. - person Brian Stinar; 28.04.2011

За вашите тегла за "обмен" можете да направите малък подграф, за да ги кодирате. Например имате:

  |   
  |3  
8 D --
  |2
  |

Можете да кодирате това, като използвате само тежести по ръбовете, като това:

  |
  |
  D0
  | \3
  |  \
 8|   D2--
  |  /
  | /2
  D1
  |
  |

Просто внимавайте за факта, че не е нужно да използвате ръба 8, за да стигнете от D0 до D1, тъй като вместо това можете да преминете към D0->D2->D1 за тегло 5. Не съм сигурен дали това е позволено в оригиналната ви формулировка.

person Keith Randall    schedule 28.04.2011
comment
съгласен - и трябва да е добре за това, което правя; въпреки че разбира се в други примери с подобен проблем (като завиване на светофар) не би било така. - person simonalexander2005; 29.04.2011