C A P I T O L U L I
PROGRAMARE ÎN NUMERE ÎNTREGI
§ 1. Specificul
programării în numere întregi
Este binecunoscut faptul că modelarea prin
programare liniară reprezintă un mijloc
puternic și eficace pentru studiul proceselor economice în vederea
îmbunătățirii performanțelor acestora.
O proprietate foarte importantă a
variabilelor de decizie, dintr-un program liniar era aceea că, o dată cu două
valori permise, puteau lua orice altă valoare intermediară; această
proprietate de a putea varia continuu era
esențială în fundamentarea metodelor de determinare a soluțiilor optime.
Nu puține sunt situațiile practice,
modelate cu ajutorul programării liniare în care unele variabile de decizie nu
au sens economic decât dacă au numai valori întregi.
De exemplu, dacă outputul unei
activități este măsurat în unități indivizibile
este clar că valorile permise ale variabilei care indică nivelul activității
respective trebuie să fie numere întregi. La fel, repartizarea personalului
muncitor, al utilajelor sau al mijloacelor de transport pe diverse activități
trebuie exprimată tot prin cantități întregi.
Exemplul 1.1 [4] Un fermier are nevoie de 107 funți de
îngrășământ pe care îl poate procura fie în saci de 35 funți la prețul de 14 $
sacul, fie în saci de 24 funți a 12 $ fiecare. Obiectivul său este de a cumpăra
cantitatea necesară de îngrășământ la cel mai mic cost.
Notând cu x1, x2
numărul sacilor de 35 funți, respectiv 24 funți cumpărați de fermier, modelul
situației descrise arată astfel:
În modelul rezultat, condiția x1, x2 întregi înseamnă pur și simplu că fermierul nu poate cumpăra o jumătate sau o treime de sac; ori cumpără un sac întreg ori nu. Fără această condiție avem de a face cu o problemă uzuală de programare liniară.
Poate mai importante sunt situațiile în care trebuie luate decizii de tip da sau nu ca de exemplu:
se poate aproba realizarea unui anumit proiect de dezvoltare ?
se poate iniția o activitate implicând un anumit cost fix de pregătire ?
se poate amplasa o facilitate (unitate productivă, depozit, magazin) într-un anumit loc ?
Existând doar două posibilități, de a amplasa sau de a respinge, asemenea decizii pot fi reprezentate prin variabile cu numai două valori permise, 0 sau 1:
1, dacă decizia este afirmativă;
0, dacă decizia este negativă.
Exemplul 1.2 [7 ] În cadrul unui proiect mai general de extindere și dezvoltare, conducerea unei firme studiază oportunitatea construirii unei noi fabrici fie în orașul A, fie în orașul B, poate chiar în amândouă și a cel mult un depozit într-unul din cele două orașe, alegerea amplasamentului fiind însă condiționată de construirea unei fabrici în localitatea respectivă. În tabelul 1.1. sunt indicate: valoarea prezentă netă a diferitelor alternative, capitalul necesar acestor investiții și capitalul disponibil pentru întregul proiect de dezvoltare.
milioane $
Nr. crt. |
Alternativa decizională |
Variabila de decizie |
Valoarea prezentă netă |
Capitalul necesar |
1 |
Construirea unei fabrici în A |
x1 |
9 |
6 |
2 |
Construirea unei fabrici în B |
x2 |
5 |
3 |
3 |
Construirea unui depozit în A |
x3 |
6 |
5 |
4 |
Construirea unui depozit în B |
x4 |
4 |
2 |
Capital disponibil |
10 |
Tabelul 1.1.
Condițiile specificate în proiectul de dezvoltare se formalizează astfel:
cel mult un depozit poate fi construit: x3 + x4 ≤ 1
(deoarece x3, x4 nu pot lua decât valorile 0 sau 1, se elimină posibilitatea construirii a două depozite în ambele orașe deoarece x3 = 1, x4 = 1 nu satisfac inegalitatea !)
depozitul nu poate fi construit în lipsa unității productive: x3 ≤ x1, x4 ≤ x2
(este clar că x1 = 0 implică cu necesitate x3 = 0, etc.)
încadrarea în capitalul disponibil: 6 x1 + 3 x2 + 5 x3 + 2 x4 ≤ 10
maximizarea valorii prezente nete totale a obiectivelor care se vor realiza:
9 x1 + 5 x2 + 6 x3 + 4 x4 ź max
Rezultă următorul model matematic:
Observație: Dacă s-ar fi pus condiția construirii unui singur depozit într-unul din cele două orașe, atunci inegalitatea x3 + x4 ≤ 1 trebuie schimbată în x3 + x4 = 1.
Pentru cele ce urmează este necesar să precizăm câțiva termeni.
variabilă continuă º variabilă care, o dată cu două valori permise poate lua orice altă valoare intermediară;
variabilă întreagă º variabilă care nu poate lua decât valori numere întregi;
variabilă bivalentă (booleană)ºvariabilă întreagă care nu poate lua decât valorile 0 sau 1;
problemă de programare în numere întregi (pe scurt program întreg) º problemă de programare liniară care utilizează una sau mai multe variabile întregi. Problema se zice totală dacă toate variabilele sale sunt întregi și mixtă dacă utilizează simultan și variabile continue și variabile întregi;
problemă de programare bivalentă (sau program bivalent) totală sau mixtă º problemă care utilizează variabile bivalente.
· Exemplul 1.2. arată că utilizarea variabilelor întregi aduce un plus de flexibilitate în modelarea unor situații practice. Această flexibilitate costă însă destul de mult, deoarece programele întregi sunt mult mai greu de rezolvat decât programele liniare uzuale (adică în variabile continue). Fără a intra deocamdată în amănunte este suficient să amintim că dacă în prezent a devenit o obișnuință rezolvarea unor programe liniare cu mii de variabile continue (firește utilizând programe comerciale de calculator), un program cu mai puțin de 100 variabile întregi poate cauza mari dificultăți !
Pentru evitarea complicațiilor se poate aplica următoarea schemă de rezolvare aproximativă a programelor întregi.
Se ignoră condiția ca variabilele să ia numai valori întregi și se rezolvă programul relaxat care este un program liniar uzual. Două situații sunt posibile:
soluția optimă a problemei relaxate are toate componentele întregi; aceasta va fi, evident și soluția optimă a programului întreg original;
unele componente ale soluției optime a programului relaxat sunt fracționare. În această situație componentele fracționare vor fi rotunjite inferior sau superior la valori întregi, în ideea că soluția optimă întreagă este situată în apropierea soluției optime fracționare.
Operația de rotunjire trebuie astfel făcută încât rezultatul să fie o soluție a problemei, adică să verifice restricțiile. este firesc să acceptăm soluția continuă prin rotunjire, cel puțin ca soluție suboptimală; în multe contexte practice acest lucru este justificat prin faptul că valorile permise variabilelor sunt suficient de mari astfel încât efectul rotunjirii să fie neglijabil.
Nu puține sunt situațiile în care strategia de rezolvare fie și aproximativă prin rotunjirea soluției optime fracționare nu este recomandabilă. Uneori se întâmplă ca numărul alternativelor de rotunjire să fie foarte mare implicând un volum apreciabil de calcule suplimentare pentru verificarea și sortarea acestora. Pe de altă parte, pentru unele programe întregi în care variabilele iau valori destul de mici, ca de exemplu 0 sau 1, este posibil ca distanța dintre optimul întreg și cel fracționar să fie atât de mare încât simpla rotunjire să nu ducă la o soluție acceptabilă.
Exemplul 1.3 Pentru programul întreg din exemplul 1.1. soluția optimă a programului relaxat:
are componentele:
Sunt evidente următoarele rotunjiri care conduc la soluții admisibile:
A doua soluție - mai bună este totuși departe de soluția optimă întreagă:
§ 2. Domenii de aplicare ale programării în numere întregi. Exemple
Situațiile practice a căror modelare necesită utilizarea variabilelor întregi sunt extrem de numeroase și exemplele următoare nu acoperă nici pe departe această varietate. După cum vom vedea în următorul capitol, situațiile combinatoriale pot fi modelate cel puțin în principiu ca probleme de programări în numere întregi.
2.1. Problema monezilor Cum poate fi plătită o sumă de bani astfel încât:
numărul tipurilor valorice de monezi utilizate la plată să nu depășească o limită dată;
numărul total al monezilor necesare plății să fie minim.
Pentru formalizare avem nevoie de următoarele notații:
S = suma de plată,
n
= numărul total al tipurilor valorice de monezi disponibile pentru plată;
p = numărul maxim de tipuri valorice de monezi ce pot fi utilizate la plata sumei S;
aj º valoarea monezii de tip j;
mj º numărul monezilor de tip j disponibile în casă.
Introducem variabilele:
xj = numărul monezilor de tip j utilizate la plata sumei S;
Rezultă următorul program întreg
0 ≤ xj ≤ mjyj j=1, ...n
xj ≥ 0 întregi; yj Î {0, 1} j = 1, ...n
2.2. Alegerea proiectelor de investiții O firmă este interesată în mai multe proiecte de investiții pe care ar putea să le realizeze în câțiva ani dar, din cauza bugetului limitat, va trebui să se limiteze la o parte din ele. Proiectul j aduce firmei în caz de finalizare un profit estimat la cj dolari j = 1, ... n și necesită investiții anuale în valoare de aij dolari i = 1, ... m. Capitalul disponibil pentru anul i este bi. Se pune problema alegerii acelor proiecte care să aducă firmei un profit total maxim cu condiția nedepășirii capitalului disponibil anual.
Pentru formalizare introducem variabile bivalente
Obținem programul bivalent:
xj Î {0, 1} j = 1, ... n
Observație Utilizarea variabilelor bivalente ne permite să modelăm o serie de situații speciale. De exemplu:
· cel mult unul din primele trei proiecte poate fi acceptat: x1 + x2 + x3 ≤ 1;
· numai unul din primele trei proiecte poate fi acceptat: x1 + x2 + x3 = 1;
· nu poate fi acceptat proiectul 2 dacă proiectele 1 și 4 sunt respinse: x2 ≤ x1 + x4
etc.
2.3. Elaborarea programelor de producție cu
costuri de pregătire
Să considerăm programul liniar
xj ≥ 0 j = 1, ... n
în care x1, x2, ... xn reprezintă nivelul unor activități productive iar c1, c2, ...cn sunt costurile unitare aferente. Ipoteza uzuală de liniaritate presupune proporționalitatea directă între costul unei activități și nivelul la care este operată activitatea respectivă. Există însă situații în care demararea unei activități necesită un cost de pregătire, independent de nivelul la care activitatea va fi operată. Costul activității j va avea forma:
Pentru a încorpora în modelul matematic anterior aceste elemente introducem următoarele bivalente
Rezultă programul mixt:
unde mj reprezintă o limită
superioară a nivelului xj al activității j
xj
≤
mjyj j = 1, ... n
xj ≥ 0, yj Î {0,1} j = 1, ... n
2.4 Stabilirea programului de zbor al
avioanelor unei companii de transporturi aeriene
O companie de transporturi aeriene are în dotare mai multe avioane de diferite tipuri pe care își impune să le utilizeze cât mai bine pe rutele de transport utilizate de această companie.
Datele problemei:
m = numărul tipurilor de avioane;
n = numărul rutelor servite de companie;
ci = capacitatea maximă de transport a unui avion de tipul i (nr. locurilor disponibile);
di = numărul avioanelor de tipul i disponibile;
bj = numărul clienților potențiali pe ruta j;
pj = profitul companiei pe călător transportat pe ruta j;
aij = numărul de zboruri pe care un avion de tipul i îl poate face pe ruta j într-o perioadă (zi, decadă, lună);
qij = costul operării unui zbor al unui avion de tipul i pe ruta j
Obiectiv:
repartizarea avioanelor pe rute și stabilirea numărului de zboruri ce trebuie efectuate la nivelul unei perioade astfel încât cererile de transport să fie rațional făcute la cel mai mic cost.
Variabile modelului:
xij = numărul avioanelor de tipul i rezultate pe ruta j;
yij = numărul de zboruri planificat a se realiza cu avioane de tipul i pe ruta j într-o perioadă.
Funcția obiectiv. Avem două cazuri:
1) Se au în vedere numai costurile de operare ale diferitelor zboruri:
(2.1.)
2) La costurile de operare se adaugă și costurile de penalizare pentru locurile libere. Pe ruta j numărul locurilor libere este dat de diferența astfel că expresia cheltuielilor de penalizare identificat cu profitul pierdut este:
Cheltuielile totale vor avea expresia:
astfel că funcția obiectiv devine:
(2.2.)
expresia fiind o constantă ce nu afectează optimizarea.
încadrarea aparatelor repartizate în numărul disponibil de avioane
i = 1, ... m (2.3.)
condiția de realizare a zborurilor planificate în funcție de numărul avioanelor repartizate
i = 1, ... m; j = 1, ...m (2.4.)
satisfacerea cererilor de transport:
j = 1, ... m (2.5.)
Condiții impuse explicit variabilelor:
xij ≥ 0, yij ≥ 0 întregi i = 1, ... m; j = 1, ... n (2.6.)
Atașând condițiilor 2.3. 2.6. funcțiile obiectiv (2.1.) și (2.2.) se obțin două programe întregi totale.
§ 3. Particularitățile mulțimii soluțiilor
admisibile ale unui program întreg
Să considerăm următorul program întreg total (P) împreună cu programul relaxat (PL) obținut din (P) prin eliminarea cerinței ca variabilele să ia numai valori întregi:
Programul întreg (P) |
Programul relaxat (PL) |
Ne propunem:
să rezolvăm grafic cele două programe;
să punem în evidență principalele proprietăți ale mulțimilor de soluții admisibile ale celor două programe. Analiza comparativă a acestor proprietăți ne va permite degajarea cel puțin la nivel de principiu a unor metode de rezolvare (exactă) a programelor întregi.
Terminologie, notații:
soluție admisibilă º ansamblu de valori numerice (nu neapărat întregi) care verifică restricțiile și condițiile de nenegativitate;
soluție admisibilă întreagă º soluție admisibilă cu toate componentele întregi;
APL º mulțimea sluțiilor admisibile ale programului relaxat (PL);
AP º mulțimea soluțiilor admisibile întregi ale programului (P);
soluția optimă fracționară ºsoluția optimă a programului relaxat (PL), notată constant cu x*;
optim fracționar º valoarea f (x*) a funcției obiectiv în soluția optimă fracționară x*;
soluția optimă întreagă º soluția optimă a programului întreg (P), notată constant cu x0;
optim întreg º valoarea f (x0) a funcției obiectiv în soluția optimă întreagă x0.
Vizualizăm mulțimile AP și APL
Reamintim că pentru reprezentarea grafică a mulțimii APL se fac următoarele operații:
· se reprezintă grafic dreptele: d1 º 3 x1 2 x2 = 3
d2 º 5 x1 + 4 x2 = 10
d3 º 2 x1 + x2 = 5
și se identifică semiplanele în care au loc cele trei restricții și cele două condiții de nenegativitate.
APL va fi intersecția celor
cinci semiplane puse în evidență mai sus adică poligonul simplu hașurat DFGH
dreapta de nivel a funcției obiectiv
soluția optimă ÎNTREAGĂ x0=(1,2)
optimul ÎNTREG f(x0)=1
soluția optimă FRACȚIONARĂ
optimul FRACȚIONAR
Fig.
3.1.
Pentru a găsi soluția optimă fracționară se reprezintă grafic o dreaptă de nivel a funcției obiectiv și se stabilește direcția de translatare a acesteia corespunzătoare maximizării. Rezultă º vârful F din desen optimul fracționar având valoarea .
Prin simplă inspecție se constată că mulțimea soluțiilor admisibile întregi ale programului (P) se compune din cinci puncte:
AP = {A(1,2), B(0,3), C(0,4), D(0,5), E(1,3)}
Funcția obiectiv f are valoarea maximă în A(1,2); prin urmare soluția optimă întreagă este x0=(1,2) iar optimul întreg are valoarea f(x0) = 1.
Comparând mulțimile AP și APL se pot formula următoarele concluzii și în cazul general:
1) APL este o mulțime în care fiecare punct este înconjurat de alte puncte din mulțimi oricât de apropiate. Ca urmare, teoria clasică a optimizării, bazată după cum se știe pe posibilitatea efectuării unor deplasări infinitesimale în jurul unui punct, este direct aplicabilă.
Prin contrast, AP este o mulțime rară, adică orice punct din ea posedă o vecinătate suficient de mică în care nu se mai află alte puncte din mulțime. Aplicarea teoriei amintite este în acest caz lipsită de sens.
2) APL este o mulțime convexă și mai mult poliedrală având un număr finit de vârfuri. Aceste proprietăți, plus liniaritatea funcției obiectiv, ne asigură că soluția optimă fracționară se găsește într-unul din vârfuri (conform teoremei centrale a programării liniare). Cercetarea sistematică a mulțimii vârfurilor lui APL cu ajutorul algoritmului simplex conduce la optimul fracționar într-un număr finit de pași.
Cu rare excepții, soluția optimă întreagă care este la urma urmei o soluție admisibilă problemei relaxate se găsește în interiorul mulțimii APL și ca urmare nu este nici măcar generată de către algoritmul simplex.
3) Să considerăm anvelopa convexă a mulțimii AP, adică cea mai mică mulțime convexă care conține AP. În fig. 3.1. această anvelopă este reprezentată de poligonul dublu hașurat ABDE. Prin construcție vârfurile anvelopei sunt soluții admisibile întregi ale programului (P).
Dacă vom maximiza funcția obiectiv f pe anvelopa convexă a soluțiilor admisibile întregi vom regăsi soluția optimă întreagă x0.
În concluzie, putem rezolva o problemă de programare în numere întregi ca o problemă de programare liniară uzuală cu condiția să știm să descriem în limbaj de inecuații liniare anvelopa convexă a soluțiilor admisibile întregi.
În cazul studiat, această descriere este ușor de făcut: anvelopa ABDE se compune din soluțiile sistemului de inecuații
În cazul general descrierea este practic imposibil de făcut. Totuși am putea recupera ceva din această idee: adăugând la problema relaxată PL un număr de restricții suplimentare judicios alese, numite tăieturi, se pot îndepărta din APL o serie de porțiuni astfel încât soluția optimă întreagă să devină vârf în mulțimea rămasă vezi fig. 3.2.
Fig. 3.2
În acest fel soluția optimă întreagă va putea fi detectată de către algoritmul simplex.
4) În cazul studiat AP era o mulțime finită. Acest lucru se întâmplă și în situații mai generale; de exemplu o problemă de programare cu n variabile bivalente nu poate avea mai mult de 2n soluții admisibile întregi. Fără a influența generalitatea concluziilor, se poate presupune că orice program întreg are un număr finit de soluții întregi.
Aceste constatări ne vor permite să înțelegem mai bune fundamentele, performanțele și limitele metodelor de rezolvare a programelor întregi ce vor fi prezentate în următoarea secțiune.
§ 4. Metode de rezolvare ale programelor întregi
Următoarele considerații vizează programul întreg în formă standard cu m ecuații și n variabile:
A x = b
x ≥ 0
x întreg (º cu
componente întregi) (max) f = cx
Û (P)
xj
≥
0 j = 1,...n
xj întregi
în care toate constantele aij, bi, cj sunt numere întregi.
Forma generală de mai sus acoperă și cazul particular important al programelor bivalente prin introducerea restricțiilor xj ≤ 1 , j = 1, ... n Ca și până acum (PL) va desemna programul relaxat dedus din (P) prin eliminarea condiției de integritate impusă variabilelor.
Vom presupune în mod constant că mulțimea soluțiilor admisibile ale problemei (PL) este mărginită; în problemele practice această cerință poate fi întotdeauna asigurată. Rezultă imediat că (P) are un număr finit de soluții admisibile întregi.
Deoarece coeficienții funcției obiectiv sunt întregi și optimul întreg va fi un număr întreg. Mai mult:
optimul întreg ≤ ë optimul fracționarû
unde ë a û înseamnă rotunjirea întreagă inferioară a numărului real a.
Ne propunem în continuare să dăm o clasificare a metodelor și algoritmilor de rezolvare a programului întreg general (P); observațiile și concluziile din secțiunea prezentată vor juca un rol esențial.
1) O mare parte din aceste metode reduc rezolvarea programului întreg (P) la rezolvarea unei secvențe finite și programe liniare uzuale:
(PL0
= PL), PL1, PL2, ... , PLt
ultimul având drept soluție optimă chiar soluția optimă întreagă a programului original (P).
Pentru fiecare k = 1, 2, ... t programul (PLk) se obține din cel anterior prin adăugarea unei anumite restricții suplimentare a cărei construcție diferă de la metodă la metodă. Restricțiile suplimentare sunt astfel alese încât:
· să fie verificate de orice soluție admisibilă întreagă a programului original (P);
· prin introducerea lor să îndepărteze porțiuni din mulțimea APL a tuturor soluțiilor admisibile ale relaxatei PL º PL0 până când soluția optimă întreagă devine vârf în mulțimea rămasă, putând fi astfel cunoscută de algoritmul simplex - vezi fig. 3.2.
Din
acest motiv aceste restricții suplimentare se mai numesc și tăieturi sau plane
de secțiune.
Din categoria algoritmilor bazați pe tăieturi fac parte algoritmii discret și ciclic datorați lui Gomory (1960) și algoritmul primal al lui Young și Glover (1972).
2) Faptul că un program întreg are (sau poate fi făcut să aibă) un număr finit de soluții sugerează un alt mod de rezolvare a programelor întregi bazate pe enumerarea totală sau parțială a acestor soluții. Enumerarea totală este evocată doar ca posibilitate pentru că numărul soluțiilor admisibile întregi, deși finit este de regulă foarte mare.
Schemele de enumerare parțială determină soluția optimă întreagă generând efectiv doar o parte a mulțimii soluțiilor admisibile întregi, soluțiile negenerate fiind recunoscute implicit ca neoptimale.
Domeniul predilect de aplicare a metodelor de enumerare îl constituie programarea bivalentă. Un exemplu reprezentativ îl constituie algoritmul aditiv al lui Balaș (1965).
3) Punerea în evidență a soluției optime întregi x0 situată de regulă în interiorul mulțimii soluțiilor admisibile ale problemei relaxate se poate face și în următorul mod (Dakin, Driebeck, 1964).
Să presupunem că am rezolvat problema relaxată PL, cu ajutorul algoritmului simplex obținând soluția optimă fracționară x*. Dacă x* are toate componentele întregi, am terminat:
x* º x0 º soluția optimă întreagă a programului original (P)
În caz contrar, una sau mai multe din componentele ale soluției x* nu sunt întregi; să presupunem de exemplu că este fracționar. Este clar atunci că soluția optimă întreagă căutată va verifica una din următoarele inegalități mutual exclusive:
(unde s-a notat cu ëaû º partea întreagă a numărului real a ).
Considerăm programele liniare obținute prin extinderea relaxatei PL cu fiecare din cele două inegalități:
PL PL
PL1 º PL2 º
Vom spune că am ramificat problema (PL) după variabila x1.
APL
1
APL 2
Fig.
4.1.
Este ușor de arătat că:
· Mulțimile de soluții admisibile APL 1 și APL 2 ale celor două programe noi sunt submulțimi stricte în APL.
· A1 È A2 = AP și A1 Ç A2 = Ø
unde A1, A2 sunt mulțimile de soluții admisibile întregi ale programelor PL1 și PL2. În particular soluția optimă întreagă a programului original (P) se găsește într-una (și numai în una) din mulțimile mai mici APL 1 sau APL 2 vezi figura 4.1.
Rezolvăm în continuare PL1; putem face acest lucru prin reoptimizare. Să presupunem că PL1 este compatibilă; în soluția sa optimă, notată x* 1 prima componentă va fi cu siguranță întreagă: .
În ipoteza ca a doua componentă este fracționară vom deriva alte două noi programe liniare după modelul de mai sus:
PL1 PL1
PL11 º PL12 º
Dacă soluția optimă întreagă căutată este soluție admisibilă pentru programul PL1 atunci cu siguranță ea se va găsi în una din mulțimile de soluții admisibile ale celor două programe rezultate prin ramificare.
În principiu, reunificarea poate continua de la oricare din problemele PL11, PL12 sau PL2, condițiile de ramificare fiind acelea ca programul în cauză:
· să fie compatibil (adică să aibă soluții admisibile);
· soluția sa optimă să aibă cel puțin o componentă fracționară.
De regulă, ramificarea se face după prima variabilă cu valoare fracționară sau după variabila cu cea mai mare parte fracționară.
Pentru înțelegerea metodei vom vizualiza procesul de ramificare printr-un graf arbore T ale cărui moduri sunt diferitele probleme rezultate din ramificare. Nodurile terminale (adică nodurile din care nu s-a mai efectuat ramificarea) sunt fie probleme incompatibile fie probleme cu soluții optime întregi. Cu excepția rădăcinii (PL) fiecare nod din T are un unic predecesor. Orice nod care nu este nod terminal are doi succesori.
Introducem următoarele variabile: xCMB
(vector) care reține cea mai bună
soluție admisibilă întreagă la un moment sau altul al derulării procesului
de ramificare zCMB,
care reține valoarea funcției obiectiv în xCMB. La start: xCMB = Ø zCMB = - ¥
Figura 4.1
Fiecare nod PLa al arborelui T unde a este o succesiune de 1 și 2 va avea atașată o margine superioară:
za º rotunjirea întreagă inferioară a optimului problemei PLa în cazul în care aceasta este compatibilă.
Este clar că dacă soluția optimă întreagă x0 se află printre soluțiile admisibile ale problemei PLa atunci:
zCMB ≤ f (x0) º optimul întreg ≤ za
Prin urmare, dacă pentru o problemă PLa rezultată din ramificare, avem:
za ≤ zCMB
nu mai are nici un rost să ramificăm PLa, deoarece printre eventualele sale soluții admisibil întregi nu există nici una mai bună decât actuala xCMB !
Arborele T nu există de la început. La start el se reduce la rădăcina (PL) și în continuare primește noi noduri și arce de legătură în funcție de problemele rezultate din ramificare și efectiv rezolvate.
Metoda de rezolvare a unui program întreg succint expusă mai sus va fi explicată mai în detaliu pe următorul exemplu:
START
· Se inițializează: zCMB = - ¥ și xCMB = Ø (locația vidă)
· Se rezolvă cu algoritmul simplex relaxata problemei (P):
(max) f = 5 x1 + 3 x2
- x1 + 2 x2 ≥ 2
(PL) x1 x2 ≤ 2
2 x1 + 2 x2 ≤ 7
x1, x2 ≥ 0
· Se găsește soluția optimă fracționară:
· Se conchide că optimul întreg nu poate depăși marginea superioară:
· Variabila după care se face ramificarea va fi alesă după criteriul părții fracționare mai mari; în cazul de față este vorba de variabila x2.
Iterația 1 Se rezolvă cu algoritmul simplex programul liniar (PL1) dedus din (PL) prin adăugarea restricției x2 ≤ 1.
· Se găsește soluția întreagă x1 = 0, x2 = 1; f = 3 pe care o reținem:
xCMB = (0, 1) zCMB = 3
Știm acum că optimul întreg este cel puțin 3. Revenim la problema (PL).
Iterația 2 Se rezolvă cu algoritmul simplex programul liniar (PL2) dedus din (PL) prin adăugarea restricției x2 ≥ 2.
· Se găsește soluția fracționară
· Se conchide că soluțiile admisibile întregi ale problemei (PL2) care sunt și soluții ale problemei inițiale (P) nu pot oferi funcției obiectiv o valoare mai mare decât marginea:
· Ramificăm după variabila x1.
Iterația 3 Se rezolvă problema (PL21) obținută din PL2 adăugând restricția x2 ≤ 1.
· Rezultă soluția fracționară
· Dacă soluția optimă a programului (P) s-ar găsi printre soluțiile întregi ale problemei PL21, optimul întreg n-ar depăși marginea .
· Ramificăm după variabila x2.
Iterația 4 adăugăm la (PL) restricția x2 ≤ 2, obținând un nou program liniar PL211. Rezolvarea lui conduce la soluția întreagă x1 = 1, x2 = 2, f = 11 evident mai bună decât soluția întreagă depozitată în xCMB. În consecință actualizăm:
xCMB = (1,2) zCMB = 11
Conchidem că optimul întreg al problemei originale (P) este mai mare sau egal cu 11.Revenim la problema PL21.
Iterația 5 De această dată adăugăm la PL21 restricția x2 ≥ 3. Programul PL212 rezultat are soluția fracționară
Să observăm că eventualele soluții întregi ale acestei probleme nu pot oferi funcției obiectiv o valoare superioară marginii cum valoarea funcției obiectiv în cea mai bună soluție întreagă găsită până acum este chiar 11, conchidem că ramificând PL212 nu vom găsi soluții întregi mai bune decât actuala xCMB. În consecință ne întoarcem din nou la problema PL21.
Recapitulând, studiul problemei PL21 a produs o soluția întreagă care a fost reținută precum și concluzia că PL21 nu are soluții întregi mai bune decât cea găsită. Ne întoarcem la problema PL2 din care am derivat PL21.
Iterația 6 Adăugăm acum la PL2 restricția x1 ≥ 2. Noul program PL22 se dovedește a fi incompatibil. Ne întoarcem din nou la problema PL2 cu concluzia că actuala xCMB este cea mai bună soluție întreagă a sa. Mai departe, revenim la problema PL din care am derivat PL2.
În acest moment putem spune că am examinat direct sau indirect - toate soluțiile întregi ale problemei (P), deoarece acestea erau, fie soluții întregi ale problemei PL1 deja studiate, fie ale problemei PL2 de asemeni examinate.
Soluția întreagă reținută în xCMB este din cea mai bună soluție întreagă adică este soluția optimă a problemei originale (P).
Comentariile de mai sus sunt sintetizate în arborele T din fig. 4.2.
Ordinea de rezolvare a problemelor:
PL ź PL1
ź PL2 ź PL21
ź PL211 ź PL212
ź PL22
Soluția optimă întreagă: x0 = xCMB = (1, 2); Optimul întreg f (x0) = 11
Observații 1) Utilitarul QM ramifică o problemă după variabila cu cea mai mare parte fracționară !
2) Utilitarul QM oprește ramificarea unui nod PLa numai dacă za < zCMB în ideea găsirii tuturor soluțiilor admisibile întregi. În cazul de față și nodul PL212 a fost ramificat ! vezi fig.4.3
Un nod al arborelui T din care ramificarea poate continua se numește nod activ; altminteri el se va numi nod mort. Din denumire rezultă că algoritmul se oprește în momentul în care rădăcina PL este declarată nod mort.
Fig 4.3
Principalele dezavantaje ale metodei descrise sunt:
·creșterea foarte rapidă, chiar explozivă a numărului problemelor de rezolvat și de aici a volumului de calcule o dată cu creșterea dimensiunilor programului original și mai cu seamă a numărului de variabile întregi;
·comportare impredictibilă pe probleme de dimensiuni apropiate: arborele problemelor rezolvate poate fi extrem de stufos pentru o problemă și foarte simplu pentru o alta.
În practică, metoda se conbină cu alte procedee (cum ar fi metoda planelor de secțiune) care pot oferi rapid soluții admisibile întregi suficient de bune micșorându-se astfel drastic numărul ramificărilor.
Algoritmul descris este o specializare a unei metode mai generale denumite branch & bound.
În principiu această metodă ramifică adică partiționează mulțimea în care se caută un anumit element numit element optimal în părți mai mici pe care le mărginește, aceasta însemnând optimizarea funcției obiectiv pe fiecare din părțile rezultate. Unele din aceste părți sunt ramificate și mărginite în continuare. Nu sunt ramificate acele părți care nu conțin în mod sigur soluția optimă căutată.
Ideea metodei B & B este de a găsi elementul optimal fără a inspecta toate elementele între care acesta se găsește; de aceea se spune că B & B este o schemă de enumerare parțială.
1. Enumerați sursele de apariție ale modelelor de programare în numere întregi.
2. Explicați termenii: relaxata unui program întreg, soluție optimă fracționară, soluție optimă întreagă, optim fracționar, optim întreg.
3. Explicați principiul metodelor de rezolvare a programelor întregi bazate pe tăieturi.
4. Explicați eventual pe baza unui exemplu - metoda Branch & Bound.
5. În rezolvarea unui program liniar în numere întregi (P) în care funcția obiectiv se maximizează s-a ajuns la următorul arbore al programelor liniare efectiv rezolvate:
Figura 5.1
a) Precizați soluția optimă fracționară x* și f(x*) și soluția optimă întreagă x0 și f(x0);
b) Indicați pe arcele arborelui restricțiile după care s-a făcut ramificarea;
c) În ce ordine au fost rezolvate cele cinci probleme?
d) De ce nu s-a continuat ramificarea din nodul (PL2) ?
5. Se consideră programele întregi:
Pentru fiecare din ele:
a) reprezentați grafic mulțimea soluțiilor admisibile ale problemei relaxate;
b) puneți în evidență soluțiile admisibile întregi și acoperirea convexă a acestora;
determinați grafic soluțiile optime fracționară și întreagă precum și optimele fracționar și întreg.
6. Din produsul B sunt necesare cel puțin b unități. Produsul se poate obține pe două instalații I1 și I2 dar numai în cicluri complete de fabricație ( și aceasta datorită unei operații de coacere prevăzută în tehnologia de fabricație). Pe fiecare ciclu instalația I1 produce p1 unități din B iar I2 produce p2 unități din B. Un ciclu de fabricație durează a1 ore pe I1 și a2 ore pe I2. Fondurile de timp disponibil ale celor două instalații sunt de F1 ore respectiv F2 ore. Costurile de fabricație se ridică la c1 u.m. (unități monetare) pe I1 și c2 u.m. pe I2 pe fiecare ciclu. Scrieți un program întreg pentru producerea cantității minimale B cu cheltuieli totale minime. Indicație: se vor lua ca variabile de decizie numărul ciclurilor de fabricație planificate a se realiza pe cele două instalații.
7. Un produs complex P se compune din 4 unități din componenta A și 3 unități din componenta B. Componentele A și B pot fi realizate prin trei procese de fabricație diferite în cadrul cărora se utilizează resursele R și S disponibile în cantitățile de 100 unități respectiv 200 unități. Realizarea unui proces de fabricație necesită anumite cantități din resursele R și S și are ca rezultat producerea anumitor cantități din componentele A și B conform datelor din următorul tabel:
Proces |
Intrări (unități
specifice) |
Ieșiri (unități specifice) |
||
din R |
din S |
din A |
din B |
|
1 |
8 |
6 |
7 |
5 |
2 |
5 |
9 |
6 |
9 |
3 |
3 |
8 |
8 |
4 |
Tabelul 5.1
Să se scrie un program întreg pentru determinarea numărului maxim de produse complexe P ce pot fi realizate din resursele date. Indicație: se va nota cu x1 , x2 , x3 numărul de procese 1,2 respectiv 3 necesare și cu y numărul produselor complexe P rezultate.
8. Folosiți utilitarul QM pentru rezolvarea programului întreg:
(Este vorba de modelul matematic al problemei precedente în care variabila y a fost renotată x4) Interpretați soluția obținută.
9. Rezolvați prin metoda Branch & Bound programele întregi din ex.5. În rezolvarea programelor liniare generate de metodă se va folosi metoda grafică. Construiți arborele T al programelor liniare efectiv rezolvate.
10. Descrieți următoarele probleme:
· problema monezilor;
· problema alegerii proiectelor de investiții;
· problema stabilirii programului de producție cu costuri fixe de pregătire;
· problema stabilirii orarului de zbor al avioanelor.
Particularizați aceste modele pe date concrete plauzibile.