Kolumngenerering

Kolumngenerering eller fördröjd kolumngenerering är en effektiv algoritm för att lösa stora linjära program .

Den övergripande tanken är att många linjära program är för stora för att explicit överväga alla variabler. Tanken är alltså att börja med att lösa det betraktade programmet med endast en delmängd av dess variabler. läggs variabler som har potential att förbättra målfunktionen till programmet. När det är möjligt att påvisa att lägga till nya variabler inte längre skulle förbättra värdet av den objektiva funktionen, stoppas proceduren. Förhoppningen när man tillämpar en kolumngenereringsalgoritm är att endast en mycket liten del av variablerna kommer att genereras. Denna förhoppning stöds av det faktum att i den optimala lösningen kommer de flesta variabler att vara icke-grundläggande och anta värdet noll, så den optimala lösningen kan hittas utan dem.

I många fall tillåter denna metod att lösa stora linjära program som annars skulle vara svårhanterliga. Det klassiska exemplet på ett problem där det framgångsrikt används är styckningsbeståndsproblemet . En speciell teknik inom linjär programmering som använder denna typ av tillvägagångssätt är Dantzig-Wolfe-sönderdelningsalgoritmen . Dessutom har kolumngenerering tillämpats på många problem som besättningsschemaläggning , fordonsdirigering och det kapaciterade p-medianproblemet.

Algoritm

Algoritmen tar hänsyn till två problem: huvudproblemet och delproblemet. Huvudproblemet är det ursprungliga problemet med endast en delmängd av variabler som beaktas. Delproblemet är ett nytt problem skapat för att identifiera en förbättrad variabel ( dvs. som kan förbättra huvudproblemets objektiva funktion) .

Algoritmen fortsätter sedan enligt följande:

  1. Initiera huvudproblemet och delproblemet
  2. Lös huvudproblemet
  3. Sök efter en förbättrad variabel med delproblemet
  4. Om en förbättrad variabel hittas: lägg till den i huvudproblemet och gå sedan till steg 2
  5. Annars: Lösningen av masterproblemet är optimal. Sluta.

Att hitta en förbättrad variabel

Den svåraste delen av denna procedur är hur man hittar en variabel som kan förbättra huvudproblemets objektiva funktion . Detta kan göras genom att hitta variabeln med den mest negativa reducerade kostnaden (förutsatt att problemet är ett minimeringsproblem utan förlust av allmänhet) . Om ingen variabel har en negativ reducerad kostnad, är den nuvarande lösningen av huvudproblemet optimal.

När antalet variabler är mycket stort är det inte möjligt att hitta en förbättrande variabel genom att beräkna all reducerad kostnad och välja en variabel med negativ reducerad kostnad. Därför är tanken att endast beräkna den variabel som har den lägsta reducerade kostnaden. Detta kan göras med hjälp av ett optimeringsproblem som kallas prissättningsproblemet som starkt beror på strukturen av det ursprungliga problemet. Delproblemets objektiva funktion är den reducerade kostnaden för den sökta variabeln i förhållande till de aktuella dubbla variablerna, och begränsningarna kräver att variabeln följer de naturligt förekommande begränsningarna. Kolumngenereringsmetoden är särskilt effektiv när denna struktur gör det möjligt att lösa delproblemet med en effektiv algoritm, vanligtvis en dedikerad kombinatorisk algoritm .

Vi beskriver nu hur och varför man beräknar den reducerade kostnaden för variablerna. Betrakta följande linjära program i standardform:

som vi kommer att kalla det primära problemet såväl som dess dubbla linjära program :

Låt dessutom och vara optimala lösningar för dessa två problem som kan tillhandahållas av vilken linjär lösare som helst. Dessa lösningar verifierar begränsningarna för deras linjära program och har, genom dualitet , samma värde av objektiv funktion ( ) som vi kallar . Detta optimala värde är en funktion av de olika koefficienterna för det primära problemet: . Observera att det finns en dubbel variabel för varje begränsning av den primära linjära modellen. Det är möjligt att visa att en optimal dubbelvariabel kan tolkas som den partiella derivatan av det optimala värdet för målet funktion med avseende på koefficienten på den högra sidan av begränsningarna: ou encore . Enklare uttryckt, indikerar med hur mycket som lokalt ökar det optimala värdet för objektivfunktionen när koefficienten ökar med en enhet.

Tänk nu på att en variabel inte beaktades förrän då i det primära problemet. Observera att detta motsvarar att säga att variabeln fanns i modellen men tog ett nollvärde. Vi kommer nu att observera effekten på det primära problemet med att ändra värdet på från till . Om och är respektive koefficienter som är associerade med variabeln i objektivfunktionen och i begränsningarna så ändras det linjära programmet som följer:

För att veta om det är intressant att lägga till variabeln till problemet ( dvs för att låta det ta ett värde som inte är noll), vill vi veta om värdet för objektivfunktionen för detta nya problem minskar när värdet för variabeln ökar. Med andra ord vill vi veta . För att göra detta, notera att kan uttryckas enligt värdet av den objektiva funktionen för det initiala primala problemet: . Vi kan sedan beräkna det derivat som intresserar oss:

Med andra ord, effekten av att ändra värdet på värdet översätts till två termer . För det första påverkar denna förändring direkt objektivfunktionen och för det andra modifieras den högra sidan av begränsningarna vilket påverkar de optimala variablerna vars storlek mäts med hjälp av de dubbla variablerna . Derivatan reducerade kostnaden för variabeln och kommer att betecknas med i det följande.