Hoi!
Ik ben al een tijdje aan het knoeien om een graaf op een systematische manier te doorlopen.
Stel ik heb een samenhangende (dus geen losse delen, alles is met elkaar verbonden), gerichte (1-richtingspijlen) graaf. Nu wil ik een functie maken die de graaf zo doorloopt, zodat de pijlen een "afhankelijkheids"-betekenis krijgen: als knoop a wijst naar knoop b, moet eerst a uitgeprint (uitgevoerd, ... wat dan ook) worden om b te kunnen printen. Vergelijk het met processen die eerst moeten uitgevoerd worden, vooraleer een andere proces kan starten.
Na wat knoeien kwam ik tot volgende functie: (pseudeocode!)
Dit is een aangepaste versie van first-depth search van grafen (waarom? omdat je hier verschillende 'roots' kunt hebben die als eerste moeten geprint worden)
Nu werkt dit algoritme niet altijd
Stel ik heb volgende graaf:

Een oplossing van deze graaf zou dus zijn: 1-3-4-2-5-6-7
Stel nu dat ik knoop '1' (ps: willekeurig!) neem om de recursieve functie te starten. Kort gezegd krijg ik dan deze werking:
· knoop 1 heeft geen ouders, print knoop 1
· ga naar het enige kind van knoop 1: knoop 2
· knoop 3 is ouder van knoop 2, ga naar knoo^p 3
· knoop 3 heeft geen ouders, print knoop 3
· knoop 3 heeft geen niet-bezochte kinderen
· ga naar ouder knoop 4 van knoop 2
· knoop 4 heeft geen ouders, print knoop 4
· knoop 5 is een niet bezocht kind van knoop 4, ga naar knoop 5
· knoop 5 heeft geen niet bezochte ouder, print knoop 5
· knoop 6 is een niet bezocht kind van knoop 5, ga naar knoop 6
· hier loopt het mis: knoop 6 heeft geen niet bezochte ouder, print knoop 6; hij beschouwt hier knoop 2 als bezocht (volgt uit algoritme), maar dat mag hier net niet!
· niet meer relevant ...
Ik zit er al een tijdje op te kijken, maar ik kom er niet echt uit. Iemand een idee hoe ik het moet aanpakken of wat ik mis doe?
Een probleem is dat de "gebruikelijke" doorlooptechnieken, zoals first-dept en first-breadth, hier niet toe te passen zijn, omdat de volgorde van uitprinten die ik wil, niet terug te vinden is in deze algoritmen.
Hopelijk kan iemand mij helpen
Ik ben al een tijdje aan het knoeien om een graaf op een systematische manier te doorlopen.
Stel ik heb een samenhangende (dus geen losse delen, alles is met elkaar verbonden), gerichte (1-richtingspijlen) graaf. Nu wil ik een functie maken die de graaf zo doorloopt, zodat de pijlen een "afhankelijkheids"-betekenis krijgen: als knoop a wijst naar knoop b, moet eerst a uitgeprint (uitgevoerd, ... wat dan ook) worden om b te kunnen printen. Vergelijk het met processen die eerst moeten uitgevoerd worden, vooraleer een andere proces kan starten.
Na wat knoeien kwam ik tot volgende functie: (pseudeocode!)
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
| zet heel de array D (lengte = aantal knopen van de graaf) op false /* D[v] = true => knoop v is reeds bezocht */
knoop1 = een willekeurige knoop uit de graaf
functie (knoop1)
functie (knoop kn)
{
D[kn] = true; /* markeer knoop 'kn' als bezocht */
while (alle ouders (x1, x2, x3, ...) van kn) /* doorloop alle ouders van knoop 'kn' */
{
if (D[ouder x] == false) /* als de ouder nog niet bezocht is, ga naar die ouder */
functie(ouder x);
}
printf kn; /* alle ouders zijn uitgeprint, we mogen nu de knoop zelf uitprinten */
while (alle kinderen (y1, y2, y3, ...) van kn) /* doorloop alle kinderen van knoop 'kn' */
{
if (D[kind y] == false) /* als een kind nog niet bezocht is, ga naar dat kind */
functie(kind y);
}
} |
Dit is een aangepaste versie van first-depth search van grafen (waarom? omdat je hier verschillende 'roots' kunt hebben die als eerste moeten geprint worden)
Nu werkt dit algoritme niet altijd

Een oplossing van deze graaf zou dus zijn: 1-3-4-2-5-6-7
Stel nu dat ik knoop '1' (ps: willekeurig!) neem om de recursieve functie te starten. Kort gezegd krijg ik dan deze werking:
· knoop 1 heeft geen ouders, print knoop 1
· ga naar het enige kind van knoop 1: knoop 2
· knoop 3 is ouder van knoop 2, ga naar knoo^p 3
· knoop 3 heeft geen ouders, print knoop 3
· knoop 3 heeft geen niet-bezochte kinderen
· ga naar ouder knoop 4 van knoop 2
· knoop 4 heeft geen ouders, print knoop 4
· knoop 5 is een niet bezocht kind van knoop 4, ga naar knoop 5
· knoop 5 heeft geen niet bezochte ouder, print knoop 5
· knoop 6 is een niet bezocht kind van knoop 5, ga naar knoop 6
· hier loopt het mis: knoop 6 heeft geen niet bezochte ouder, print knoop 6; hij beschouwt hier knoop 2 als bezocht (volgt uit algoritme), maar dat mag hier net niet!
· niet meer relevant ...
Ik zit er al een tijdje op te kijken, maar ik kom er niet echt uit. Iemand een idee hoe ik het moet aanpakken of wat ik mis doe?
Een probleem is dat de "gebruikelijke" doorlooptechnieken, zoals first-dept en first-breadth, hier niet toe te passen zijn, omdat de volgorde van uitprinten die ik wil, niet terug te vinden is in deze algoritmen.
Hopelijk kan iemand mij helpen
[ Voor 8% gewijzigd door Verwijderd op 30-11-2002 21:15 . Reden: phoutjuuh ]
