Snitplansmetoden

Fra Wikipedia, den frie encyklopædi
Gå til: navigation, søg
Searchtool.svg Eftersyn
Denne artikel bør gennemlæses af en person med fagkendskab for at sikre den faglige korrekthed.

Snitplansmetoden (engelsk: cutting plane method) er en metode som benyttes til iterativt at styrke en matematisk formulering af et problem ved hjælp af lineære uligheder. Disse uligheder kaldes snit (engelsk: cuts) idet de snitter noget af det brugbare område af. Snitplansmetoden er oftest brugt i forbindelse med heltalsprogrammering hvor en funktion ønskes minimeret/maksimeret over heltallene i en given mængde. Metoden bruges inden for disciplinen matematisk optimering eller matematisk programmering.

Metoden er som nævnt en iterativ proces, hvor man i en given iteration løser en såkaldt lineær relaksering (engelsk: linear relaxation) af det givne heltalsprogram. Teorien bag lineær programmering (engelsk: linear programming) fortæller os, at givet at det lineære program har en optimal løsning og at det brugbare område ikke indeholder en linie, så kan en optimal løsning findes i et hjørnepunkt af det brugbare område[1]. Når en optimal løsning til det lineære program er fundet, testes denne løsning for om den er heltallig. Hvis det er tilfældet, er denne løsning optimal til det oprindelige heltalsprogram. Hvis der derimod findes en variabel som skal være heltallig, men som er en brøk, fortæller teorien om konvekse mængder, at der eksisterer en ulighed, som separerer dette givne hjørnepunkt fra det konvekse hylster af heltallene i det brugbare område[2]. At finde en sådan ulighed kaldes separationsproblemt (engelsk:separation problem) og den givne ulighed kaldes et snit. Ideen er så at tilføje denne nyfundne ulighed til det oprindelige lineære program for så at genløse problemet. Dette gentages indtil en optimal heltalsløsning er fundet.


Teori[redigér | redigér wikikode]

Lad \mathcal{X} være det brugbare område for et lineært blandet heltalsprogram. Så kan vi skrive \mathcal{X} som

\mathcal{X}:=\{x\in\mathbb{R}^n\ :\ Ax\leq x, l_j\leq x_j\leq u_j,\ x_j\in\mathbb{Z}^n \text{ for nogle } j\in\{1,\dots,n\}\}

For at gøre den følgende præsentation uafhængig starter vi med at definere den lineære relaksering af \mathcal{X} som

\bar{\mathcal{X}}:=\{x\in\mathbb{R}^n\ :\ Ax\leq b, l_j\leq x_j\leq u_j\}

hvilket vil sige, at \bar{\mathcal{X}} blot er \mathcal{X} hvor vi har relakseret heltalskravet for de før heltallige variable. Vi får således, at

 \mathcal{X}\subseteq\bar{\mathcal{X}}

På denne måde får vi, at hvis vi maksimere en funktion over \bar{\mathcal{X}} i stedet for \mathcal{X} får vi et optimistisk bud på den optimale løsningsværdi for det blandede heltalsprogram. Dette skyldes, lidt simpelt sagt, at vi kan vælge mellem flere løsninger i \bar{\mathcal{X}} end i \mathcal{X}. Der er dog den fordel, at maksimering af en lineær funktion over den linære relaksering er nemt sammelignet med at gøre det samme over \mathcal{X} (et lineært program kan under milde antagelser løses i polynomiel tid ved hjælp Ellipse-metoden hvorimod løsning af generelle blandede heltalsprogrammer er NP-hård[3]). Fra teorien om konvekse mængder ved vi, at det konvekse hylster af \mathcal{X} har heltalshjørnepunkter[4]. Lad i det følgende det konvekse hylster af \mathcal{X} være givet som  \text{conv}(\mathcal{X}). At  \text{conv}(\mathcal{X}) har heltalshjørner betyder, at vi principielt kan løse det blandede heltalsprogram

 \max\{ c^Tx\ :\ x\in\mathcal{X}\}

som det lineære program

 \max\{ c^Tx\ :\ x\in\text{conv}(\mathcal{X})\}

Det er dog ikke helt trivielt hvorledes man skulle finde en repræsentation af  \text{conv}(\mathcal{X}). Vi kan dog ved hjælp af snitplaner (i teorien) lave en repræsentation af den relevante del af  \text{conv}(\mathcal{X}). Snitplansmetoden løser først den lineære relaksering af heltalsprogrammet

 \max\{c^Tx\ :\ x\in\bar{\mathcal{X}}\}

Det vil sige, at vi har droppet heltals kravene. Hvis den optimal løsning  x^* er heltallig, kan vi stoppe med denne løsning som en optimal løsning til det blandede heltalsprogram (da  c^Tx^* er et optimistisk bud på den optimale løsningsværdi har vi at  c^Tx^*\geq c^Tx for all  x\in\mathcal{X} og da  x^* er heltallig er  x^*\in\mathcal{X} hvorved  x^* er optimal). Ellers er målet nu at finde en ulighed  \pi x\leq\pi_0 således, at  \pi x\leq\pi_0 er valid for alle punkter i  \text{conv}(\mathcal{X}), men sådan at  \pi x^*>\pi_0. Når en sådan ulighed er fundet tilføjes denne til matricen  (A,b) og det nu opdaterede lineære program løses igen. Processen fortsættes til man har en heltalsløsning eller til man ikke kan separere flere uligheder. Skematisk kan dette opstilles på følgende måde

  1. Løs den lineære relaksering. Lad x^* være en optimal løsning.
  2. Hvis x^* er heltallig stop da; x^* er en optimal løsning til det blandede heltalsprogram.
  3. Ellers find en lineær ulighed som er valid for alle heltalsløsninger til det blandede haltalsprgram men som er brudt af x^*. Tilføj denne til den lineære relaksering. Gå til 1..

I praksis benytter man sjældent den rene form af snitplansmetoden men kombinerer den i stedet med for eksempel branch-and-bound eller branch-and-price. Ofte separeres en bestemt type problemspecifikke uligheder som man ved virker godt for det givne problem. Det er dog vist, at under tekniske antagelser konvergerer snitplansmetoden mod en optimal løsning til det blandede heltalsprogram[5].

Chvatal-Gomory-snit[redigér | redigér wikikode]

En meget simpel måde at finde valide snitplaner på, er ved at danne en vægtet sum af rækkerne i matricen  A for så at runde de resulterende coefficienter ned til nærmeste hele tal. For at være mere præcis, lad

\mathcal{X}:=\{x\in\mathbb{Z}^n\ :\ Ax\leq x\}

være den brugbare mængde for et heltalsproblem. Endvidere lad  u\in\mathbb{R}^m_+ være en vektor med samme antal indgange som der er rækker i matricen  A. Da vil

 u^TAx\leq u^Tb

være en brugbar ulighed for  \text{conv}(\mathcal{X}). Da der for alle søjlerne i  A gælder  \lfloor u^TA_j\rfloor\leq u^TA_j får vi, at

 \sum_{j=1}^n \lfloor u^TA_j\rfloor x_j\leq u^Tb

ligeledes er en valid ulighed for  \text{conv}(\mathcal{X}) (vær opmærksom på, at  \lfloor y\rfloor angiver det største hele tal mindre end  y). Vi kan nu observere, at da alle koefficienterne på venstre side i den ovenstående ulighed er heltallige og at variablene også er heltallige, så vil venstresiden i uligheden altid være heltallig. Det betyder, at vi også kan runde højresiden til største heltal mindre end  u^Tb. På denne måde opnås den valide ulighed

 \sum_{j=1}^n \lfloor u^TA_j\rfloor x_j\leq \lfloor u^Tb\rfloor.

Denne nye ulighed kan nu tilføjes det oprindelige system og en ny vægt-vektor  u kan nu vælges. Ved at variere u opnåes det der kaldes den første Chvatal-afslutning (engelsk: first Chvatal closure) af  \{x\in\mathbb{R}^n\ :\ Ax\leq b\}[6]. Vi opnår således

 \begin{align}\{x\in\mathbb{R}^n\ :\ Ax\leq b\}&\supseteq \{x\in\mathbb{R}^n\ :\ Ax\leq b,\ \sum_{j=1}^n \lfloor u^TA_j\rfloor x_j\leq \lfloor u^Tb\rfloor, \forall u\in\mathbb{R}^m_+\}\\ &\supseteq\text{conv}(\mathcal{X})\end{align}

Det vil altså sige, at vi opnår en bedre beskrivelse af \text{conv}(\mathcal{X}) ved hjælp af den første Chvatal afslutning end vi gør ved den lineære relaksering. Vi kan dog ikke forvente, at den første Chvátal afslutning er identisk med det konvekse hylster af \mathcal{X}.

Desværre er det et NP-hårdt spørgsmål, om der eksisterer et validt Chvátal-Gomory-snit som separarer den nuværende løsning til den lineære relaxering fra  \text{conv}(\mathcal{X}), hvorfor det også er NP-hårdt at optimere over den resulterende polytop [7]. For en fremgangsmåde til at løse separationsproblemet for Chvatal snit henvises der til den nyligt udgivne artikel af Fischetti og Lodi[8] hvor en separationsprocedure er givet og eksperimentelle resultater der underbygger disse snits anvendelighed er forelagt.

Cover snit/uligheder[redigér | redigér wikikode]

I dette afsnit vil cover uligheder for det brugbare område til det meget studerede rygsækproblem (engelsk: knapsack problem) blive udledt. Vi starter med at definere rygsækproblemet: Vi er givet  n artikler som vi ønsker at fylde i en rygsæk. Hver artikel  i har en vægt/størrelse her kaldet  w_i og en værdi, her kaldet p_i. Rygsække har en kapacitet, c som ikke kan overskrides. Rygsækproblemet er således at maksimere ryksækkens værdi uden at overskride kapaciteten. Problemet kan opskrives matematisk som

 \max \sum_{i=1}^n p_ix_i \text{ under bibetingelse af: } \sum_{i=1}^nw_ix_i\leq c\text{ og } x\in\{0,1\}^n

hvor x_i=1 hvis artikel  i kommes i rygsækken og nul ellers. Lad nu  \mathcal{C}\subseteq\{1,\dots,n\} være sådan at \sum_{i\in\mathcal{C}}w_i>c. Da kalder vi \mathcal{C} et cover af rygsækken. Det skulle være åbenlyst at vi ikke kan putte alle artiklerne fra \mathcal{C} i rygsækken uden at kapacitetsbegrænsningen bliver brudt. Lader vi så \vert S\vert være antallet af elementer i en mængde S opnår vi følgende valide ulighed for rygsæk problems:

\sum_{i\in\mathcal{C}}x_i\leq \vert\mathcal{C}\vert-1

som blot udtrykker, at ikke alle artikler i \mathcal{C} kan puttes i rygsækken samtidig. Hvis \mathcal{C} er således, at vi ikke kan fjerne en artikel uden at \mathcal{C} taber sin egenskab af at være et cover, så siger vi at \mathcal{C} er et minimalt cover. Matematisk er \mathcal{C} et minimalt cover hvis følgende to betingelser er opfyldte:

  1. \sum_{i\in\mathcal{C}}w_i>c
  2.  \sum_{i\in\mathcal{C}\setminus\{j\}}w_i\leq c,\quad \forall j\in\mathcal{C}

Hvis vi såldes ved, at \mathcal{C} er et minimalt cover kan vi udlede en stærkere ulighed ved at betragte \mathcal{C}'s udvidelse (engelsk: extension):

E(\mathcal{C})=\mathcal{C}\cup\{i\not\in\mathcal{C}\ :\ w_i\geq\max_{j\in\mathcal{C}}w_j\}

Da vi ved, at vi ikke kan putte alle artiklerne fra \mathcal{C} i ryksækken ved vi også, at vi ikke kan lave en kombination af artikler fra  E(\mathcal{C}) med mere en  \vert\mathcal{C}\vert-1 elementer uden at ryksækkens kapacitet bliver brudt. Derfor er den udvidede cover ulighed

 \sum_{i\in E(\mathcal{C})}x_i\leq \vert\mathcal{C}\vert-1

ligeledes valid for det brugbare område for rygsækproblemet. Man bør notere sig, at man kan benytte cover uligheder som snitplaner for mange heltalsproblemer. Så snart det beskrivelsen af det brugbare område indeholder en ulighed tilsvarende kapacitetsbegrænsningen i rygsækproblemet, kan cover uligheder benyttes.

Separation af cover uligheder[redigér | redigér wikikode]

I dette afsnit antager vi, at vi har en vektor \hat{x}\in\mathbb{R}^n som vi gerne vil separare fra det konvekse hylster af heltalsløsninger til rygsækproblemet vha. en cover ulighed. For at finde en cover ulighed som er mest brudt, kan vi notere os, at

\sum_{i\in\mathcal{C}}x_i\leq \vert\mathcal{C}\vert-1 \Leftrightarrow \sum_{i\in \mathcal{C}}(1-x_i)\geq 1

Det betyder, at hvis vi kan finde et cover  \mathcal{C}, som opfylder \sum_{i\in \mathcal{C}}(1-\hat{x}_i)< 1 så har vi fundet et cover som separerer \hat{x} fra det konvekse hylster af heltalsløsninger til rygsækproblemet. Den mest brudte cover ulighed finder vi således ved at løse optimerings problemet

\min\sum_{i =1}^n(1-\hat{x}_i)z_i, \text{ u.b. } \sum_{i=1}^nw_iz_i\geq c+1,\text{ og } z\in\{0,1\}^n

En optimal løsning til dette problem, lad os kalde den z^* vil således definere et cover givet ved

 \mathcal{C}=\{i\in\{1,\dots,n\}\ :\ z_i=1\}

Hvis den optimale løsningsværdi \gamma^*=\sum_{i=1}^n(1-\hat{x}_i)z_i^* er strengt mindre end 1, da separerer den resulterende cover ulighed

 \sum_{i\in\mathcal{C}}x_i\leq \vert\mathcal{C}\vert-1

punktet \hat{x} fra det konvekse hylster af heltalsløsniger til rygsækproblemt.

Man bør notere sig følgende: For at finde den mest brudte cover ulighed skulle heltalsprogrammet

\min\sum_{i =1}^n(1-\hat{x}_i)z_i, \text{ u.b. } \sum_{i=1}^nw_iz_i\geq c+1,\text{ og } z\in\{0,1\}^n

løses. Hvis vi komplimentere variablene z_i=1-y_i, substituerer i ovenstående heltalsprogram og flytter lidt rundt på tingene opnår vi følgende optimeringsproblem

\sum_{i=1}^n(1-\hat{x}_i) -\max\sum_{i=1}^n(1-\hat{x}_i)y_i\text{ u.b. } \sum_{i=1}^nw_iy_i\leq \bar{c}\text{ og } y\in\{0,1\}^n

hvor \bar{c}=\sum_{i=1}^nw_i-(c+1). Dette er præcis et rygsækproblem i variablene y hvorfor det altså kræver at vi løser et rygsækproblem for at finde en ulighed til rygsækproblemet vi gerne ville løse. Derfor er det heller ikke beregningsmæssigt forsvarligt, at benytte sig af snitplansmetoden baseret på cover uligheder hvis man ønsker at løse rygsækproblemet. Hvis man nu derimod har et meget svært problem med tusindvis af lineære uligheder, kan man benytte cover uligheder som en del af snitplansmetoden til at styrke sin formulering.

Referencer[redigér | redigér wikikode]

  1. Bertsimas, D.; Tsitsiklis, J. (1997). Introduction to Linear Optimization. , kapitel 2.6 og sætninger heri.
  2. Bazaraa, M.; Sherali, H.; Shetty, C. (2006). Nonlinear Programming: Theory and Algorithms (3. udg.).  Theorem 2.4.4
  3. Nemhauser, G.; Wolsey, L. (1988). Integer and Combinatorial Optimization.  kapitel I.5 Proposition 5.2.
  4. Nemhauser, G.; Wolsey, L. (1988). Integer and Combinatorial Optimization.  kapitel I.4 Theorem 6.3.
  5. Nemhauser, G.; Wolsey, L. (1988). Integer and Combinatorial Optimization.  kapitel II.4 afsnit 3
  6. Bertsimas, D.; Weismantel, R. (2005). Optimization over Integers. 
  7. Karp, R. M.; Papadimitriou, C. H. (1982). "On linear characterizations of combinatorial optimization problems". SIAM Journal on Computing 11 (4): 620-632. 
  8. Fischetti, M.; Lodi, Andrea (2007). "Optimizing over the first Chvátal closure". Mathematical Programming 110 (1): 2-20. doi:10.1007/s10107-006-0054-8.