Breadth -first search ( BFS ) er en af grafgennemgangsmetoderne . Lad grafen være givet og begyndelsespunktet . Bredde-først søgealgoritmen krydser systematisk alle kanter for at "opdage" alle hjørner, der kan nås fra , mens den beregner afstanden (minimum antal kanter) fra til hver nåbar top. Algoritmen fungerer for både rettede og urettede grafer. [en]
Bredth-first-søgning har dette navn, fordi vi i traversalprocessen går i bredden, det vil sige, at før man begynder at søge efter hjørner på afstand , krydses hjørnerne på afstand .
Bredth first search er en af de uinformerede søgealgoritmer [2] .
Breadth-First Search fungerer ved at gå gennem de individuelle niveauer i grafen , startende ved kildenoden .
Overvej alle kanter udgående fra node . Hvis den næste knude er målknuden, slutter søgningen; ellers føjes noden til køen . Efter at alle de kanter, der forlader noden, er kontrolleret, tages den næste node fra køen , og processen gentages.
Bemærk: opdelingen af hjørner i udfoldede og ikke udfoldede er nødvendig for en vilkårlig graf (da den kan have cyklusser). For et træ er denne operation ikke nødvendig, da hvert toppunkt kun vil blive valgt én gang.
Nedenfor er pseudokoden for algoritmen for det tilfælde, hvor det kun er nødvendigt at finde målknuden. Afhængigt af den specifikke anvendelse af algoritmen kan der være behov for yderligere kode for at gemme den nødvendige information (afstand fra startknudepunktet, overordnet knude osv.)
Rekursiv formulering:
BFS( start_node , goal_node ) { return BFS'({ start_node }, ∅, goal_node ); } BFS'( fringe , visited , goal_node ) { if ( fringe == ∅) { // Målknudepunktet blev ikke fundet returnere falsk; } if ( mål_node ∈ udkant ) { return true; } return BFS'({ barn | x ∈ rand , barn ∈ expand( x )} \ besøgt , besøgt ∪ rand , målknude ); }Iterativ formulering:
BFS( start_node , goal_node ) { for (alle noder i) besøgte [ i ] = falsk; // indledningsvis er listen over besøgte noder tom kø .push( start_node ); // startende fra kildenoden besøgte [ start_node ] = sand; while (! kø .empty() ) { // indtil køen er tom node = kø .pop(); // hent det første element i køen if ( node == goal_node ) { return true; // tjek om den aktuelle node er målet } foreach ( child in expand( node )) { // alle efterfølgere af den aktuelle node, ... if (visited[ child ] == false) { // ... der endnu ikke er besøgt ... kø .push ( barn ); // ... tilføje til slutningen af køen... besøgt [ barn ] = sand; // ... og marker som besøgt } } } returnere falsk; // Målknudepunktet er ikke tilgængeligt }Pascal implementering :
funktion BFS ( v : Node ) : Boolean ; start kø ( v ) ; mens køen ikke er tom , skal du begynde curr := dequeue () ; hvis is_goal ( curr ) så start BFS := sand ; udgang ; ende ; mærke ( curr ) ; for næste i efterfølgere ( curr ) gør hvis ikke markeret ( næste ), så start køen ( næste ) ; ende ; ende ; BFS := falsk ; ende ;Angiv antallet af hjørner og kanter i grafen som hhv .
Da alle udvidede noder er lagret i hukommelsen, er rumkompleksiteten af algoritmen [2] .
Den iterative uddybningssøgningsalgoritme ligner bredde-først-søgning, idet hver iteration undersøger hele niveauet af nye noder, før det går videre til næste niveau, men kræver væsentligt mindre hukommelse.
Da algoritmen i værste fald besøger alle grafens noder , er algoritmens tidskompleksitet [2] [3] ved lagring af grafen i form af tilgrænsende lister .
Hvis hver knude har et begrænset antal efterfølgere, er algoritmen komplet: Hvis der findes en løsning, finder bredde-første søgealgoritmen den, uanset om grafen er begrænset eller ej. Men hvis der ikke er nogen løsning, slutter søgningen ikke på den uendelige graf.
Hvis grafens kantlængder er ens, er bredde-først-søgning optimal, det vil sige, at den altid finder den korteste vej. I tilfælde af en vægtet graf finder bredde-først-søgning en sti, der indeholder det mindste antal kanter, men ikke nødvendigvis den korteste.
Cost -first search er en generalisering af bredde-først søgning og er optimal på en vægtet graf med ikke-negative kantvægte. Algoritmen besøger grafens noder i rækkefølge efter stigende omkostninger for stien fra startknuden og bruger normalt en prioritetskø .
Bredde-første søgning blev formelt foreslået af E. F. Moore i forbindelse med at finde en sti i en labyrint [4] . Lee opdagede uafhængigt den samme algoritme i forbindelse med PCB-ledninger [5] [6] [7] .
Breadth-First Search kan anvendes på problemer relateret til grafteori :
Algoritmer til grafsøgning | ||
---|---|---|
Uoplyste metoder | ||
Informerede metoder | ||
Genveje | ||
Minimumspændende træ | ||
Andet |