Algoritmit 1 - Luento 9 – Ti 9.2.2016

Transcription

Algoritmit 1 - Luento 9 – Ti 9.2.2016
Algoritmit 1
Luento 9 – Ti 9.2.2016
Timo Männikkö
Luento 9
• Graafit ja verkot
• Kaaritaulukko, bittimatriisi, pituusmatriisi
• Verkon lyhimmät polut
• Floydin menetelmä
• Lähtevien ja tulevien kaarien listat
• Forward Star -rakenne
• Saavutettavat solmut
• Verkon läpikäynti
Algoritmit 1 – Kevät 2016 – Luento 9 – Ti 9.2.2016
2/29
Graafit ja verkot
1
2
6
5
*
?
3
4
• Solmujen joukko N
• Kaarien joukko A
Algoritmit 1 – Kevät 2016 – Luento 9 – Ti 9.2.2016
3/29
Graafit ja verkot
Suunnattu graafi:
• Kaarilla suunta
• Alkusolmu ja loppusolmu
Suuntaamaton graafi:
• Kaarilla ei ole suuntaa
• Molemmat suunnat tasa-arvoisia
Verkko:
• Solmuihin tai kaariin liittyy muita kuvauksia
• Kaaren pituus, kaaren kapasiteetti, jne.
Algoritmit 1 – Kevät 2016 – Luento 9 – Ti 9.2.2016
4/29
Kaaritaulukko
• Taulukko verkon kaarista (järjestyksellä ei väliä)
• Jokaisesta kaaresta tallennettu alkusolmu,
loppusolmu ja muut tiedot, kuten esimerkiksi pituus
• Hyvin yksinkertainen tallennusrakenne
• Vaatii muistitilaa vakion verran jokaista kaarta
kohden
Algoritmit 1 – Kevät 2016 – Luento 9 – Ti 9.2.2016
5/29
Bittimatriisi
• Puhdas graafi: Vain solmuja ja kaaria
• Oletetaan, että ei rinnakkaisia kaaria
Bittimatriisi:
• Solmuja n kpl, numeroidaan 0, 1, . . . , n-1
• Matriisin alkio Bij =1, jos on kaari solmusta i
solmuun j, muutoin Bij =0
• Käyttökelpoinen, jos graafissa vähän kaaria
Algoritmit 1 – Kevät 2016 – Luento 9 – Ti 9.2.2016
6/29
Esimerkki: Bittimatriisi
1
3
*
o
S
7 SS
7 S
S
S
S
SS
S
S S
w
S
w
S
0
2
4
0:
1:
2:
3:
4:
0 1 2 3 4
------------0 1 0 1 0
0 0 1 1 0
1 1 0 1 0
0 0 0 0 1
0 0 1 0 0
Algoritmit 1 – Kevät 2016 – Luento 9 – Ti 9.2.2016
7/29
Kaarien pituusmatriisi
• Verkko: Kaarilla on pituus
• Oletetaan, että ei rinnakkaisia kaaria
Pituusmatriisi:
• Solmuja n kpl, numeroidaan 0, 1, . . . , n-1
• Matriisin alkio dij = solmusta i solmuun j johtavan
kaaren pituus
• Jos kaarta ei ole, asetetaan dij = ∞ (käytännössä
suuri luku)
• Suuntaamattomilla verkoilla matriisi on symmetrinen
Algoritmit 1 – Kevät 2016 – Luento 9 – Ti 9.2.2016
8/29
Esimerkki: Pituusmatriisi
25 - 3
1
*
o
S18 7 S
7 SS
S 16 S 16
24 S
SS
S
27
S S
w
17 S
w
S
0
2
4
31
20
0:
1:
2:
3:
4:
0
1
2
3
4
-----------------0 24
M 16
M
M
0 17 25
M
31 18
0 27
M
M
M
M
0 16
M
M 20
M
0
Algoritmit 1 – Kevät 2016 – Luento 9 – Ti 9.2.2016
9/29
Matriisien tilantarve
• Muistitilaa tarvitaan n2
• Suurilla ja harvoilla verkoilla vie liikaa tilaa (suurin
osa matriisin alkioista lukuja 0 tai M)
• Solmun naapureita määrättäessä joudutaan käymään
läpi matriisin koko rivi (naapureita vain muutama)
Algoritmit 1 – Kevät 2016 – Luento 9 – Ti 9.2.2016
10/29
Verkon lyhimmät polut
• Tehtävänä etsiä lyhimmät polut verkon kaikkien
solmuparien välillä
Floydin menetelmä:
• Tallennusrakenteeksi sopii pituusmatriisi
• d= pituusmatriisi
• D= lyhimpien etäisyyksien matriisi
• Idea: Laajennetaan yksi kerrallaan sallittujen
”välisolmujen” joukkoa solmuparin välisellä polulla
Algoritmit 1 – Kevät 2016 – Luento 9 – Ti 9.2.2016
11/29
Floydin menetelmä
1. Alustus: D=d
2. Suoritetaan kaikilla k=0,1,...,n-1:
• Kaikilla pareilla i,j=0,1,...,n-1:
• z=Dik +Dkj
• Jos z<Dij , niin aseta Dij =z
Algoritmin päätyttyä:
• Matriisissa D lyhimpien polkujen pituudet
• Ensimmäinen solmu lyhimmällä polulla i→j on se
solmu k, jolla Dij =dik +Dkj
Algoritmit 1 – Kevät 2016 – Luento 9 – Ti 9.2.2016
12/29
Lähtevien ja tulevien kaarien listat
Tietueet:
• Jokaista solmua kohti yksi solmutietue
• Jokaista kaarta kohti yksi kaaritietue
Listat:
• Jokaisella solmulla lista siitä lähtevistä kaarista
• Jokaisella solmulla lista siihen tulevista kaarista, jos
käytössä
• Listojen alkioiden järjestys yleensä vapaa
Algoritmit 1 – Kevät 2016 – Luento 9 – Ti 9.2.2016
13/29
Lähtevien ja tulevien kaarien listat
• Sallii rinnakkaiset kaaret
• Kaaret, joiden alku- ja loppusolmu sama, voidaan
periaatteessa myös esittää (mutta algoritmeissa
hankalia käsitellä)
• Voidaan käyttää myös suuntaamattomille verkoille:
• Annetaan kaarille mielivaltainen suunta
• Solmusta lähtevät ja siihen tulevat kaaret
käsitellään tasa-arvoisina
Algoritmit 1 – Kevät 2016 – Luento 9 – Ti 9.2.2016
14/29
Solmutietue
Solmutietueen kenttiä:
• Osoitin lähtevien kaarien listan ensimmäiseen kaareen
(ffwa)
• Osoitin tulevien kaarien listan ensimmäiseen kaareen,
jos käytössä (fbwa)
• Osoitin seuraavaan solmuun, jos solmut linkitetty
listaksi
• Muut solmukohtaiset tiedot
Algoritmit 1 – Kevät 2016 – Luento 9 – Ti 9.2.2016
15/29
Kaaritietue
Kaaritietueen kenttiä:
• Osoitin kaaren alkusolmuun (tl)
• Osoitin kaaren loppusolmuun (hd)
• Osoitin seuraavaan kaareen, jolla sama alkusolmu
(nxfw)
• Osoitin seuraavaan kaareen, jolla sama loppusolmu,
jos käytössä (nxbw)
• Muut kaarikohtaiset tiedot (esim. pit)
Algoritmit 1 – Kevät 2016 – Luento 9 – Ti 9.2.2016
16/29
Esimerkki: Kaarien listat
1 H
*
4 0 CO HH
j
H
C3
0 H 2C 3
*
HH W
C
5
j
1 H
2
solmun lähtevät tulevat
numero kaaret kaaret
0
0, 1
–
1
4, 2
3, 0
2
3, 5
1, 2
3
–
5, 4
Algoritmit 1 – Kevät 2016 – Luento 9 – Ti 9.2.2016
(Huom:
Kaaret eivät ole
listoissa numerojärjestyksessä)
17/29
Esimerkki taulukoilla
1 H
*
4 0 CO HH
j
H
C3
0 H 2C 3
*
HH W
C
5
j
1 H
2
0:
1:
2:
3:
Solmut
ffwa fbwa
--------0 NIX
4
3
3
1
NIX
5
0:
1:
2:
3:
4:
5:
Kaaret
tl hd nxfw nxbw pit
------------------0 1
1 NIX 43
0 2 NIX
2 24
1 2 NIX NIX 26
2 1
5
0 32
1 3
2 NIX 15
2 3 NIX
4 17
Algoritmit 1 – Kevät 2016 – Luento 9 – Ti 9.2.2016
18/29
Toteutus dynaamisesti
solmu
kaari
? ?
lähtevien
kaarien
lista
tulevien
kaarien
lista
?
loppusolmu
?
seur. tuleva tie
? seur. lähtevä tie
alkusolmu
?
Listojen tilantarve:
• Solmuja n kpl ja kaaria m kpl
• ⇒ Osoittimia 2n + 4m kpl
• Lisäksi muut tallennettavat tiedot/osoittimet
Algoritmit 1 – Kevät 2016 – Luento 9 – Ti 9.2.2016
19/29
Forward Star -rakenne
Kaaritaulukko:
• Tiivistetty esitys lähtevien kaarien listasta
• Kaaret järjestetty alkusolmun numeron mukaan
kasvavaan järjestykseen
• ⇒ Samasta solmusta lähtevät kaaret taulukossa
peräkkäin
• Kaarista annettu vain loppusolmun numero ja pituus
Algoritmit 1 – Kevät 2016 – Luento 9 – Ti 9.2.2016
20/29
Forward Star -rakenne
Solmutaulukko:
• n+1 alkiota (yksi ylimääräinen)
• s[i]= solmusta i lähtevän ensimmäisen kaaren
paikka kaaritaulukossa
• Viimeinen alkio ilmoittaa viimeistä kaarta seuraavan
paikan
• ⇒ s[i+1]-s[i]= solmusta i lähtevien kaarien
lukumäärä
• ⇒ Jos solmusta i ei lähde yhtään kaarta, on
s[i+1]=s[i]
Algoritmit 1 – Kevät 2016 – Luento 9 – Ti 9.2.2016
21/29
Esimerkki: Forward Star
1 H
*
4 0 CO HH
j
H
C3
0 H 2C 3
*
HH W
C
5
j
1 H
2
0:
1:
2:
3:
4:
s
--0
2
4
6
6
0:
1:
2:
3:
4:
5:
6:
head pit
--------1
43
2
24
2
26
3
15
1
32
3
17
NIX NIX
Algoritmit 1 – Kevät 2016 – Luento 9 – Ti 9.2.2016
22/29
Forward Star -rakenne
Tilantarve:
• n+1 indeksiä solmutaulukossa
• m (tai m+1) kaarialkiota kaaritaulukossa
Sopii tallennusrakenteeksi:
• Fordin ja Fulkersonin menetelmä (lyhimpien polkujen
algoritmi)
• Saavutettavissa olevien solmujen selvittäminen
Vastaavasti voitaisiin esittää solmuihin tulevat kaaret:
Backward Star -rakenne
Algoritmit 1 – Kevät 2016 – Luento 9 – Ti 9.2.2016
23/29
Saavutettavat solmut
• Jos solmusta a solmuun b johtaa ainakin yksi polku,
on solmu b saavutettavissa solmusta a
• Tehtävänä selvittää, mitkä solmut ovat
saavutettavissa annetusta lähtösolmusta
• a= lähtösolmu
• R= saavutettavien solmujen joukko
• T= tutkittavien solmujen joukko
Algoritmit 1 – Kevät 2016 – Luento 9 – Ti 9.2.2016
24/29
Saavutettavat solmut
1. Alustetaan T=R={a}
2. Jos T= ∅, lopetetaan, muutoin poistetaan joukosta T
jokin solmu x
3. Käydään läpi kaikki solmusta x lähtevät kaaret
(x,j):
• Jos j∈R, ei tehdä mitään
• Muutoin lisätään j joukkoihin R ja T
Jatketaan kohdasta 2
Algoritmit 1 – Kevät 2016 – Luento 9 – Ti 9.2.2016
25/29
Verkon yhdistetyt komponentit
• Edellinen algoritmi: Kun kohdassa 2 joukko T tulee
tyhjäksi, on löydetty yksi verkon yhdistetty
komponentti
• Jos kaikkia verkon solmuja ei ole vielä tutkittu,
valitaan jokin tutkimaton solmu uudeksi
lähtösolmuksi
• ⇒ Saadaan toinen yhdistetty komponentti
• Näin jatkamalla saadaan selville kaikki yhdistetyt
komponentit
Algoritmit 1 – Kevät 2016 – Luento 9 – Ti 9.2.2016
26/29
Verkon läpikäynti
• Edellinen algoritmi: Kun kohdassa 2 joukko T tulee
tyhjäksi, valitaan jokin tutkimaton solmu uudeksi
solmuksi a
• ⇒ Verkon läpikäynti eli kaikkien solmujen ja
kaarien tutkinta/käsittely
Algoritmit 1 – Kevät 2016 – Luento 9 – Ti 9.2.2016
27/29
Verkon läpikäynti
Leveyshaku (Breadth-First Search):
• Joukko T on jono
⇒
• Tutkitaan solmut, jotka ovat yhden kaaren päässä
lähtösolmusta
• Tutkitaan solmut, jotka ovat kahden kaaren päässä
lähtösolmusta
• Jne.
Algoritmit 1 – Kevät 2016 – Luento 9 – Ti 9.2.2016
28/29
Verkon läpikäynti
Syvyyshaku (Depth-First Search):
• Joukko T on pino
⇒
• Tutkiminen jatkuu viimeksi tutkitusta solmusta
eteenpäin
• Kun ei enää päästä eteenpäin, palataan jatkamaan
jostain aikaisemmin tutkitusta solmusta
Algoritmit 1 – Kevät 2016 – Luento 9 – Ti 9.2.2016
29/29