Linköpings universitet Optimeringslära grundkurs för Y Matematiska institutionen Laboration 1 Optimeringslära 30 januari 2013 Laboration 1 - Simplexmetoden och Modellformulering Den första delen av laborationen syftar till att ge träning på simplexmetoden och öka förståelsen för linjärprogrammering. För att lösa LP-problem används här ett program skrivet i Matlab. Programmet används för att skapa simplextablåer och utföra pivoteringar, men man får själv ange startbas och välja inkommande och utgående variabeler. För att använda Matlab programmet behövs både texteditorn emacs och Matlab; se introduktion till Matlab/Simplex i avsnitt 3 för vidare instruktioner. I laborationens andra del ska två problem formuleras och lösas med hjälp av modelleringsspråket Ampl. Syftet med detta är att ge förståelse för hur ett kommersiellt programpaket för optimeringsmodellering fungerar. Se Introduktion till modelleringsspråket Ampl för instruktioner och exempel. (Ampl ska även användas i laboration 2.) 1. Simplexmetoden mha Matlab 1. (Ska förberedas.) Läs noga igenom introduktionen till Matlab/Simplex. 2. (Ska förberedas.) Inför slackvariabler i de två nedanstående LP-problemen. 3. Ge kommandot TAOP07setup i ett terminalfönster och kopiera filer till er hemkatalog med cp $KURSBIB/LAB1/*.m. (Observera punkten på slutet.) 4. Lös problemet nedan utgående från startbasen (x 1,x 2,x 3,x 5,x 6 ), där x 3,x 5 och x 6 är slackvariabler. (Problemet laddas in från filen uppgift4.) maxz = 10x 1 + 2x 2 då x 1 + x 2 3 (1) 5x 1 + 2x 2 10 (2) 2x 1 x 2 10 (3) x 1 + x 2 7 (4) x 1 + 3x 2 9 (5) x 1,x 2 0 Rita in varje iterationspunkt i figur 1. Optimallösning:... Optimala basvariabler:... 1
9 8 7 6 5 (1) (4) (5) 4 X2 3 2 (3) 1 0 (2) 1 2 2 1 0 1 2 3 4 5 6 7 8 9 X1 Figur 1: Tillåtet område till uppgift 4 Vad är skuggpriset för villkor (4)? [Använd cb*inv(b) i Matlab.]... Öka högerledet i villkor (4) till 8 (streckad linje i figuren). Hur stor förändring av det optimala målfunktionsvärdet kan förväntas?... Hur mycket förändras det optimala målfunktionsvärdet?... Optimala basvariabler:... Minska högerledet till 4. Vilket optimalvärde förutsäger skuggpriset?... Vad blir optimalvärdet? [Lös det modifierade problemet genom att starta om från basen (x 1,x 2,x 3,x 5,x 6 ).]... Optimala basvariabler:... För vilka högerled i villkor (4) är skuggpriset (för högerledet 7) giltigt? [Utnyttja figuren och enkla beräkningar!]... 2
5. Lös följande problemet (vilket kan laddas in från filen uppgift5). maxz = 6x 1 + 4x 2 + 7x 3 då x 1 + 2x 2 + 3x 3 10 (1) 2x 1 + x 2 + 2x 3 6 (2) 3x 1 + 3x 2 + 4x 3 13 (3) x 1,x 2,x 3 0 Vilka variabler ingår i optimalbasen?... Optimallösning:... Dual optimallösning:... 6. (Ska förberedas.) Antag att ett LP-problem som lösts med simplexmetoden ska utökas med en ny variabel. Hur beräknas dess reducerade kostnad (i aktuell bas)? 7. Antag att problemet i uppgift 5 utökas med en ny variabel, x 7, med målfunktionskoefficient c 7 = 2 och bivillkorskolumn A 7 = (3,0,1) T. Visa med en manuell uträkning att detta leder till att optimum förändras. Inför den nya variabeln i optimaltablån i uppgift 5. (Obs! Skriv in koefficienternas ursprungliga värden.) Utgå från den bas som tidigare var optimal och reoptimera (dvs lös det modifierade problemet). Ny optimallösning: 3
2. Modellering med Ampl 8. (Ska förberedas.) Läs igenom introduktionen till modelleringsspråket Ampl. 9. Kopiera filer till er hemkatalog med cp $KURSBIB/LAB1/*.dat. 10. Betrakta åter problemet i uppgift 4. maxz = 10x 1 + 2x 2 då x 1 + x 2 3 (1) 5x 1 + 2x 2 10 (2) 2x 1 x 2 10 (3) x 1 + x 2 7 (4) x 1 + 3x 2 9 (5) x 1,x 2 0 Lös problemet genom att modellera det i Ampl. Datafilen lpuppgift.dat finns redan på ert konto. Använd parameternamn som överensstämmer med de i datafilen. (Obs! I datafilen ges alla villkor på mindre än-form.) Konstruera själva även den kommandofil som behövs. Optimallösning:... Hur stora är slacken i villkoren?... Dual optimallösning:... Reducerade kostnader:... 11. Ett oljebolag har i Europa en uppsättning raffinaderier, R (se karta, figur 2), med kända kapaciteter K r ton, r R. Dessa raffinaderier skeppar på vatten eller transporterar på land ut en mängd produkter, p P, till en uppsättning terminaler, T. En terminal t T vill ta emot mellan l pt och u pt ton av en produkt p P. Oljebolaget vill maximera intäkter minus kostnader. Försäljningsintäkten f pt per ton av produkt p vid terminal t och tillverkningskostnaden q pr per ton av produkt p vid raffinaderi r är givna. Avståndet från raffinaderi r till terminal t är d rt mil, och kostnaden för att transportera ett ton av en produkt en mil är k. (Man antar för enkelhetens skull att kostnaden för transport på land och till sjöss är lika.) Transportkostnaden blir alltså c rt = kd rt per ton. Oljebolagets problem kan formuleras på följande sätt. Variabeldefinitioner: x pr z prt = producerad mängd av produkt p vid raffinaderi r (ton) = transporterad mängd av produkt p från raffinaderi r till terminal t (ton) 4
Modell: maxz = (f pt c rt )z prt q pr x pr p r t p r då l pt z prt u pt p,t (1) r x pr = z prt p,r (2) t x pr K r r (3) p x pr, z prt 0 (4) Villkorsgrupp (1) ser till att varje terminal får efterfrågad kvantitet. Villkorsgrupp (2) är kopplingen mellan variablerna x pr och z prt, och ser till att det som tillverkas av en viss produkt vid ett visst raffinaderi sedan transporteras ut till terminalerna. Villkorsgrupp (3) ser till att raffinaderiernas kapaciteter inte överskrids. Villkorsgrupp (4), slutligen, följer av variablernas definitioner. Figur 2: Karta till uppgift 11 5
(Ska förberedas) Formulera oljebolagets problem i Ampl. Nedan ges början till en sådan modellfil [som kan kopieras med cp $KURSBIB/LAB1/olja.mod. ]. I Ampl används ofta längre och på så sätt mer förståeliga namn på parametrar, mängder och variabler. De namn som används nedan sammanfaller med de som finns i datafilen olja.dat (som redan kopierats till er hemkatalog). set PRODUKTER; set RAFFINADERIER; set TERMINALER; param ovre{p in PRODUKTER, t in TERMINALER}; param undre{p in PRODUKTER, t in TERMINALER}; param pris{p in PRODUKTER, t in TERMINALER}; param milkostn; param avstand{r in RAFFINADERIER, t in TERMINALER}; param raffkostn{p in PRODUKTER, r in RAFFINADERIER}; param raffkap{r in RAFFINADERIER}; Antal variabler och bivillkor i problemet:... Lös problemet. Optimalt målfunktionsvärde:... Har något raffinaderi kapacitet över?... Vad är skuggpriset för kapaciteten i Nynäshamn?... Vilket optimalt målfunktionsvärde kan förväntas om kapaciteten i Nynäshamn ökar med 10 ton?... Lös det modifierade problemet. Blev resultatet det förväntade? Varför (inte)? Hur förändrades kapacitetsutnyttjandet? Förklara!... Öka kapaciteten i Nynäshamn med ytterligare 40 ton till 550 ton. Överensstämmer skillnaden i målfunktionsvärdet med skuggpriset? Varför (inte)? 6
3. Introduktion till Matlab/Simplex Probleminmatning Detproblemsomskalösasmåsteförstskrivasinpåenfil.Dennafilmåstevaraenmatlabfil och måste därför ha suffixet.m, tex uppg1.m. Filen genereras med hjälp av texteditorn emacs, som startas från bakgrunden med hjälp av mitt-musknappen och XEmacs Efter man har öppnat emacs ska alltid ett nytt dokument öppnas. Börja med att skapa en ny fil med Open och ge filnamn. Följande data måste definieras i matlabfilen: Vektorn c (radvektor) innehållande målfunktionskoefficienterna Matrisen A innehållande bivillkorskoefficienterna Vektorn b (kolumnvektor) innehållande högerledet Problemet ska skrivas på standardform för LP problem, dvs alla villkor ska vara likhetsvillkor (slackvariabler och eventuella artificiella variabler och målfunktion måste alltså läggas till). Exempel: maxz = 3x 1 + 7x 2 då 4x 1 + 5x 2 + s 1 = 7 2x 1 3x 2 + s 2 = 1 x 1,x 2,s 1,s 2 0 motsvaras av filen c = [ 3 7 0 0 ]; A = [ 4 5 1 0 2 3 0 1 ]; b = [ 7 1 ]; Storleken på vektorerna och matrisen måste vara konsistenta. Att transponera en vektor eller matris görs i Matlab genom att man skriver ett efter sista hakparentesen (ex b = [7 1] ger en kolumnvektor). Starta Matlab/Simplex För att kunna använda simplexprogrammet i Matlab krävs att man först öppnar ett terminalfönster genom att klicka på bakgrunden med mittknappen och välja dterm. Därefter skriver man kommandot TAOP07setup i terminalfönstret. Matlab öppnas sedan genom att i samma terminalfönster skriva kommandot matlab. Starta simplexrutinen genom att skriva simplexmeny vid Matlab prompten. 7
Öppna och spara fil samt pivotering Läs in problemet med Öppna (ange ej suffixet.m på filnamnet). Välj därefter en startbas med Ange Bas. Basvariablernas index anges med mellanrum eller komma emellan. Problemet löses genom att använda Pivotera, så länge som optimum inte är uppnått. En tablå sparas undan med kommandot Spara. Fas I och Fas II Först används den artificiella målfunktionen (i c-vektorn) samt de artificiella variablerna i A. När man sedan funnit optimum till fas I-problemet, tar man bort de de artificiella variablerna med Ta Bort Kolumn samt skriver in den ursprungliga målfunktionen i c- vektorn med Ändra Data. Tillägg av variabel Vid tillägg av en ny variabel (kolumn) används Ny Kolumn, där får man ange koefficienterna för denna variabel i målfunktionen och alla bivillkor. Tillägg av bivillkor Ett nytt bivillkor kräver en ny rad och oftast också en ny variabel (kolumn). Om en ny variabel krävs, rekommenderas att man lägger till kolumnen först, se ovan. Lägg till den nya raden, med Ny Rad. Där får man ange koefficienterna för alla variabler, samt högerledet i detta villkor. Efter tillägg av bivillkor måste baslösningen utökas, så att antalet basvariabler blir korrekt. Detta görs med Ange Bas. Det normala är då att de tidigare basvariablerna anges tillsammans med den nya (slack)variabel som introducerats. Ändring av koefficienter i A, b eller c Ändring av en koefficient i någon av de inmatade vektorerna eller matriserna kan göras med Ändra Data. Observera att om ändringen görs med Ändra Data så uppdateras inte den sparade filen förrän man använder Spara. Ändring av data kan också göras i emacsfönstret och sedan läsas in med Öppna fil. Kom i så fall ihåg att skriva ner den aktuella basen, så att man direkt kan nå denna bas genom Ange Bas. Figur 3: Matlab/Simplex 8