5.3 DRILL — Håndkjøring av maks-flyt og flyt-modellering
Drill på håndkjøring av `Ford-Fulkerson`/`Edmonds-Karp` (sjanger C) OG den første halvdelen av flyt-modelleringen (sjanger H): gjenkjenn et fordelings-/barriereproblem som flyt.
Grunnlaget er de 17 settene fra august 2015 til august 2023 som er gjennomgått
tema for tema — det er nevneren hver gang boka oppgir en prosent. Flyt er
verktøyet i flest av de åpne designoppgavene på slutten av settet.
Kapitlet driller to sjangre, og de skrives ut i klarspråk her:
- Sjanger C — håndkjøring, altså at du utfører algoritmen steg for steg på
papir og oppgir bare sluttilstanden. For flyt er svarformen flytverdien,
og min-snittet når begge er spurt om.
- Sjanger H — åpen algoritmedesign, altså at du skisserer en algoritme på
fem til ti linjer. Her øver vi den første halvdelen: å kjenne igjen at et
innpakket problem er et flytproblem, og å bygge nettet. Hele designsjangeren
driller vi i kap. 8.2.
Høyeste prioritet — dette må sitte.
De to mønstrene du skal kjenne igjen på tre sekunder:
| Innpakningen sier | Verktøyet er |
|---|---|
| «fordel A på B, med grenser for hvor mange hver kan ta» | maks-flyt |
| «finn den billigste barrieren som skiller X fra Y» | min-snitt |
Slik er kapitlet lagt opp (85 min):
| Innhold | Tid |
|---|---|
| Løsningsoppskriften, begge halvdelene | ca. 12 min |
| Gjennomkjørt håndkjøringscase med margnotater | ca. 15 min |
| Drill på håndkjøring | ca. 22 min |
| Gjennomkjørt modelleringscase med margnotater | ca. 14 min |
| Drill på modellering | ca. 22 min |
— naturlig pausepunkt — etter håndkjøringsdrillen. Modelleringen er en helt
annen type arbeid og kan tas i en egen økt.
Forkunnskaper
Dette kapitlet legger ikke til nytt stoff. De fire reglene du trenger i hånden,
står her — resten finner du i kapitlene:
1. Restnettet fra kap. 5.1:
framover, og på
ryggkanten. Bare kanter med er med. En mettet kant gir
ingen framoverkant; en tom kant gir ingen ryggkant.
2. Forøkende sti og flaskehals: en sti fra til i , og den
minste restkapasiteten på den.
3. Min-snittet leses av til slutt: kjør én BFS fra i restnettet når
algoritmen har stoppet. Nodene den når, utgjør . Se
kap. 5.2.
4. Heltallsteoremet: med heltallige kapasiteter finnes en maksimal flyt der
hver kant bærer et heltall. Det er dette som gjør at flyten kan leses som en
tildeling.
Øvrige forkunnskaper:
- kap. 5.2 — Ford-Fulkerson, Edmonds-Karp,
maks-flyt/min-snitt-teoremet.
- kap. 4.1 — BFS, som er stivalget i
Edmonds-Karp.
skriver du opp framoverkanten med og ryggkanten med , og stryker
dem som blir 0.
Steg 2 — finn en forøkende sti. Bruker du Edmonds-Karp, skal den være
korteste, funnet med BFS. Naboene besøkes i den rekkefølgen oppgaven
oppgir — det er en del av oppgaven.
Steg 3 — finn flaskehalsen. Den minste restkapasiteten på stien.
Steg 4 — forøk. Legg flaskehalsen til på framoverkantene og trekk den
fra på kantene der stien gikk bakover. Det siste er den feilen som gjøres
oftest.
Steg 5 — gjenta til BFS ikke finner .
Steg 6 — les av min-snittet. Nodene BFS når fra i det siste
restnettet, utgjør . Kantene fra til er alle mettet, og summen av
kapasitetene deres skal være lik flytverdien. Stemmer ikke det, har du
regnet feil.
Steg 7 — lever. Flytverdien, og min-snittet når det er spurt om. Ikke hele
tabellen med mindre oppgaven ber om den.
| Innpakningen | Problemet |
|---|---|
| noe skal fordeles på noe annet, med grenser per part | maks-flyt i et firelagsnett |
| «billigste barriere som skiller X fra Y» | min-snitt |
| «hvor mange kan tildeles samtidig» | maksimal matching, som er maks-flyt med kapasitet 1 |
Steg 2 — navngi paradigmet eksplisitt. Skriv «dette løses med maks-flyt» i
klartekst. Det er ett av leddene som gir uttelling.
Steg 3 — bygg konstruksjonen. Fire lag:
- kilden ;
- ett nodesett for det som skal tildeles;
- ett nodesett for det de tildeles til;
- sluket .
Kapasiteten fra til en venstre node er hvor mange den kan ta.
Kapasiteten fra en høyre node til er hvor mange den har plass til. En
kant i midten med kapasitet 1 betyr at nettopp den tildelingen er tillatt.
Steg 4 — kjør, og si hva flytverdien betyr. Er den lik antall enheter som
måtte plasseres, går regnestykket opp; er den lavere, finnes ingen fullstendig
tildeling.
Steg 5 — rekonstruér selve løsningen. Midtkantene som bærer flyt, er
tildelingen. Si eksplisitt at heltallsteoremet gir en heltallig flyt, slik
at hver midtkant bærer 0 eller 1 og avlesningen er entydig. Si også at
avlesningen koster og ikke øker den asymptotiske kjøretiden.
Steg 6 — oppgi kjøretiden med og definert i problemets egne
størrelser.
Mangler ett av de fem leddene — problem, paradigme, konstruksjon,
rekonstruksjon, kjøretid — er svaret ufullstendig.
Et vannverk har pumpen , tre kummer , , og forbruket .
Kapasitetene, i liter per sekund, er
c(s,p) = 8 c(s,q) = 5 c(p,q) = 2 c(p,r) = 7
c(q,r) = 6 c(r,t) = 9 c(q,t) = 3Kjør Edmonds-Karp fra nullflyten, med naboene i alfabetisk rekkefølge. Oppgi
maksimal flytverdi og et min-snitt.
| Runde | Forøkende sti | Flaskehals | Flytverdi etterpå |
|---|---|---|---|
| 1 | 3 | 3 | |
| 2 | 7 | 10 | |
| 3 | 2 | 12 | |
| 4 | ingen sti finnes i | — | 12 |
Margnotat.
BFS finner korteste sti. I runde 1 er på tokanter, mens er på tre — derfor kommer den korte først,
selv om den bare gir 3 enheter. Å velge stien med størst flaskehals er en
annen algoritme, og den er ikke
Edmonds-Karp.Margnotat. I runde 3 er mettet, så
BFS må gå. Restkapasiteten på er da , og det
blir flaskehalsen.
Den endelige flyten:
f(s,p) = 7/8 f(s,q) = 5/5 f(p,q) = 0/2 f(p,r) = 7/7
f(q,r) = 2/6 f(r,t) = 9/9 f(q,t) = 3/3Margnotat. Legg merke til at ikke bærer noe. Ikke enhver kant må
brukes for at flyten skal være maksimal — flaskehalsen ligger et helt annet
sted.
Sluttilstanden — det du ville levert på eksamen:
Maks-flyt . Min-snitt:
, ,
med .
Margnotat. Kontrollen tar fem sekunder: snittkapasiteten er
12, og flytverdien er
12. Like tall betyr at kjøringen er ferdig og riktig.
Ulike tall betyr at du har regnet feil et sted — og da vet du det før du
leverer.
Margnotat om delvis uttelling. En håndkjøring som stopper etter to runder,
gir uttelling for de to rundene. Skriv derfor ned sti og flaskehals for hver
runde mens du regner, ikke bare det endelige tallet.
Drill: håndkjøring (~22 min)
Fem oppgaver. Legg merke til at svarformatet skifter — noen ber om
flytverdien alene, andre om snittet i tillegg.
Et flytnett har nodene , , , , , og kapasitetene
| Kant | Kapasitet | Kant | Kapasitet |
|---|---|---|---|
| 7 | 6 | ||
| 5 | 4 | ||
| 3 | 8 | ||
| 6 | 9 |
Kjør
Edmonds-Karp med naboene i alfabetisk rekkefølge, og oppgi maksimalflytverdi.
Et flytnett har nodene , , , , og kapasitetene
c(s,u) = 4 c(s,v) = 9 c(u,w) = 6 c(v,u) = 3
c(v,w) = 2 c(w,t) = 5 c(v,t) = 7Kjør Edmonds-Karp med naboene i alfabetisk rekkefølge.
a) Oppgi de forøkende stiene med flaskehals.
b) Oppgi maksimal flytverdi og et min-snitt.
Bruk vanningsanlegget fra kap. 5.2, der maksimal flyt
er 18 og den siste forøkende stien var med
flaskehals 1.
Anta i stedet at kanten har kapasitet 9 i stedet for 10, mens alt
annet er uendret.
a) Hva blir maksimal flytverdi?
b) Hva blir min-snittet?
En kandidat har kjørt Edmonds-Karp på et nett og fått flytverdi 15. Hun
finner et snitt med kapasitet 19 og konkluderer: «Flyten er maksimal, siden
.»
Er konklusjonen riktig? Svar ja eller nei, og forklar hva som mangler.
Et flytnett har nodene , , , med kapasitetene
c(s,x) = 20 c(s,y) = 20 c(x,y) = 1
c(x,t) = 20 c(y,t) = 20a) Hvor mange runder bruker Edmonds-Karp, og hva blir maksimal flyt?
b) Hvor mange runder kan Ford-Fulkerson med uheldig valg av sti bruke?
c) Hva illustrerer forskjellen?
Modellering: fra innpakning til flytnett (~14 min)
Den andre halvdelen av kapitlet handler om det som skjer før algoritmen: å
se at et problem i det hele tatt er et flytproblem.
Kjennetegnet er nesten alltid det samme. Noe skal fordeles på noe annet, hver
part har en øvre grense, og bare visse kombinasjoner er tillatt. Da bygger du
et nett i fire lag.
Et laboratorium har fem analyseinstrumenter og sju prøver som skal kjøres i
løpet av natten. Hver prøve kan kjøres på visse av instrumentene, ikke alle.
Hvert instrument rekker to prøver i løpet av natten.
Beskriv hvordan du avgjør om alle sju prøvene rekkes, og hvordan du finner en
konkret kjøreplan.
part har en grense, og bare visse par er tillatt. Dette er et
tilordningsproblem med kapasiteter, altså maks-flyt.
Margnotat. Å navngi problemet er ett av de fem leddene som gir uttelling.
«Dette er et flytproblem» er en halv linje, og den halve linja teller.
Steg 2 — paradigmet. Maksimal flyt i et firelagsnett. Skriv det eksplisitt.
Steg 3 — konstruksjonen.
- Kilde og sluk .
- Én node per prøve, med kant og kapasitet 1 —
hver prøve skal kjøres nøyaktig én gang.
- Én node per instrument, med kant og kapasitet
2 — hvert instrument rekker to prøver.
- En kant med kapasitet 1 for hvert par
der prøven kan kjøres på instrumentet.
Margnotat. Legg merke til hvor grensene sitter. «Én gang per prøve» er
kapasiteten på kildekanten; «to per instrument» er kapasiteten på
slukkanten. Å bytte om de to er den vanligste modelleringsfeilen.
Margnotat. Midtkantene trenger bare kapasitet 1. Kapasiteten der koder ikke
en grense — den koder at dette paret er tillatt.
Steg 4 — kjør og tolk. Kjør Edmonds-Karp. Alle sju prøvene rekkes hvis og
bare hvis maksimal flyt er 7, altså at hver kildekant er mettet.
Er maksimal flyt 6, er svaret nei — og min-snittet forteller deg til og med
hvorfor: det peker ut den flaskehalsen som gjør det umulig.
Steg 5 — rekonstruér kjøreplanen. Midtkantene som bærer flyt 1, er
planen: prøve kjøres på instrument . Heltallsteoremet garanterer at
en maksimal flyt kan velges heltallig når alle kapasitetene er heltall, så hver
midtkant bærer enten 0 eller 1, og avlesningen er entydig. Den koster og
øker ikke den asymptotiske kjøretiden.
Margnotat. Dette leddet er det som skiller et fullt svar fra et halvt.
Oppgaven ba om en kjøreplan, ikke om et ja eller nei — og da må du si
hvordan planen leses ut.
Steg 6 — kjøretiden. Nettet har noder og kanter, der er antall tillatte prøve–instrument-par. Edmonds-Karp
gir .
Hele svaret, i eksamensform:
Dette er et tilordningsproblem med kapasiteter, og løses med maks-flyt. Bygg
et nett med kilde , én node per prøve (kant fra med kapasitet 1), én
node per instrument (kant til med kapasitet 2), og en kant med kapasitet
1 fra hver prøve til hvert instrument den kan kjøres på. KjørEdmonds-Karp.
Alle prøvene rekkes hvis og bare hvis maksimal flyt er 7. Kjøreplanen leses
av som de midtkantene som bærer flyt; heltallsteoremet gir en heltallig flyt,
og avlesningen koster . Kjøretid med og
.
Åtte linjer. Det er lengden en sjanger H-oppgave skal ha.
Drill: modellering (~22 min)
Fem oppgaver. Alle er nyskrevne innpakninger av de samme to mønstrene.
En idrettshall har treningstider ledig i uka. lag har hver oppgitt
hvilke tider de kan bruke, og hvert lag skal ha nøyaktig én tid. Hver tid kan
brukes av bare ett lag.
Beskriv hvordan du avgjør om alle lagene får en tid, og hvordan du finner
fordelingen.
En kommune skal sette opp midlertidige flomsperrer. Kartet er et rutenett der
noen ruter er elvebredd og noen er sentrum. Å sette opp en sperre i en rute
koster et oppgitt beløp. Kommunen vil finne den billigste samlingen ruter
som gjør det umulig å komme fra elvebredden til sentrum.
Beskriv hvordan problemet løses.
Et transportfirma har sjåfører og oppdrag. Hver sjåfør kan ta høyst to
oppdrag, og hvert oppdrag trenger nøyaktig én sjåfør. I tillegg gjelder: sjåfør
og oppdrag må høre til samme distrikt.
a) Bygg flytnettet.
b) En kollega foreslår å modellere distriktskravet som en kapasitet på
kildekanten. Er det riktig?
Et datasenter har servere og jobber. Jobb krever kjerner, og
server har ledige kjerner. En jobb kan splittes på flere servere.
Alle jobber skal kjøres.
a) Bygg flytnettet.
b) Hva er forskjellen fra en vanlig matching, og hva betyr det for
avlesningen?
En kandidat modellerer et fordelingsproblem som maks-flyt, kjørerEdmonds-Karp, og skriver som hele svaret: «Maksimal flyt er 14, så svaret er
ja.»
a) Hva mangler i svaret?
b) Skriv om svaret slik at det er fullstendig, for oppgaven «tildel 14
vakter til 6 vikarer som hver kan ta høyst 3 vakter».
De to første koster hele oppgaven.
- Å glemme ryggkantene under forøkning. Går den forøkende stien bakover
langs en kant, skal flyten der senkes med flaskehalsen. Uten det finner
ikke håndkjøringen den maksimale flyten.
- Å oppgi bare flytverdien når min-snittet også er spurt om. Er begge
etterspurt, er begge en del av svaret — og snittet leses gratis av det siste
restnettet.
- Å bruke stien med størst flaskehals i stedet for korteste sti.
Edmonds-Karp krever korteste sti, funnet med BFS. Andre valg gir
gyldige flyter, men det er en annen algoritme og et annet svar på
håndkjøringen.
- Å sette kapasitetene feil sted i en modellering. «Hvor mange hver kan
ta» hører på kildekanten; «hvor mange hver har plass til» hører på
slukkanten. Hvilke par som er tillatt, kodes ved at midtkanten finnes
eller ikke — ikke ved en kapasitet.
- Å glemme heltallsteoremet i modelleringssvaret. Det er det som gjør at
flyten kan leses som en tildeling, og det er ett av leddene som gir
uttelling.
- Å stoppe ved flytverdien i en designoppgave. Oppgaven ber om en
tildeling eller en plan, og da må du si hvordan den leses ut av
flyten. Å oppgi bare optimalverdien er felle #6.
- Å bruke et for dyrt snitt som bevis. Beviset krever et snitt som treffer
flytverdien.
- Å tro at en treg algoritme betyr et hardt problem. Felle #7 — se
kap. 5.2.
Og den gjennomgående: å skrive mer enn de fem leddene. Et designsvar er
fem til ti linjer. Lengre svar gir ingen ekstra uttelling.
Kjøretidene du kan bli spurt om i en deloppgave
| Operasjon | Kjøretid | Krav / egenskap |
|---|---|---|
Edmonds-Karp | korteste forøkende sti; polynomisk | |
Ford-Fulkerson (vilkårlig sti) | pseudopolynomisk; krever heltall for terminering | |
Én BFS i restnettet | både stivalget og avlesningen av snittet | |
| Å lese av tildelingen fra flyten | øker ikke den asymptotiske kjøretiden | |
| Todelt matching via flyt | alle kapasiteter 1 | |
| Min-snitt med nodekostnader | krever nodesplitting først |
Én presisering som er verdt å ta med seg. Kjøretiden i et designsvar skal
oppgis i problemets egne størrelser: hvor mange noder og kanter nettet får
når det bygges av oppgavens , og . Å skrive «» uten å si hva
og er i denne konstruksjonen, er et halvt svar.
Begrepsbank
Begrepsbanken er flashcard- og repetisjonsstoff — den gjentar det du nettopp
har lest. Hopp trygt over ved førstegangslesing; tidsanslaget for kapitlet
gjelder kjernestoffet.
oppgi flytverdien, og min-snittet når begge er spurt om.
Kontrollen: snittkapasiteten skal være lik flytverdien.
Skriv ned sti og flaskehals for hver runde underveis — delvis riktig
håndkjøring gir delvis uttelling.
for hver kant: framoverkanten med og ryggkanten med . Kanter med 0
strykes.
En mettet kant gir bare ryggkant; en tom kant gir bare framoverkant.
Tegn det, ikke hold det i hodet. Det er her de fleste regnefeilene
oppstår.
legg flaskehalsen til på framoverkantene, og trekk den fra på kantene der
stien gikk bakover.
Minst én kant blir mettet i hver forøkning.
Fratrekket på ryggkantene er den vanligste feilen i denne
håndkjøringen.
fire lag: kilde, ett nodesett for det som skal tildeles, ett for det de
tildeles til, og sluk.
Kapasiteten fra kilden koder hvor mange hver kan ta; kapasiteten til sluket
koder hvor mange hver har plass til.
Kantenes eksistens i midten koder hva som er tillatt — ikke en kapasitet.
«fordel A på B, med grenser for hvor mange hver kan ta» — kjennetegnet på et
maks-flyt-problem.
Alle tildelingene kan gjøres hvis og bare hvis maksimal flyt er lik antall
enheter som måtte plasseres.
Er alle kapasitetene 1, er problemet en ren maksimal matching.
«finn den billigste samlingen som gjør det umulig å komme fra X til Y» —
kjennetegnet på et min-snitt-problem.
Løses ved å kjøre maks-flyt og lese av snittet fra det siste restnettet.
Ligger kostnaden på noder, splitt hver node i to med en indre kant som
bærer kostnaden.
å dele en node i og med en kant mellom
dem som bærer nodens kapasitet eller kostnad.
Alle innkommende kanter går til , alle utgående fra
.
Standardgrepet når begrensningen sitter på en node i stedet for på en
kant.
midtkantene som bærer flyt, er tildelingen.
Heltallsteoremet gir en heltallig maksimal flyt, så avlesningen er entydig, og
den koster .
Å oppgi bare flytverdien er felle #6 — oppgaven ber om planen, ikke om
tallet.
oppgavetypen der du utfører algoritmen steg for steg og oppgir sluttilstanden.
For flyt: flytverdien, og min-snittet når det er spurt om.
Naboenes rekkefølge er en del av oppgaven når BFS brukes.
oppgavetypen der du skisserer en algoritme på fem til ti linjer.
Fem obligatoriske ledd: navngi problemet, navngi paradigmet, konstruksjonen,
rekonstruksjonen av selve løsningen, og kjøretiden.
Mangler ett ledd, er svaret ufullstendig — og det er oftest
rekonstruksjonen som glipper.
Dette kapitlet er skrevet av Anthropics toppmodeller (Claude Opus og Claude Fable) og er foreløpig ikke manuelt gjennomgått — kvalitetskontrollen gjøres av uavhengige KI-agenter, og innmeldte feil rettes fortløpende. Funnet en feil? Meld fra, så retter vi den. Les mer om hvordan innholdet lages.
Skolesaga er en uavhengig læringsressurs og er ikke tilknyttet eller godkjent av Norges teknisk-naturvitenskapelige universitet. Dette er ikke offisielt studiemateriell. Les mer.