Ugeseddel (..) Matematisk Programmering Niels Lauritzen..7 FORELÆSNINGER I ugen. 7. gennemgik vi algoritmer til løsning af heltalsprogrammer ved hjælp af simplex algoritmen. Dette er heltalsprogrammeringsugesedlen med detaljerede eksempler på hvordan Gomory cuts og branch and bound indarbejdes i simplex tableauet. Der er kun opgaver på ugesedlen og de er alle regneopgaver. Det er vigtigt at du får metoderne indarbejdet ved at læse denne ugeseddel grundigt og regne opgaverne. Gomory cuts og branch and bound er beskrevet i ILO, men det er ikke beskrevet hvordan man konkret arbejder med simplex tableauet. På mandag vil den obligatoriske opgave blive gennemgået og vi vil regne på flere heltalsprogrammer. Vi har nu afsluttet gennemgangen af pensum. Heltalsprogrammer Et heltalsprogram er et lineært program, hvor vi forlanger heltalsløsninger: min cx givet Ax = b, ( ) x N n, hvor c er en reel n vektor, A en n m matrix med heltalsindgange og b er en m vektor med heltalsindgange. Læg mærke til at N betegner mængden {,,,... } af ikke-negative heltal. Vi kan stadigvæk benytte alle de gængse tricks med at tilføje slack variable dvs. heltalsprogrammer som f.eks. min cx givet Ax b, x N n, kan omformes til ( ), når blot A og b indeholder heltal. Det er tid til et helt konkret eksempel. http://en.wikipedia.org/wiki/ralph E. Gomory
EKSEMPEL max x + y 7 ( ) x y 9, ( ) x N. y På tegningen nedenfor er det brugbare område (som nu er endeligt!!) skitseret med punkter. Du kan samtidig se at det tilsvarende lineære program ikke giver et heltalsoptimum. Metoderne vi skal beskrive til at løse heltalsprogrammet ( ) gør begge brug af den såkaldte LP-relaksation (med et godt dansk ord!): Man dropper betingelsen x N n og erstatter den med et almindeligt lineært program x. Hvis dette lineære program kommer ud med en heltalsløsning, så har vi fundet den optimale løsning til ( ). Overvej lige hvorfor! Gomory cuts Vi vil gerne indføre nogle flere betingelser for at skære uønskede ikke heltalsløsninger væk. Ideen er at vi til sidst får fat i et heltalshjørne som er
optimalt i det lineære program. Gomory cuts er en dejlig måde at indføre flere bibetingelser i et lineært program uden at ændre på løsningerne i det tilsvarende heltalsprogram. Ideen er egentlig ganske enkel. Vi løser LP-relaksationen til ( ). Hvis den optimale løsning er heltallig er det fint. Hvis ikke findes en koordinat som ikke er et heltal. Antag nu at x x x =. Nn x n er en brugbar løsning til ( ) og at vi har fundet et optimalt sæt B af basissøjler i A for LP-relaksationen til ( ) f.eks. ved brug af simplex algoritmen. Så gælder Ax = b = (B A)x = B b, hvor det bemærkes at B A er søjlerne,...,n i simplex tableauet T og B b er koordinaterne til den optimale løsning dvs. den -te søjle i simplex tableauet. Antag at den i-te koordinat (dvs. den med index i) i den -te søjle, T i, ikke er et heltal dvs. T i < T i, hvor a angiver det største heltal mindre end et tal a. Hvis N betegner indices på søjler uden for basen B, så medfører x i + j N T ij x j = T i. at x i + j N T ij x j T i, () idet alle x k, k =,..., n specielt er heltal. Nu er den fantastiske indsigt at den optimale løsning t R n til LP-relaksationen givet ved B ikke opfylder (). Bemærk nemlig at t j = for j N samt at t i = T i. Men hvis t skal opfylde () må t i t i. Det er kun heltal som opfylder sidstnævnte ulighed.
Gomory cuts i simplex tableauet Vi kan addere () som en ny ulighed i vores LP-relaksation. Det er beskrevet i ILO. ( A new inequality constraint is added ) hvordan det gøres i praksis. Lad os kort opfriske det inden vi gennemgår et eksempel. Antag vi har at gøre med det lineære program min cx, Ax = b, x. Her er A en m n matrix, c en n vektor, x en n vektor og b en m vektor. Antag at vi ønsker at tilføje uligheden ax b, hvor a er en n vektor og b et tal. Den ny ulighed bliver til ax + s = b med slack variabel s. Dette giver det ny lineære program min cx givet ( ) ( )( ) ( ) A x b = a s b, x, s. Med en brugbar basisløsning B til det oprindelige problem kan vi hurtigt få en basisløsning i det ny program ( ) ved at sætte ( ) B B = a, hvor a er et udsnit af a svarende til søjlerne i B. Med denne basisløsning bliver tableauet for ( ) hvor B A = ( ) B a A = ( ) ( B a B A = A = ( ) A. a B A a B A + a Læg mærke til at den reducerede cost række bliver ( ) (c, ) (c B, )B A B = c (c B, ) A a B = (c c A + a B B A, ). Slutteligt bliver -te søjle i det ny tableau ( ) ( ) ( B b a B b = B b a B b + b ). ),
I praksis udvider man ganske enkelt simplex tableauet B A (som man allerede har regnet ud) med den ekstra ligning ax + s = b. Hvis vi vedtager at den ny basis består af den gamle basis samt den ny slack variabel kan vi hurtigt lave rækkeoperationer for at omforme tableauet for det ny problem. Faktisk modsvarer udtrykket a B A + a ovenfor de elementære rækkeoperationer man skal omforme sidste række (a, ) med for at få under -tallerne i den gamle basis. Men læg mærke til at dette ny tableau som hovedregel giver en ikkebrugbar løsning for det primale problem. Her må man benytte den duale simplex metode (. i ILO). Hvorfor er brugbarhed for det duale problem bevaret? OPGAVE Gomory uligheden i () bliver til ligningen x i + j N T ij x j + s = T i og i dette tilfælde er det meget nemt at få fat på det ny tableau for ( ). Eftervis at den sidste række i det ny tableau bliver (skrevet op som en ligning) {T ij }x j + s = {T i }, j N hvor {a} = a a for et tal a. Når du har indføjet et Gomory cut og udregnet det ny tableau som ovenfor benyttes den duale simplex metode til at regne sig frem til et nyt optimum (. i ILO). Her er et eksempel. EKSEMPEL Betragt problemet max y x + y (!) x + y x, y N.
Dette kan tegnes som Det er klart at optimum ligger i (, ). Men vi vil benytte dette nemme eksempel til at illustrere Gomory cuts. Vi omdøber x til x og y til x og indfører slack variablene x og x. Dette giver os følgende tableau for det lineære program i (!) (vi har udskiftet x, y N med x som i almindelig lineær programmering med reelle løsninger). Lad os pivotere i fællesskab: Anden pivotering giver det optimale tableau
Anden koordinaten er ikke et heltal og vi kigger nærmere på anden række. I vores tableau svarer den til x + x + x =. Dette giver anledning til et Gomory cut: x. Læg mærke til at denne ekstra betingelse faktisk fjerner ovenstående optimale løsning til vores LP-relaksation i og med at ikke er. Som beskrevet indsættes cuttet i et udvidet tableau. Ved en elementær rækkeoperation fås Læg grundigt mærke til at vi har et dualt brugbart tableau (alle indgange i den reducerede cost vektor er ), men at x = ødelægger primal brugbarhed. Vi bruger den duale simplex algoritme og jeg har angivet hvor jeg vil pivotere ovenfor. I den duale simplex algoritme maksimerer man c j /T ij over de negative T ij i i-te række. I den primale algoritme minimerer man T i /T ij over de positive T ij i j-te søjle. Efter ovenstående pivotering fås det optimale tableau 7
Her får vi et Gomory cut ud fra første række på x x, som indsættes som Efter en elementær rækkeoperation: Vi pivoterer en gang i den duale simplex algoritme og ser at vi får den længe ventede optimale løsning (, ). Der er ikke behov for flere Gomory cuts, da vi har fundet en heltalsløsning. 8
OPGAVE Løs heltalsprogrammet max x + x x + x +x = x, x, x, x, x N. x + x +x = x +x +x = ved hjælp af Gomory cuts. Illustrer med en tegning. Branch and bound I har allerede stødt på denne teknik i jeres obligatoriske opgave. Kort fortalt har vi (som beskrevet i ILO) at gøre med et optimeringsproblem min cx, (+) x F hvor F bare er en delmængde af R n. Branch and bound er en begavet måde at løse dette optimeringsproblem på ved at undersøge problemerne for delmængder F i F med min cx, x F i F = F F m. Den optimale løsning til (+) skal findes i et af disse delproblemer. Antag samtidig at vi hurtigt kan udregne en nedre grænse b(f i ) min x F i cx, for hvert delproblem. Så kan vi i ro og mag gennemløbe listen af delproblemer for F,...,F m. Men vi kan gøre det smart ved at benytte funktionen b. Lad U være den optimale værdi, som vi har fundet ved at løse delproblemerne givet ved F,...,F k (i starten er U = ). Hvis b(f k+ ) U kan det ikke betale sig at løse problemet for F k+ og vi har sparet værdifuld regnetid. Dette er i al sin enkelthed princippet bag branch and bound. Men lad os se på et eksempel. 9
EKSEMPEL Betragt igen problemet max y x + y x + y (=) x, y N. LP-relaksationen har det optimale tableau (x = x, x = y med slack variable x, x tilføjet) Igen er x = ikke heltallig. Men vi har øvre grænse på for vores maksimum (eller en nedre grænse på for det tilsvarende minimumsproblem vi er i gang med at løse). Helt naivt gælder at den brugbare mængde i (=) kan opdeles i to disjunkte mængder, hvor x eller x dvs. vi har de to delproblemer samt max x x + x x + x x, x N. x max x x + x x + x x, x N. x Et af disse to delproblemer indeholder den optimale løsning til (=). Bemærk samtidig at vi har skåret den uønskede x = væk i ovenstående to problemer. Lad os prøve at sætte x ind i sidste række i vores optimale
tableau. Efter en elementær rækkeoperation fås Sidste række afslører et lineært program uden brugbare løsninger. Vi kan derfor undlade at gå videre med x og ser i stedet for på x : Ligesom i Gomory cut eksemplet sætter vi betingelsen x ind i simplex tableauet og når frem til det optimale tableau igen efter en iteration i den duale simplex algoritme. Her giver x = de to delproblemer x og x. Lad os studere delproblemet givet ved
x : max x x + x x + x x, x N. x x Dette giver tableauet som efter en elementærækkeoperation bliver til som efter pivotering giver det optimale tableau Dette tableau giver heltalsløsningen x = samt x =, som har har cost. Læg mærke til at vi først nu har fundet en brugbar heltalsløsning til et
delproblem. Dette delproblem er max x x + x x + x x x x, x N. og vi sætter U =. Men husk på at vi stadig har delproblemet max x x + x x + x x x x, x N. Men dette delproblem har klart optimal løsning (, ). Lad os se på endnu et eksempel (fra ILO), hvor alle udregninger er vist. EKSEMPEL min x x ( ) x x x N. x x x x x ( ) 9 =, ( )
Vi opstiller straks tableauet for LP-relaksationen og begynder at regne. 9 7 Altså har LP-relaksationen en ikke-heltallig optimal løsning med x = og x = med et minimum på 7, som også er en nedre grænse for minimum i ( ). Men vi er interesserede i heltalsløsninger! En heltalsløsning har selvfølgelig x eller x. Disse to uligheder kommer fra x = i LP-relaksationen. Vi ønsker ikke denne løsning i vores heltalsprogram og udelukker den med de to uligheder. Lad os begynde med at indsætte x i vores optimale simplex tableau ovenfor. Her fås 7 Ved en elementær rækkeoperation fås 7
og det ses at tilføjelsen x ikke har nogle løsninger. Så vi koncentrerer os om x og tilføjer den til tableauet: 7 Ved en elementær rækkeoperation fås 7 Efter den markerede duale pivotering fås det optimale tableau med x = og x =. Svarende til sidstnævnte kan vi opdele problemet i x samt x. Lad os se på x. Denne giver:
Efter en elementær rækkeoperation fås Efter den markerede duale pivotering fås det optimale tableau og her har vi en heltalsløsning med x =, x = med cost. Derfor sætter vi U = og fortsætter med tilfældet x : Efter en elementær rækkeoperation fås
Efter den markerede duale pivotering fås det optimale tableau Vi ser at den optimale løsning til LP-relaksationen har x = og x = med en cost på. Denne løsning er ikke heltallig. Men læg nu mærke til den helt centrale observation: Vi behøver ikke gå videre med delproblemerne x og x, idet vi allerede har en optimal løsning med cost U = i et delproblem. De delproblemer som fremkommer ud af x og x vil nemlig altid have cost. Overvej lige hvorfor! Så vi har fundet den optimale løsning (,,, ) til vores heltalsprogram i ( ). OPGAVE Løs heltalsprogrammet max x + x x +x +x = 9 x, x, x, x N. ved hjælp af branch and bound. x +x +x = 7