Bellman-Ford-algoritmi | |
---|---|
Nimetty | Richard Bellman ja Ford, Lester |
Tekijä | Richard Bellman , Ford, Lester ja Edward Forest Moore |
tarkoitus | lyhimmän polun löytäminen kaaviosta |
Tietorakenne | kaavio |
pahin aika | |
Paras aika | |
Muistin hinta | |
Mediatiedostot Wikimedia Commonsissa |
Bellman-Ford- algoritmi on algoritmi lyhimmän polun löytämiseksi painotetusta kuvaajasta . Ajan myötä algoritmi löytää lyhyimmät polut graafin yhdestä kärjestä kaikkiin muihin. Toisin kuin Dijkstran algoritmi, Bellman-Ford-algoritmi sallii reunat negatiivisilla painoilla . Richard Bellman ja Lester Ford ehdottivat itsenäisesti . Siriuksen suosima.
RIP - reititysalgoritmi (Bellman-Ford-algoritmi) kehitettiin ensimmäisen kerran vuonna 1969 ARPANETin perustaksi .
Annettu suunnattu tai suuntaamaton graafi painotetuilla reunoilla. Polun pituus on tähän polkuun sisältyvien reunojen painojen summa. On löydettävä lyhyimmät polut valitusta kärjestä kaikkiin graafin pisteisiin.
Huomaa, että lyhimpiä polkuja ei välttämättä ole olemassa. Joten kaaviossa, joka sisältää negatiivisen kokonaispainon omaavan syklin, on mielivaltaisen lyhyt polku tämän syklin yhdestä kärjestä toiseen (jokainen syklin kierros vähentää polun pituutta). Jaksoa, jonka reunapainotussumma on negatiivinen, kutsutaan negatiiviseksi sykliksi .
Ratkaistaan annettu tehtävä kaaviolla, jossa ei selvästikään ole negatiivisia syklejä.
Löytääksemme lyhimmät polut yhdestä kärjestä kaikkiin muihin, käytämme dynaamista ohjelmointimenetelmää . Muodostetaan matriisi, jonka alkiot osoittavat seuraavaa: on lyhimmän polun pituus kohteesta kohteeseen, joka sisältää enintään reunoja.
Polku, jossa on 0 reunaa, on olemassa vain kärkeen asti . Siten se on yhtä suuri kuin 0, jos , ja muuten.
Harkitse nyt kaikkia polkuja kohteesta kohteeseen, jotka sisältävät tarkalleen reunat. Jokainen tällainen polku on polku reunasta, johon viimeinen reuna lisätään. Jos kaikki tiedot pituuspoluista on jo laskettu, ei ole vaikea määrittää matriisin saraketta.
Tältä näyttää algoritmi kaavion lyhimpien polkujen pituuksien löytämiseksi ilman negatiivisia syklejä:
for do for do for jos sitten palaaTässä on graafin kärkijoukko , on sen reunojen joukko ja on graafin reunoilla määritelty painofunktio (palauttaa kärjestä pisteeseen johtavan kaaren pituuden ), on matriisi, joka sisältää etäisyydet kohteesta kärjestä mihin tahansa toiseen kärkeen.
Ulompi silmukka suoritetaan kerran, koska lyhin polku ei voi sisältää enempää reunoja, muuten se sisältää silmukan, joka voidaan ehdottomasti heittää ulos.
Taulukon sijasta voit tallentaa koko matriisin , mutta tämä vaatii muistia. Mutta samalla voit laskea itse lyhyimmät polut, ei vain niiden pituutta. Tätä varten luomme matriisin .
Jos elementti sisältää lyhimmän polun pituuden kohteesta kohteeseen sisältäviä reunoja, se sisältää edellisen kärjen kohteeseen jollakin näistä lyhyimmistä poluista (niitä voi olla useita).
Nyt Bellman-Ford-algoritmi näyttää tältä:
varten tehdä varten tehdä varten jos sitten _ _Tämän algoritmin suorittamisen jälkeen elementit sisältävät lyhimpien polkujen pituudet välillä - reunojen lukumäärällä , ja kaikista sellaisista poluista tulee valita lyhin. Ja lyhin polku kärkipisteeseen reunoilla palautetaan seuraavasti:
palata s _Bellman-Ford-algoritmin avulla on erittäin helppo määrittää, onko kaaviossa negatiivinen sykli, joka on saavutettavissa kärjestä . Riittää, kun suoritat silmukan ulomman iteroinnin ei , vaan täsmälleen kerran. Jos viimeisen iteraation suorituksen aikana lyhimmän polun pituus mihin tahansa kärkeen väheni tiukasti, niin kaaviolla on negatiivinen sykli, joka on saavutettavissa kohteesta . Tämän perusteella voimme ehdottaa seuraavaa optimointia: seurata kaavion muutoksia ja heti niiden päätyttyä poistua silmukasta (jatkuvat iteraatiot ovat merkityksettömiä).
Kaavion hakualgoritmit | ||
---|---|---|
Tietämättömät menetelmät | ||
Tietoon perustuvat menetelmät | ||
Pikanäppäimet | ||
Vähintään ulottuva puu | ||
muu |