• No results found

     

xij = de hoeveelheid die vanuit filiaal i aan klant j wordt geleverd yi =

(

1 als filiaal i wordt gevestigd 0 anders

Dit probleem is als volgt te formuleren als een gemengd geheeltallig programmeringsprobleem:

min            Pm i=1 Pn j=1cijxij+Pm i=1fiyi Pm i=1 xij = dj, j = 1, 2, . . . , n Pn j=1 xij ≤ biyi, i = 1, 2, . . . , m xij≥ 0, 1 ≤ i ≤ m, 1 ≤ j ≤ n 0≤ yi≤ 1, en geheel, 1 ≤ i ≤ m           

11.2 Branch-and-bound

De branch-and-bound methode is een techniek om een geheeltallig programmeringsprobleem op te lossen. Het oorspronkelijke probleem wordt hierbij opgeslitst in deelproblemen, zeg Pk, 1 ≤ k ≤ K, die tezamen equivalent zijn met het oorspronkelijke probleem P0. Veronderstel dat het geheeltallig programmeringsprobleem een maximaliseringsprobleem is en dat we voor het optimum van de deelproblemen boven- en ondergrenzen hebben, zeg zk resp. zk, 1 ≤ k ≤ K. Dan is z = max1≤k≤K zk een bovengrens voor het optimum van P0 en z = max1≤k≤K zk een ondergrens voor het optimum van P0 (ga dit zelf na).

Vaak kunnen deze grenzen worden gevonden zonder de deelproblemen zelf op te lossen. Iedere toegelaten oplossing van een deelprobleem geeft een ondergrens en iedere optimale oplossing van een relaxatie, dit is een afzwakking van het probleem, geeft een bovengrens. Het is handig om de relaxatie zo te kiezen dat deze gemakkelijk is op te lossen, bijv. het bijbehorende LP-probleem. M.b.v. het bovenstaande kunnen we een deelprobleem als afgehandeld beschouwen als zk≤ z. In dit geval is in de verz. van de overige deelproblemen altijd een oplossing die minstens zo goed is als de optimale oplossing van het deelprobleem Pk. Daarnaast is een deelprobleem natuurlijk ook altijd afgehandeld als een optimale oplossing ervan is gevonden of als blijkt dat dit deelprobleem geen toegelaten oplossing bevat.

In het algemeen kent een branch-and-bound aanpak de volgende onderdelen: Bepaling grenzen

Voor de bovengrens nemen we vaak een relaxatie en voor de ondergrens een toegelaten oplossing. Als deze grenzen lastig zijn te bepalen, dan laten we de bepaling ervan meestal achterwege.

Vertakking

Het opslitsen in nieuwe deelproblemen gebeurt vaak via een splitsingsvariabele. Dit is een variabele die geheeltallig moet zijn, zeg x. We splitsen het probleem dan in twee deelproblemen: ´e´en probleem dat uit het vorige ontstaat door daaraan toe te voegen de beperking x ≤ a, en het andere krijgt de beperking x≥ a + 1 voor een zeker geheel getal a. Als in de optimale oplossing van de LP-relaxatie de variabele x een niet-geheeltallige waarde krijgt, zeg x = a + f , met a geheel en 0 < f < 1, dan wordt bovenstaande opsplitsing gemaakt.

Keuze deelprobleem

In iedere iteratie moet een deelprobleem worden gekozen waaraan wordt verder gewerkt. Dit verder werken resulteert dan in `ofwel het vinden van de optimale oplossing ervan, `ofwel het ontdekken dat het probleem ontoelaatbaar is, `ofwel het opsplitsen in nieuwe deelproblemen en deze van grenzen voorzien.

We geven nu eerst een voorbeeld van deze techniek. We nemen hiervoor een geheeltallig lineair programmeringsprobleem en zullen voor de bovengrenzen van de deelproblemen het optimum van de LP-relaxatie nemen (als de data geheel zijn mogen we dit optimum zelfs naar beneden afronden). Voor de ondergrenzen ronden we de optimale oplossing van de LP-relaxatie af op een geheeltallig punt en als dit punt toelaatbaar is voor een (deel)probleem, dan kan de waarde van de doelfunctie in dit punt worden gebruikt als ondergrens. De best bekende toelaatbare oplossing wordt bewaard als x.

Voorbeeld 11.1 max        5x1+ 8x2 x1 + x2 ≤ 6 5x1 + 9x2 ≤ 45 x1, x2 ≥ 0 en geheel        Initialisatie:

Laat z =−∞ en z = −∞. Los de LP-relaxatie van P0 op: x1 = 94, x2 = 154, z =b1654 c = 41. De afgeronde oplossing is x1 = 2, x2 = 4. Deze is niet toelaatbaar en kan dus niet voor een ondergrens worden gebruikt. Kies als splitsingsvariabele x2 en beschouw de deelproblemen: P1: P0 met toegevoegd x2 ≤ 3; P2: P0 met toegevoegd x2 ≥ 4; z1 = z2 = 41.

Iteratie 1:

Kies deelprobleem P1 en los de LP-relaxatie op: x1= 3, x2 = 3 met optimum 39: x1 = 3, x2 = 3 en z = 39. Deelprobleem P1 is nu afgehandeld.

Iteratie 2:

Kies deelprobleem P2 en los de LP-relaxatie op: x1 = 95, x2 = 3, z2 =b41c = 41. De afgeronde oplossing is x1= 2, x2= 4 en deze is niet toelaatbaar. Kies als splitsingsvariabele x1 en beschouw de deelproblemen: P3 : P2 met toegevoegd x1 ≤ 1; P4 : P2 met toegevoegd x1 ≥ 2; z3 = z4 = 41. Iteratie 3:

Kies deelprobleem P3 en los de LP-relaxatie op: x1 = 1, x2 = 409, z2=b3659 c = 40. De afgeronde oplossing is x1 = 1, x2 = 4; deze is toelaatbaar met waarde 37, wat geen verbetering is van

de best bekende ondergrens 39. Kies als splitsingsvariabele x2 en beschouw de deelproblemen: P5: P3 met toegevoegd x2 ≤ 4; P6: P3 met toegevoegd x1 ≥ 5; z5 = z6 = 40.

Iteratie 4:

Kies deelprobleem P4 en los de LP-relaxatie op: P4 is ontoelaatbaar en daarmee afgehandeld. Iteratie 5:

Kies deelprobleem P5 en los de LP-relaxatie op: x1 = 1, x2 = 4 met waarde 37, wat geen verbetering is van de best bekende oplossing, zodat P5 ook is afgehandeld.

Iteratie 6:

Kies deelprobleem P6 en los de LP-relaxatie op: x1= 0, x2 = 5 met optimum 40: x

1 = 0, x 2 = 5 en z = 40. Deelprobleem P6 is nu ook afgehandeld. Omdat dit er nu geen deelprobleem meer over is, zijn we klaar met optimale oplossing: x1 = 0, x2 = 5 en waarde 40.

De branch-and-bound techniek kan ook worden toegepast op een gemengd geheeltallig program-meringsprobleem. Om van de branch-and-bound techniek een algoritme te maken moeten nadere keuzes worden gespecificeerd, zoals:

- Welk deelprobleem wordt gekozen om nader te onderzoeken? - Welke variabele wordt als splitsingsvariabele gekozen?

Voor de keuze van het deelprobleem bestaan diverse strategie¨en waarvoor argumenten aanwezig zijn die voor die strategie pleiten. Zo zouden we het deelprobleem kunnen kiezen met de hoogste bovengrens. Als we erin slagen dit probleem exact op te lossen, dan hopen we daarmee een goede oplossing en hoge waarde voor z gevonden te hebben, waardoor een groot aantal deelproblemen niet meer onderzocht hoeft te worden omdat daarvoor zk≤ z.

Een andere strategie die vaak wordt gebruikt is om het laatste deelprobleem te kiezen. De argumentatie hiervoor is een praktische: dit probleem hebben we direct beschikbaar en maakt de implementatie eenvoudig. Voor het oplossen van een LP-relaxatie hoeft namelijk het LP-probleem niet van vooraf aan opgelost te worden. Zo’n LP-relaxatie komt uit een vorig LP-probleem met daaraan toegevoegd ´e´en nieuwe beperking. Dit houdt in dat de duale oplossing toelaatbaar blijft. Hiervoor is een speciale versie van de simplex methode, genaamd de duale simplex methode, zeer geschikt. Vaak is slechts ´e´en extra iteratiestap voldoende om de nieuwe optimale oplossing te vinden. Als we als deelprobleem om nader te onderzoeken het laatst gecre¨eerde deelprobleem nemen, dan hebben we het oude LP-tableau direct tot onze beschikking. Dit vergemakkelijkt de implementatie.

Ook voor de keuze van de splitsingsvariabele is een aantal strategie¨en op te stellen. Laat fi = wi− bwic voor de geheeltallige variabele xi die (in de oplossing van de LP-relaxatie) een niet-geheeltallige waarde wi heeft.

a. De grootste fractie regel: kies als splitsingsvariabele de variabele xi met min(fi, 1− fi) maximaal. Door de variabele met de grootste fractie te kiezen hopen we dat de grenzen van de bijbehorende deelproblemen zo laag worden dat ze daardoor kunnen worden afgehandeld. b. De kleinste fractie regel: kies als splitsingsvariabele de variabele ximet min(fi, 1−fi) minimaal. Door de variabele met de kleinste fractie te kiezen hopen we in de bijbehorende deelproblemen een goede oplossing te vinden.

c. De grootste co¨effici¨ent regel: kies als splitsingsvariabele de variabele xi die in de doelfunctie de grootste co¨effici¨ent heeft. Hiermee hopen we hetzelfde te beogen als met de grootste fractie regel.

d. De kleinste co¨effici¨ent regel: kies als splitsingsvariabele de variabele xi die in de doelfunctie de kleinste co¨effici¨ent heeft. Hiermee hopen we hetzelfde te beogen als met de kleinste fractie regel.

Het lijkt verstandig de regels b en d in het begin van het algoritme toe te passen en a en c later. Impliciete enumeratie

Voor problemen waarin de variabelen alleen de waarden 0 of 1 kunnen aannemen, zoals in com-binatorische problemen vaak voorkomt, geeft de LP-relaxatie veel minder informatie dan voor algemene geheeltallige problemen. Ook is de opsplitsing x = 0 of x = 1 een triviale. We kunnen deze opsplitsing dus direct maken zonder eerst een LP-probleem op te lossen.

Voor dit soort problemen mogen we wel aannemen dat alle co¨effici¨enten van de doelfunctie niet-negatief zijn; als dit namelijk niet zo is, dan vervangen we deze x door het complement 1− x en dat is weer een (0, 1)-variabele. Een bovengrens van een deelprobleem krijgen we door de nog niet gefixeerde variabelen 1 te nemen.

In plaats van de LP-relaxatie testen we wat het gevolg is van x = 0 of x = 1. Als x = 0 ontoe-laatbaarheid geeft, dan fixeren we x op de waarde 1; als x = 0 tot gevolg heeft dat geen betere oplossing kan worden bereikt dan een reeds verkregen oplossing, dan nemen we x = 1.

We illustreren de impliciete enumeratie aan de hand van het volgende voorbeeld. Hierin wordt als splitsingsvariabele de variabele met de hoogste co¨effici¨ent in de doelfunctie gekozen en als deelprobleem om nader te onderzoeken het laatste deelprobleem dat is gecre¨eerd.

Voorbeeld 11.2 max            10x1+ 10x2+ 9x3+ 6x4+ 5x5+ 3x6 −2x1+ x2+ 4x3− 3x4+ 6x5− 2x6 ≤ 2 x1− 2x2+ 3x3+ x4− 3x5− 5x6 ≤ −3 − x1+ 2x2− 2x3+ 4x4− x5+ 5x6 ≤ 4 x1, x2, . . . , x6 ∈ {0, 1}            Iteratie 1:

Neem x1 als splitsingsvariabele: P1 : x1 = 0 met grens 33; P2 : x1= 1 met grens 43. Iteratie 2:

Kies deelprobleem P2 en neem x2 als splitsingsvariabele: P3 : x1 = 1, x2 = 0 met grens 33; P4: x1 = x2 = 1 met grens 43.

Iteratie 3:

Kies deelprobleem P4 en neem x3 als splitsingsvariabele: P5 : x1 = x2 = 1, x3 = 0 met grens 34; P6: x1 = x2= x3= 1 met grens 43.

Iteratie 4:

Kies deelprobleem P6.

Als x5 = 1, dan kan aan de eerste beperking niet meer worden voldaan, dus x5 = 0. Met x5= 0 kan aan de tweede beperking alleen worden voldaan als x4 = 0 en x6= 1. Dit geeft de toelaatbare oplossing: x

Iteratie 5:

Kies deelprobleem P5. Om een betere oplossing dan x te krijgen moet x4 = x5 = x6 = 1, maar dat geeft geen toelaatbare oplossing.

Iteratie 6:

Kies deelprobleem P3. Om een betere oplossing dan x te krijgen moet x3 = x4 = x5 = x6 = 1, maar ook dat geeft geen toelaatbare oplossing.

Iteratie 7:

Kies het laatste deelprobleem P2. Om een betere oplossing dan x te krijgen moet x2 = x3 = x4= x5 = x6 = 1, maar ook dat geeft geen toelaatbare oplossing.

De optimale oplossing is dus: x1 = x2∗ = x3∗ = x6∗ = 1, x4∗ = x5∗ = 0 met waarde 32.

Opmerking

In beide versies (LP-relaxatie of impliciete enumeratie) van de branch-and-bound methode hebben we steeds een aantal nog nader te onderzoeken deelproblemen. De vraag is hoe deze het beste onthouden kunnen worden zonder exorbitant veel geheugen te gebruiken. Het is een afweging tussen enerzijds een minimum aan informatie, maar dan wel bepaalde berekeningen te moeten herhalen (bijv. het opnieuw vinden van een optimaal LP-tableau) en anderzijs veel informatie be-waren. Bij branch-and-bound gebaseerd op LP-relaxaties bewaart men vaak, behalve de grenzen van het deelprobleem en de lijst van beperkingen waarmee dit deelprobleem is verkregen vanuit het oorspronkelijke probleem, de lijst van variabelen die in het optimale tableau in de basis zitten. Hiermee is snel het optimale tableau weer te vinden (in feite vereist dit ´e´en matrixinversie). Bij impliciete enumeratie bewaart men meestal, naast de grenzen van het deelprobleem, een lijst met de variabelen die gefixeerd zijn en de waarden (0 of 1) van deze variabelen.

Knapzakprobleem

Een combinatorisch probleem met slechts ´e´en beperking heet een knapzakprobleem. Een zinvolle en niet-triviale formulering hiervan heeft altijd positieve co¨effici¨enten in doelfunctie en beperkingen. Hiermee kan, eventueel na hernummering van de variabelen, het probleem worden geformuleerd als max ( Pn j=1pjxj Pn j=1ajxj ≤ b xj ∈ {0, 1}, j = 1, 2, . . . , n ) , waarbij p1 a1p2 a2 ≥ · · · ≥ pn an ≥ 0.

Bij knapzakproblemen kan eenvoudig gebruik worden gemaakt van grenzen via de LP-relaxaties; de optimale oplossing van de LP-relaxatie is namelijk direct te bepalen. Omdat pj

aj beschouwd kan worden als de bijdrage aan de doelfunctie per eenheid van de beschikbare hoeveelheid b, nemen we eerst x1 = 1, daarna x2 = 1, totdat de resterende toe te kennen hoeveelheid, zeg b−Pk

j=1aj

kleiner is dan ak+1. In dat geval krijgt de variabele xk+1 de resterende waarde b−

Pk j=1aj

ak+1 . Als de co¨effici¨enten geheel zijn, dan kunnen we het gevonden LP-optimum nog naar beneden afronden.

Voorbeeld 11.3 max ( 16x1+ 22x2+ 12x3+ 8x4 5x1+ 7x2+ 4x3+ 3x4 ≤ 14 x1, x2, x3, x4∈ {0, 1} ) Iteratie 1:

De LP-relaxatie geeft x1 = x2 = 1, x3 = 12, x4 = 0 met bovengrens 44.

Neem x3als splitsingsvariabele: P1 : x3 = 0 met bovengrens 43 (voor x1= x2 = 1, x3= 0, x4 = 23); P2: x3 = 1 met bovengrens 43 (voor x1 = 1, x2 = 57, x3 = 1, x4 = 0).

Iteratie 2:

Kies deelprobleem P2 en splits dit in P3 : x2 = 0 met kandidaat-oplossing x

1 = 1, x

2 = 0, x 3 = x4 = 1 met waarde 36 en P4 : x2 = 1 en hieruit volgt, op grond van logische conclusies, de kandidaat-oplossing x 1= 0, x 2 = x 3= x 4 = 1 met waarde 42. Iteratie 3:

Neem het enig overgebleven deelprobleem P1. Om een betere oplossing te krijgen, d.w.z. 16x1+ 22x2+ 8x4 ≥ 43, moet gelden x1 = x2 = x3 = 1, maar dit is in strijd met de beperking van het probleem.

De optimale oplossing van het probleem is dus: x1= 0, x2 = x3= x4 = 1 met waarde 42.