Кіріспе

Графтардағы барлық жұптар арасындағы ең қысқа жолдарды табу алгоритмі, кейбір қабырға салмақтарының теріс болуына рұқсат береді. Компьютер ғылымында Флойд-Уоршалл алгоритмі (Флойд алгоритмі, Рой-Уоршалл алгоритмі, Рой-Флойд алгоритмі немесе WFI алгоритмі деп те аталады) – оң немесе теріс қабырға салмақтары бар (бірақ теріс циклдары жоқ) бағытталған салмақталған графтың ең қысқа жолдарын табу алгоритмі. Алгоритмді бір рет орындау барлық төбелер арасындағы ең қысқа жолдардың ұзындығын (жинақталған салмақтарын) анықтайды. Ол жолдардың өзі туралы толық мәлімет бермесе де, алгоритмге қарапайым өзгерістер енгізу арқылы жолдарды қайта құруға болады. Алгоритмнің нұсқалары қатынастың транзитивті жабылуын табуға немесе (Шульце дауыс беру жүйесімен байланысты) салмақталған графтың барлық төбелері арасындағы ең кең жолдарды табуға да қолданылуы мүмкін.

Тарих және атау

Флойд-Варшалл алгоритмі – динамикалық бағдарламалаудың мысалы, және оны Роберт Флойд 1962 жылы қазіргі танылған түрінде жариялаған. Дегенмен, ол негізінен Бернард Ройдің 1959 жылы және Стивен Уоршаллдың 1962 жылы графтың транзитивті жабылуын табу үшін жариялаған алгоритмдерімен бірдей, сондай-ақ детерминистік шекті автоматты тұрақты өрнекке түрлендіруге арналған Клейн алгоритмімен (1956 жылы жарияланған) тығыз байланысты. Алгоритмнің үш ұялы цикл түріндегі қазіргі заманғы формуласын алғаш рет Питер Ингерман да 1962 жылы сипаттаған.

Алгоритм

Флойд-Уоршелл алгоритмі графтың әрбір екі төбесі арасындағы көптеген мүмкін жолдарды салыстырады. Ол барлық ең қысқа жолдарды табуға кепілдік береді және мұны графтың салыстырулары арқылы істей алады. Алгоритмді орындау кезінде, егер теріс цикл болса, экспоненциалды түрде үлкен сандар пайда болуы мүмкін, мысалы , мұндағы – графтың ең үлкен абсолюттік мәні бар теріс жиегі. Ағып кету/ағып түсу проблемаларын болдырмау үшін алгоритмнің ішкі for циклінде жол матрицасының диагоналіндегі теріс сандарды тексеру қажет. Әрине, бағытталмаған графта теріс жиек оның жанасқан төбелерін қамтитын теріс циклды (яғни, жабық жол) құрайды. Мысалы, жоғарыдағы графтың барлық жиектерін бағытталмаған деп есептесек, 4 – 2 – 4 төбелік тізбегі –2 салмақ қосындысы бар цикл болып табылады.

Жолды қайта құру

Флойд-Уоршелл алгоритмі әдетте барлық төбелер арасындағы жолдардың ұзындығын ғана ұсынады. Шамалы өзгертулер енгізу арқылы кез келген екі соңғы төбе арасындағы нақты жолды қайта құру әдісін жасау мүмкін. Әр төбеден басқа төбеге дейінгі нақты жолды сақтауға ұмтылуға болар болса да, бұл қажет емес, тіпті жад жағынан өте шығынды. Оның орнына, ең қысқа жол ағашын пайдалануға болады, оны әр түйін үшін уақыт ішінде жад көлемімен есептеуге болады және кез келген екі байланысты төбе арасындағы бағытталған жолды тиімді түрде қайта құруға мүмкіндік береді.

Басқа қысқа жол алгоритмімен салыстыру

Теріс емес жиек салмақтары бар графтар үшін Дикстра алгоритмін бір шыңынан барлық ең қысқа жолдарды табу үшін қолдануға болады. Осылайша, әр шыңынан Дикстраны іске қосу белгілі бір уақытты қажет етеді. Графтың өлшемі болғандықтан, бұл қайталама Дикстраның ең нашар жағдайдағы жұмыс уақытын береді. Бұл Флойд-Уоршалл алгоритмінің асимптотикалық ең нашар жағдайдағы жұмыс уақытына сәйкес келсе де, тұрақты шамалар маңызды рөл атқарады. Граф тығыз болса (яғни, ), Флойд-Уоршалл алгоритмі практикада жақсы нәтижелер көрсетеді. Граф сирек болған кезде (яғни, -ден едәуір кішірек болса), Дикстра басымдық алады. Сирек графтар үшін, егер жиектері терiс болса, бірақ терiс циклдар болмаса, Джонсон алгоритмін қолдануға болады, ол қайталама Дикстра тәсілімен бірдей асимптотикалық жұмыс уақытына ие. Тығыз графтардағы барлық жұптардың ең қысқа жолын есептеуді жылдамдату үшін жылдам матрицалық көбейтуді пайдаланатын алгоритмдер де бар, бірақ олар әдетте жиек салмақтарына қосымша талаптар қояды (мысалы, олардың кіші бүтін сандар болуын қажет етеді). Бұған қоса, олардың жұмыс уақытындағы жоғары тұрақты факторларының салдарынан, олар тек өте үлкен графтар үшін ғана Флойд-Уоршалл алгоритмінен жылдамдық бере алады.