Микроконтролери и електроника
http://mcu-bg.com/mcu_site/

Странен проблем с Dijkstra алгоритъм
http://mcu-bg.com/mcu_site/viewtopic.php?f=7&t=17588
Страница 1 от 1

Автор:  Jack [ Нед Окт 25, 2020 1:26 pm ]
Заглавие:  Странен проблем с Dijkstra алгоритъм

Търся късата дистанция м-у стартиращ вертекс и друг такъв с Dijkstra
( действащ по формулата:
if ( vertex[current]->distance < vertex[adjecent]->distance + cost ) { vertex[adjecent]->distance = vertex[current]->distance + cost; }

Проблема възниква, когато стартиращия вертекс има два прилежащи с еднакъв 'cost' за стигане до тях - например като в първата фигура -
стартира се от вертекс 'C (2)' и се търси най-късата дистанция до 'Е (4)' 'Cost'-a и до двата прилежащи вертекса е '5' и '5' :
Прикачени файлове:
fig1.jpg
fig1.jpg [ 31.1 KiB | Прегледано 2857 пъти ]


Когато почне пробиране за съседни вертекси на верт. C(2) и релаксиране на техните дистанции, се намират B1 и D3 и техните дистанции се
релаксват до '5' и '5' съответно - фиг 2:
Прикачени файлове:
fig2.jpg
fig2.jpg [ 31.72 KiB | Прегледано 2857 пъти ]


След което при претърсване на пула от все още не-визитирани вертекси и кой от тях е с най-малка дистанция, логично се намира първи
B(1) тъй като е преди D(3) в масива от вертекси. В резултат на това той се маркира като следващ и 'най-късата' дистанция от C(2) до E(4) се
бива намерена като C(2)-B(1)-E(4)=(5 + 2) вместо C(2)-D(3)-E(4) = (5+1) . Фиг 3:
Прикачени файлове:
fig3.jpg
fig3.jpg [ 32.72 KiB | Прегледано 2857 пъти ]


Чудя се, какво би могло да е решението на този проблем.

Автор:  ps66 [ Нед Окт 25, 2020 1:49 pm ]
Заглавие:  Re: Странен проблем с Dijkstra алгоритъм

както си тръгнал - няма

най-лесно: трябва да обходиш всички възможни пътища - примерно рекурсивно, като излизаш от рекурсията при лош резултат (път >= най-добрия намерен)

в теория на графите сигурно има и по-ефективни решения за подобен проблем (с графи съм се занимавал последно преди 30+г)

ПС. да си беше написал поста на анг. щеше да е по разбираем :)

Автор:  Jack [ Нед Окт 25, 2020 2:27 pm ]
Заглавие:  Re: Странен проблем с Dijkstra алгоритъм

Да, разделянето на процеса рекурсивно на по малки Dijkastri- чки, а всяка от тях на по малки :D е добра идея. Но ми е мъгляво как да стане ако не знам колко на брой са прилежащите вертекси на тоя който е стартиращ. Може да са 1,2 или 902. Ще го мисля.

Автор:  ps66 [ Нед Окт 25, 2020 4:15 pm ]
Заглавие:  Re: Странен проблем с Dijkstra алгоритъм

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

Автор:  miro_atc [ Нед Окт 25, 2020 5:47 pm ]
Заглавие:  Re: Странен проблем с Dijkstra алгоритъм

Мда... и аз съм забравил почти всичко ;-)

Но като цяло идеята на търсенията е да си спестиш колкото може операции. В случая първото намерено решение не е задължително най-доброто. Ако търсиш "някакво" решение е ОК, но ако търсиш най-доброто трябва да продължиш.
Не е задължително обаче да обходиш всички възможни пътища. В примера си намерил решение, което струва 7. От там насетне всеки път, който надхвърля тая цена просто го режеш.
В случая най-краткия път до В е 5, а от В до А е 6. Общо става 11, ама ти вече имаш решение на цена 7, така че няма какво да правиш в А. Следователно не те интересува какво следва след А и автоматично може да разкараш всички маршрути минаващи през А.

Автор:  Jack [ Нед Окт 25, 2020 5:55 pm ]
Заглавие:  Re: Странен проблем с Dijkstra алгоритъм

Усетих се къде е грешката - спирам процеса твърде рано:
Прикачени файлове:
fig4.jpg
fig4.jpg [ 32.03 KiB | Прегледано 2809 пъти ]


Няма значение че се избира първи C(2) (който релаксва дистанциите на D(3) и E(4) до съответно '5' и '7' .
После като се продължи процеса, се избира като текущ D(3) (другата петица, щото е най-малко м-у оставащите невизитирани 11, 7 и 5 -от горната фигура)
и той релаксва E(4) да е с дистанция '6'. Накрая Е(4) релаксва дистанцията на А(0) от '11' на '7'
Т.е. - трябва да се продължава процеса докато всички вертекси са визитирани.
Прикачени файлове:
fig5.jpg
fig5.jpg [ 32.41 KiB | Прегледано 2809 пъти ]


Аз съм го спрял на C(2) , но сега ще го пренапиша.

Автор:  ДедоБоре [ Нед Окт 25, 2020 6:14 pm ]
Заглавие:  Re: Странен проблем с Dijkstra алгоритъм

ps66 написа:
в теория на графите сигурно има и по-ефективни решения за подобен проблем (с графи съм се занимавал последно преди 30+г)

има, но за (много) малко нодове.
това си е класическа NP задача, при която цената на намирането на точното решение (многократно) превишава ползата от самото решаване.
пък и това се е само теория :roll: ако ти се потъва в темата (някой ще ти плаща през това време) - [Теория графов. Алгоритмический подход. Никос Кристофидес] е относително разбираема за инженери, после [Избрани глави от Теорията на графите], [Кнут. Дискретна математика, има и един Postscript about NP-hard problems. 1976] и т.н.

математическата реализация на времето (на фортран) сигурно щеше да дойде едно чекмедже и се стигна до друго, приблизително и бързо решение (за 10К нода идеше реч).
и на мен малко ми е изфирясало от главата (същите 30+ години), но ако задачата ти е как да обходиш голямо количество нодове на приблизително най-ниска 'цена', без да се повтарят, ще изровя материалите. имам ги лента, но нямам магнетофон 8)
реализацията вървеше на вакс, ако не е твърде натоварен (беше по времето на футболното първенство в Испания), 10К нода ги решаваше за ~3 min. 'плейн' фортран :P
на PDP11 вървеше по-тромаво, но решаваше. имаше доста потенциал за подобрения (разбирай - изследователска дейност по аспирантура), но никой не ме пускаше до машината, че терминалите почваха да заекват, като пусна 100 симулации и отида на Витоша. после избухна демокрацията и отпадна необходимостта от възвишени мѝсли.

на съвременен хардуер би трябвало да е секунди, стига да не се портне на нещо като питон или го

Автор:  Jack [ Нед Окт 25, 2020 9:51 pm ]
Заглавие:  Re: Странен проблем с Dijkstra алгоритъм

Ееее, ай ся :) , 30+ годин... Наистина ли в embedded света Graph -овете и графините си остават недоклатени (не важат). :o

Страница 1 от 1 Часовете са според зоната UTC + 2 часа [ DST ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/