PROGRAMAREA  LINIARĂ

 

Prezentare generală

 

Mulțimea sistemelor economice concrete și multitudinea problemelor conducerii acestora au creat o diversitate de reprezentări economico-matematice, denumite modele.

Varietatea acestora este determinată, în principal, de structura "obiectului" analizat, de scopul cercetării precum și de informația disponibilă.

Modelele de programare matematică și mai ales subclasa acestora – modelele de programare liniar㠖 ocupă un loc deosebit de important, atât în teoria cât și în practica economică. Teoria economică a beneficiat de aportul abordării interdisciplinare care a permis aprofundarea analizei eficienței maximale a sistemelor complexe, a permis descoperirea unor concepte noi ale optimului economic, a perfecționat metodele de cercetare și cunoaștere iar practica economică s-a îmbogățit cu un instrument deosebit de util analizei economice și fundamentării deciziilor.

Structura modelului general de programare liniară se constituie în primul rând prin mulțimea de activități {A1, A2, ... An} care compun sistemul economic analizat, mulțimea de resurse utilizate {R1, R2, ... Rm} precum și prin relațiile tehnico-economice dintre acestea. Legătura dintre activități și resurse este determinată de tehnologia de fabricație corespunzătoare fiecărei activități Aj (j=1,...,n) și poate fi caracterizată numeric prin vectorul coloană a(j) de componente (a1j, a2j, ... amj). Elementele {aij, i = 1,...,m; j = 1,...,n} se numesc coeficienți tehnici sau coeficienți de consum specific și arată ce cantitate din resursa Ri se consumă pentru producerea unei unități din produsul (serviciul) Pj (ca rezultat al activității Aj). Toate "tehnologiile" de fabricație definite de vectorii coloană a(j) se pot organiza într-o matrice A cu m linii și n coloane; fiecare linie se referă la o resursă Ri (i = 1,...,m) și fiecare coloană se referă la o activitate Aj (j = 1,...,n).

Notând cu xj (j = 1,...,n) rezultatul activității Aj într-o perioadă dată și cu bi (i = 1,...,m) cantitățile disponibile din resursele Ri (i = 1,...,m), se pot scrie matematic următoarele restricții tehnico-economice:

(1)      sau   AŚx £ b

 

unde A =  ; x =  și  b =

 

Fiecare inecuație/restricție încorporează două afirmații:

 

a.       cantitatea consumată dintr-o resursă nu poate depăși volumul disponibil (propoziție de logică economică)

b.      consumul total Rij din resursa Ri pentru efectuarea activității Aj este proporțional cu intensitatea acesteia, adică cu xj, deci Rij(*) = aij Ś xj  (ipoteză simplificatoare)

 

Sistemul de restricții (1) realizează legătura dintre resurse și activități prin intermediul celor m restricții liniare.

Modelul problemei de programare liniară conține restricții de tipul (1) precum și un criteriu de "performanță" care să permită evaluarea eficienței fiecărei activități. În funcție de scopul urmărit, putem alege drept criteriu de eficiență un indicator care măsoară efortul, unul care măsoară rezultatul sau un indicator exprimat ca raport între rezultat și efort (sau efort pe rezultat).

Este evident că eficiența maximă înseamnă minimizarea efortului și maximizarea rezultatului, iar conceptul de optim se definește, în acest caz, ca un program xÎ Rn care minimizează sau maximizează o funcție obiectiv și, în același timp, satisface toate restricțiile tehnico-economice.

Presupunând că fiecare componentă a vectorului linie c = (c1, c2, ..., cn) măsoară eficiența unei unități din rezultatul activității Aj, atunci se poate introduce funcția liniară:

f(x) = c1Śx1 + c2Śx2 + ... + cnŚxn

care evaluează performanța oricărui program x.

Sintetizând, obținem următorul program de programare liniară:

 

unde I1 È I2 = {1,2,...,m}

 

(2)

 

(3)

 

(1)

 

 

Relațiile (1), (2) și (3) constituie împreună modelul general al unei probleme de programare liniară, având fiecare un rol specific:

1.      relația (1), unde f(x) = este denumită funcția obiectiv de eficiență a problemei, evaluează eficiența/performanța fiecărei variante de program x;

2.      relațiile (2) de tipul  reprezintă restricții de tip resurse; iar restricțiile de tipul se referă la restricții tehnico-economice de tip calitativ (și ca urmare indicatorul bk este limita inferioară impusă "rețetei optime";

3.      relația (3) xj ³ 0 j = 1,...,n, numită condiția de nenegativitate a variabilelor, asigură obținerea unei soluții realizabile din punctul de vedere al logicii economice.

După cum s-a arătat la început, structura concretă a unei aplicații în economie este determinată în primul rând de obiectivul urmărit.

Astfel, în cazul problemei determinării structurii sortimentale optime a producției, se cunosc cantitățile disponibile (cantitățile de care se poate face rost pe perioada analizată) din fiecare materie primă {bi, i =1,...,m}, coeficienții tehnologici {aij, i = 1,...,m, j = 1,...,n} (aij reprezintă cantitatea din materia primă i necesară fabricării unei unități din produsul de tipul j), cantitățile maxime {, j = 1,...,n} și minime {, j = 1,...,n} ce pot fi produse din fiecare sortiment în perioada analizată și profiturile unitare {pj, j = 1,...,n} ale fiecărui tip de produs. Se cere găsirea acelor cantități xj care trebuie fabricate din fiecare tip de produs astfel încât să se obțină profitul maxim, în condițiile nedepășirii disponibilurilor din fiecare resursă.

Pentru simplificarea modelului, se presupune că prețul unui bun nu depinde de cantitatea produsă din acesta sau din celelalte, consumul din fiecare materie primă este direct proporțional cu cantitatea produsă și, pentru fiecare bun, consumurile dintr-o resursă sau alta nu se condiționează reciproc.

Problema matematică echivalentă este:

 

 

În unele probleme, în loc de profiturile pj se cunosc veniturile unitare vj sau costurile unitare cj sau alt criteriu de eficiență, scopul fiind maximizarea venitului, minimizarea costurilor respectiv optimul indicatorului de eficiență respectiv, sau toate la un loc. De asemenea pot lipsi condițiile de limitare a producției sau pot exista și alte condiții.

La o problemă de programare operativă a producției restricțiile se referă la o serie de mașini (utilaje) cu care se execută produsele dorite, bi fiind disponibilul de timp al utilajului i pe perioada analizată iar aij timpul necesar prelucrării unui produs de tipul j pe utilajul i, scopul fiind maximizarea producției.

Ca urmare, modelul are forma:

 

 

Dacă se dorește obținerea unui meniu (rețete furajere), care să asigure necesarurile {bi, i = 1,...,m} dintr-un număr de m substanțe esențiale organismului, având la dispoziție un număr de n alimente, cunoscându-se cantitățile {aij, i = 1,...,m, j = 1,...,n} din fiecare substanță pe care le conține o unitate de măsură din fiecare aliment și costurile {cj, j = 1,...,n} unei unități de măsură din fiecare aliment, putem scrie modelul:

 

 

Variabilele xj reprezintă, în acest caz, cantitatea din fiecare aliment ce va intra în meniu iar f(x) =  este costul total al rețetei definită de vectorul x.


 

Vom încheia exemplificarea cu prezentarea modelului amestecului optim de produse petroliere. Presupunem că o rafinărie dispune de n tipuri de benzine, prin amestecarea acestora urmând să obțină o benzină cu m caracteristici impuse și la un preț minim posibil. O serie de caracteristici trebuie să fie îndeplinite cu o limită inferioară (de exemplu cifra octanică), altele cu o limită superioară (de exemplu densitatea sau temperatura de fierbere) și altele cu egalitate (de exemplu cantitatea necesară), aceste limite fiind, i = 1,...,m1 , , i = 1,...,m2  respectiv , i = 1,...,m3 cu m1 + m2 + m3 = m. De asemenea, trebuie ținut cont de cantitățile disponibile din fiecare benzină Di, i = 1,...,n. Se cunosc caracteristicile fiecărei benzine disponibile, date într-o matrice A Î MmŽn, unde aij este valoarea caracteristicii i pentru benzina j și prețurile unitare ale fiecărei benzine, notate pj, j = 1,...,n. Dacă notăm cu xj, j = 1,...,n, cantitățile din fiecare benzină care vor forma amestecul optim, atunci avem de rezolvat problema:

 

 

 

 

Programarea matematică

 

Se observă că toate aceste probleme, cu toate că reprezintă situații economice total diferite, sunt aplicații în sfera activității economice ale următoarei probleme de optimizare:

 

 

în care funcțiile f,gi : Rn ź R pot avea orice formă și proprietăți (liniare, convexe, continui, diferențiabile etc) iar W poate fi orice submulțime a lui Rn (continuă sau discretă, mărginită sau nemărginită, convexă sau neconvexă, finită sau infinită etc) și în care dorim să găsim minimul sau maximul funcției f în variabilele xi care îndeplinesc restricțiile 1.2 și 1.3. O astfel de problemă se numește problemă de programare matematică.

Funcția (1.1) se numește funcția obiectiv a problemei de optimizare. În aplicațiile economice, ea reprezintă criteriul de performanță urmărit: maximizarea beneficiului, maximizarea producției marfă, minimizarea costului producției, maximizarea gradului de încărcare al utilajelor sau minimizarea timpului de staționare al acestora, maximizarea veniturilor etc.

Inegalitățile (1.2), în care gi sunt funcții de n variabile iar bi sunt constante, se numesc restricții ale problemei de optimizare. Ele traduc în limbaj matematic condi­țiile de natură economică sau tehnologică în care se desfășoară procesul economic modelat, cum ar fi: nedepășirea stocurilor disponibile de resurse (materii prime, capacități de producție, forță de muncă, fonduri bănești, timp etc), îndeplinirea sau depășirea unor indicatori economici (producția fizică, netă) etc.

Condițiile (1.3), impuse "direct" variabilelor, depind de natura problemei studiate. De cele mai multe ori, W este mulțimea vectorilor x = (xl,...,xn) Î Rn cu toate componentele nenegative și acest fapt se justifică prin aceea că, în general, xi reprezintă "nivelele" unor activități de producție, nivele care nu pot fi negative. În unele probleme de optimizare, cum ar fi  cele de croire sau ordonanțare, variabilele desemnează mărimi indivizibile și deci nu pot lua decât valori întregi. Mulțimea W va fi formată în acest caz din vectori x cu toate componentele întregi și nenegative. În alte probleme, ca de pildă cele de afectare, portofoliu etc, varia­bilele nu pot lua decât valorile 0 sau 1 (variabile bivalente) și ca atare W va fi formată din vectorii x = (x1, …,xn) cu toate componentele 0 sau 1. Caracteristic acestor tipuri de probleme este faptul că W devine o submulțime discretă din Rn, de unde și numele generic de probleme de optimizare discretă dat acestora.

O soluție a unei astfel de probleme are deci trei proprietăți:

 

P1.  verifică restricțiile 1.2

P2.  verifică restricțiile "directe" 1.3

P3.  optimizează funcția obiectiv pe mulțimea vectorilor care îndeplinesc condițiile P1. și P2.

 

În teoria programării matematice se folosesc, pentru claritatea și simplitatea expunerii, următoarele  noțiuni:

 

soluție a problemei de optimizare

=

un vector x Î Rn care verifică restricțiile 1.2

soluție admisibilă a problemei de optimizare

=

un vector x Î Rn care verifică restricțiile 1.2 și 1.3 Û o soluție care verifică restricțiile 1.3

soluție optimă a problemei de optimizare

=

un vector x Î Rn care verifică restricțiile 1.2 și 1.3 și optimizează funcția obiectiv pe mulțimea tuturor vectorilor cu această proprietate

Û o soluție care verifică restricțiile 1.3 și optimizează funcția obiectiv pe mulțimea tuturor soluțiilor cu această proprietate

Û o soluție admisibilă care optimizează funcția obiectiv pe mulțimea soluțiilor admisibile

 

Izvorâtă din studiul problemelor extremale ale analizei matematice clasice, programarea matematică a cunoscut în ultimele decenii o dezvoltare spectaculoasă, explicabilă numai în parte prin progresele înregistrate în matematică. Într‑adevăr, această dezvoltare a fost puternic stimulată de creșterea vertiginoasă a complexității activităților economice, care a furnizat probleme cu structuri din ce în ce mai complicate, ca și de rapida perfecționare a mijloacelor automate de calcul, singurele capabile să testeze eficiența practică a metodelor teoretice elaborate. La rândul ei, programarea matematică, prin rezultatele ei, a adus un considerabil aport la perfecționarea metodelor de conducere în economie și a impulsionat cercetările ‑ în plan teoretic ‑ privind modelarea sistemelor economice complexe, studiul și interpretarea legilor și proceselor economice.

În ceea ce privește rezolvarea acestor probleme, este evident că varietatea extremă a acestora face imposibilă găsirea unui algoritm practic care să le poată rezolva pe toate, dar putem găsi (sau ne putem aștepta să găsim), pentru fiecare caz particular, un algoritm de rezolvare care să-și tragă eficacitatea tocmai din folosirea tuturor particularităților cazului respectiv. În prezent există sute de algoritmi de rezolvare, cercetarea problemei evoluând din ce în ce mai mult spre testarea și îmbunătățirea acestora decât spre găsirea unora noi.


 

Problema de programare liniară

 

Definiția 1.  Dacă într-o problemă de programare matematică funcția obiectiv f și funcțiile gi, din restricțiile 1.2, sunt funcții liniare atunci problema se numește problemă de programare liniară. O problemă de programare liniară este, deci, un caz particular al problemelor de programare matematică și, ținând cont de forma oricărei funcții liniare, rezultă că forma generală a oricărei probleme de programare liniară este:

 

unde cj (coeficienții funcției obiectiv), aij (coeficienții restricțiilor) și bi (termenii liberi) sunt constate reale.

 

 

 

Forma conică și forma standard a unei probleme de programare liniară

 

Cu toate că problema de programare liniară este cea mai simplă dintre problemele de programare matematică, ea este încă destul de complicată, prin faptul că orice restricție poate avea trei forme diferite iar obiectivul poate fi minimizarea sau maximizarea funcției f. Este puțin probabil că există un algoritm și simplu și aplicabil la toate cazurile.

Din acest motiv este mult mai simplu să găsim o anumită formă (cât mai simplă) cu proprietatea că pentru orice problemă P, există o alta problemă P' de această formă, echivalentă cu problema inițială P (spunem că două probleme sunt echivalente dacă există un izomorfism între mulțimile soluțiilor celor două probleme și un homeomorfism între funcțiile lor obiectiv) și să dispunem de un algoritm care să rezolve problemele de această formă și de o regulă prin care să găsim soluția problemei inițiale P din soluția problemei P', găsită cu acest algoritm.

În acest sens (dar și din cauza frecvenței apariției lor în practică) s-au evidențiat două forme ale problemelor de programare liniară, forma canonică și forma standard.

 

Definiția 2. Spunem că o problemă este la forma canonică dacă are una din următoarele două forme:

 

Forma canonică de minim

Forma canonică de maxim

 

 

 

Această formă este cel mai des întâlnită în practică (vezi problema determinării structurii sortimentale optime a producției sau problema dietei) și, în plus, restricțiile economice sunt în general inegalități și foarte rar egalități. De asemenea, această formă este invariantă la anumite transformări (vezi problema duală) și asigură existența soluției (orice problemă la această formă, care are termenii liberi și coeficienții restricțiilor pozitivi, are soluție).

 

Definiția 3. Spunem că o problemă este la forma standard dacă are forma:

 

 

Această formă, deși nenaturală din punct de vedere economic, este cea care se pretează cel mai bine la rezolvarea cu metodele algebrei clasice.

 

Propoziție. Pentru orice problemă de programare liniară P există o problemă la forma canonică PFC și o problemă la forma standard PFS echivalente cu P.

 

Demonstrație. Într-adevăr:

 

a)      orice problemă de maxim poate fi transformată în una de minim și reciproc folosind relația:

 

max f(x) = – min f(–x)

 

b)      orice restricție de tipul "£" poate fi transformată într-o restricție de forma "³" și reciproc folosind relația:

a £ b Û  –a ³ –b

 

c)      orice restricție inegalitate poate fi transformată în egalitate, prin introducerea unei variabile suplimentare nenegative și folosind relațiile:

 

a £ b  Û        și     a ³ b  Û 

Toate variabilele introduse pentru transformarea inegalităților în egalități se numesc variabile de abatere sau variabile de compensare.

 

d)      orice restricție egalitate poate fi transformată în restricții inegalitate, folosind relația:

 

a = b  Û 

 

e)      orice variabilă cu restricție de semn negativă (x £ 0) poate fi înlocuită cu o variabilă cu restricție de semn pozitivă (y ³ 0), folosind relația:

 

x £ 0 Û  

 

f)        orice variabilă fără restricție de semn poate fi înlocuită cu două variabile cu restricție de semn pozitivă, folosind relația:

 

x oarecare  Û 

 

Se demonstrează fără un efort matematic deosebit că dacă P' se obține din P folosind doar transformările de mai sus (numite și transformări elementare) atunci P și P' sunt două probleme echivalente și între soluțiile lor optime există o bijecție.

Din cele de mai sus rezultă cum poate fi adusă orice problemă de programare liniară la forma standard (sau canonică) și cum se obține soluția problemei inițiale din soluția problemei la forma standard (sau canonică).

 

Exemplu: Problemei P de mai jos îi corespunde problema la forma standard PFS alăturată:

 

P

PFS

 

(min) f = 3x1 –2x2 + 4x3

 

(max) g = +3a1 + 2y2 – 2z2 – 4x3

 

Problema PFS are o singură soluție optimă:

a1 = 3, y2 = , z2 = 0, x3 = 0, x4 = , x5 = 0, x6 = , x7 = 0

care dă un maxim al funcției g egal cu .

Acestei soluții îi corespunde singura soluție optimă pentru P:

x1 = -3, x2 = , x3 = 0

care dă un minim al funcției f, egal cu  .

 

 

Rezolvarea problemei de programare liniară.

 

Analiza problemei

 

Fie o problemă P despre care presupunem (fără a restrânge generalitatea) că a fost adusă la forma standard. De asemenea presupunem (tot fără a restrânge generalitatea) că variabilele problemei au fost numerotate și denumite xj cu j = 1,...,n (n = numărul de necunoscute), coeficienții variabilelor din funcția obiectiv f cu cj (cj = coeficientul variabilei xj), că în ecuații variabilele apar în ordinea indicilor, ecuațiile fiind numerotate de la 1 la m (m = numărul de ecuații) și că am notat cu bi termenul liber al ecuației i și cu aij coeficientul variabilei j din ecuația i. În acest caz putem așeza variabilele problemei într-un vector cu n componente, coeficienții funcției obiectiv într-un vector cu n componente, termenii liberi într-un vector cu m componente, coeficienții variabilelor din ecuații într-o matrice cu m linii și n coloane și vom avea:

 

x = , c = , b = , A =

 

(vom nota cu xT, cT și bT transpușii acestor vectori și cu AT transpusa matricei A).

Alegerea așezării ca vectori coloană a fost făcută din rațiuni de ușurință a calculelor și a memorării acestora. După aceste notații, problema poate fi scrisă mult mai simplu:

 

   sau   

 

Se știe că un sistem de forma AŚx = b are soluție doar dacă rang(A) = rang(), unde  este matricea extinsă obținută adăugând matricei A vectorul b, în acest caz sistemul devenind echivalent cu sistemul obținut prin eliminarea restricțiilor care nu corespund minorului principal (dacă sistemul nu are soluție atunci evident nici problema nu are soluții, caz care este total neinteresant).

Presupunem că au fost eliminate aceste restricții. Dacă rang A = n atunci sistemul are o singură soluție care, dacă este admisibilă, este și soluția optimă căutată, altfel problema nu are soluție. Este evident că și acest caz este la fel de neinteresant ca primul.

Presupunem deci în continuare că:

 

rang(A) = m < n

 

Rezolvarea sistemului AŚx = b se poate face într-un mod simplu (cel puțin teoretic) folosind algebra matricială astfel:

-       împărțim coloanele matricei A în două submatrici: minorul principal (notat cu B, care este o matrice pătratică de dimensiune m și va fi numit bază a sistemului) și restul coloanelor (notat cu S, care este o matrice cu m linii și n – m coloane);

-       împărțim variabilele problemei în doi vectori: vectorul variabilelor principale (corespunzătoare coloanelor bazei) și vectorul variabilelor secundare (notat cu xS). Făcând eventual o renumerotare, pentru ușurința expunerii și fiind evident că nu se restrânge generalitatea problemei, presupunem că variabilele principale sunt chiar primele m (această presupunere va fi făcută de câte ori va fi posibil, fără a mai specifica acest lucru).

-       aducem succesiv sistemul la forma de mai jos:

 

AŚx = b Û (BS)Ś= b Û BŚxB + SŚxS = b Û BŚxB = b – SŚxS Û xB = B-1Śb – B-1ŚSŚxS

-       soluția sistemului va fi submulțimea lui Rn:

 

DB = {x = {xB,xS} / xS Î Rn-m oarecare, xB = B-1Śb – B-1ŚSŚxS}

 

Orice alegere a lui xS dă o soluție. Dintre toate alegerile posibile este remarcabilă (prin simplitatea ei) soluția xS = 0, care duce la soluția particulară:

xB =

numită soluția de bază asociată bazei B.  Deci xB este xB = B-1Śb la care se adaugă n-m zerouri. Cu toate acestea, vor fi ambele numite soluție de bază, rezultând din context de care este vorba.

 

Observație: Este evident că fiecărui minor principal al sistemului (= minor de dimensiune m = bază) îi corespunde o unică soluție de bază. O soluție de bază care are toate componentele nenule strict pozitive se va numi soluție de bază admisibilă iar o soluție optimă care este de bază se va numi soluție optimă de bază. Se observă că o soluție de bază are cel mult m componente diferite de 0. Din cauza importanței lor în rezolvarea problemei, vom evidenția soluțiile de bază care au mai puțin decât m componente nenule, numite soluții degenerate și pe cele care au fix m elemente nenule, numite soluții nedegenerate.

DB este izomorfă cu Rn, adică are tot atâtea elemente câte puncte sunt într-un spațiu cu n_–_m dimensiuni. "Alegându-le" din acestea doar pe cele cu toate elementele pozitive, găsim mulțimea în care vom "căuta" vectorul (vectorii) care dă (dau) extremul lui f.

 

Rezolvarea problemei poate duce la următoarele rezultate:

R1.    Sistemul AŚx = b nu are soluții sau nu are soluții admisibile. În acest caz problema nu are soluție.

R2.    Imaginea funcției obiectiv pe mulțimea soluțiilor admisibile este nemărginită (la +¥ într-o problemă de maxim sau la -¥ într-o problemă de minim). În acest caz spunem că problema are optim infinit.

R3.    Imaginea funcției obiectiv pe mulțimea soluțiilor admisibile este mărginită. În acest caz problema are cel puțin o soluție și spunem că problema are optim finit.

Greutatea găsirii soluției problemei constă în imensitatea numărului de soluțiilor posibile ale sistemului și în respectarea condiției de nenegativitate a celor printre care căutăm extremul dorit al funcției f. Este natural ca primele încercări în rezolvare să caute în primul rând o limitare cât mai puternică a locului în care căutăm. Pe baza unor reprezentări geometrice ale problemei au fost descoperite următoarele proprietăți ale problemei, care poartă denumirea de teoreme fundamentale ale programării liniare:

 

Teorema 1. Dacă problema de programare liniară are soluții admisibile atunci are și soluții de bază admisibile.

 

Teorema 2. Dacă problema de programare liniară are soluții optime atunci are și soluții optime de bază.

 

Teorema 3. Mulțimea soluțiilor admisibile (optime) este închisă și convexă. Dacă este și mărginită atunci punctele extremale ale acesteia sunt chiar soluțiile admisibile (optime) de bază ale problemei.

 

Cele două teoreme realizează efectiv trecerea către o problemă rezolvabilă pe calculator. Într-adevăr, deoarece o bază este un minor de ordinul m al matricii A și unei baze îi corespunde o unică soluție de bază rezultă că sunt cel mult soluții de bază, adică un număr finit. În acest moment s-ar părea că nu avem decât să lăsăm calculatorul să calculeze toate soluțiile de bază și valorile funcției obiectiv în cele admisibile găsind-o prin comparare pe cea care dă minimul sau maximul funcției printre acestea. Totuși, această variantă se dovedește nepractică la o analiză mai atentă, ținând cont de următoarele observații:

1.      faptul că numărul soluțiilor de bază este finit ne asigură doar că problema se va termina cândva, ceea ce, din punct de vedere economic, este evident nemulțumitor. Noi dorim ca problema să fie rezolvată în timp util, adică repede. Rezolvând problema ca mai sus vom avea, pentru o problemă cu 50 variabile și 20 restricții, de calculat, listat și comparat  soluții de bază, adică în jur de 1020. Presupunând că suntem dotați cu un supercalculator care ar termina un miliard de baze pe secundă, rezolvarea ar dura 3000 ani. De altfel, o problemă ca cea de sus este foarte mică în comparație cu problemele "serioase" ce au peste 1000 de variabile și 100 de restricții. În plus, un calculator ca cel de sus nu există încă, deci în nici un caz nu e disponibil întreprinderilor obișnuite.

2.      Cu algoritmul de mai sus vom găsi cea mai bună soluție dintre soluțiile admisibile de bază, fără însă să știm dacă problema admite, de fapt, optim (ar putea să aibă optim infinit).

3.      Nu vom ști dacă un minor de mŽm este bază decât după ce-i vom calcula determinantul și nu vom ști dacă soluția de bază corespunzătoare este admisibilă decât după ce o vom calcula.

4.      Soluția optimă, odată găsită, nu va fi recunoscută ca atare decât după ce vom calcula toate celelalte soluții de bază, chiar dacă ea a apărut chiar la începutul calculelor.

 

În concluzie, pentru a fi eficient, un algoritm ar trebui să aibă următoarele proprietăți:

 

a)      să dispună de un criteriu de recunoaștere a faptului că problema nu are soluții admisibile;

b)     să dispună de un criteriu de recunoaștere a faptului că problema are optim infinit;

c)      să dispună de un criteriu de recunoaștere dacă o soluție este optimă sau nu;

d)     să treacă de la o soluție de bază admisibilă la una cel puțin la fel de bună (o soluție x este mai bună decât o soluție y dacă f(x) > f(y) într-o problemă de maxim și f(x) < f(y) într-o problemă de minim;

e)      să treacă de la o soluție la cea mai bună dintre soluțiile cel puțin la fel de bune posibile ca succesoare;

f)       să nu revină la o soluție deja analizată;

g)      să efectueze un număr de iterații comparabil polinomial cu dimensiunea problemei.

h)      să nu introducă erori de rotunjire (sau nu prea mari);

i)        să fie cât mai simplu de implementat;

 

Condițiile de mai sus reprezintă de fapt un algoritm ideal. La începuturile cercetării operaționale era suficient, de fapt, și un algoritm care să îndeplinească măcar condițiile b), c), d), e) și h). Acest algoritm a fost dat de G.B. Dantzig, în 1947, care la numit algoritmul simplex. El rămâne și în zilele noastre cel mai eficient algoritm în ceea ce privește viteza de lucru, simplitatea și implementarea pe calculator, pentru problemele care apar efectiv în practica economică.

Totuși, el nu îndeplinea condițiile a), f) și g).

Condiția a) este relativ ușor de îndeplinit și ea este acoperită prin introducerea unei faze inițiale suplimentare la algoritmul simplex, rezultând algoritmul simplex în două faze.

Condiția f) a fost pusă în momentul în care s-a observat că, în condițiile existenței soluțiilor degenerate, se poate ajunge în situația când, de la o soluție dată, nu se poate ajunge decât la una la fel de bună și tot așa, astfel încât, dacă nu se iau măsuri de evitare, se poate ajunge la o soluție care a mai fost, fenomen numit ciclare. Astfel de exemple a fost efectiv găsite, unul fiind exemplul lui Beale prezentat mai jos:

 

 

Se observă imediat baza admisibilă B0 = (a1,a2,a3), de la care, aplicând algoritmul sub forma clasică, se vor obține succesiv bazele admisibile B1 = (a4,a2,a3), B2 = (a4,a5,a3), B3 = (a6,a5,a3), B4 = (a6,a7,a3), B5 = (a6,a2,a3), B6 = (a4,a2,a3) ... . Cititorul poate verifica ușor că toate aceste baze au ca soluție de bază soluția (0,0,1,0,0,0,0) și valoarea funcției 0, dar nu îndeplinesc condiția de optim. Pe de altă parte se vede că B6 = B1 și deci algoritmul va repeta la infinit această succesiune de baze, neatingând niciodată valoarea maximă , corespunzătoare soluției (,0,0,1,0,1,0).

Această situație este îngrijorătoare nu atât din considerente practice imediate (încă nu a fost găsită o problemă din practică la care să apară acest fenomen, toate exemplele existente fiind artificial construite, ca și cel de mai sus) cât din faptul că un algoritm implementat pe calculator s-ar putea să fie pus în fața unei astfel de probleme, situație în care n-am putea rezolva problema nici pe calculator, nici manual, ea fiind prea mare. Situația a fost depășită prin diferite tehnici suplimentare adăugate celei de trecere la o soluție cel puțin la fel de bună (insuficientă, cum s-a văzut), cea mai cunoscută fiind cea care folosește ordonarea lexicografică a soluțiilor, care va fi prezentată și în această carte.

În fine, referitor la condiția g), a durat mult timp până s-a demonstrat că algoritmul, sub această formă, nu este în timp polinomial, un exemplu fiind clasa de probleme de mai jos, găsită de Klee și Minty în 1972, în care algoritmul trebuie să analizeze 2n baze (n = numărul de necunoscute) până la găsirea celei optime.

 

 

Pentru o astfel de problemă, la 100 de variabile, algoritmul va avea 2100 @ 1030 iterații, și chiar la o viteză de un miliard iterații pe secundă (mult peste puterea unui calculator actual) va termina în 1013 ani.

 Nu se știe încă dacă există sau nu o altă modalitate de trecere de la o bază la alta, folosind tabelele simplex, prin care algoritmul să devină în timp polinomial. Au fost însă găsiți algoritmi care nu folosesc tabelele simplex, primul fiind algoritmul de punct interior al lui Karmakar, despre care s-a demonstrat că lucrează în timp polinomial.

În ceea ce privește erorile de rotunjire, inevitabile când se fac calculele pe un calculator, algoritmul se comportă într-adevăr foarte rău, orice eroare propagându-se imediat la tot tabelul cu efecte foarte mari. Acest lucru poate fi însă depășit aplicând o variantă a algoritmului, numită varianta revizuită a algoritmului simplex.

Toate punctele slabe ale algoritmului, amintite mai sus, nu au înmormântat însă algoritmul simplex, deoarece folosirea acestuia aduce informații mult mai ample decât găsirea soluției propriu-zise, este mult mai maleabil în cazul modificărilor ulterioare ale datelor problemei (vezi analiza senzitivității soluției la datele problemei), se pretează mult mai bine la interpretări economice, este ușor de scris un program de calculator asociat, este implementat pe foarte multe calculatoare și în plus, așa cum aminteam mai sus, încă nu a apărut o problemă practică în fața căruia să clacheze. Noii algoritmi rămân doar ca alternative teoretice sau pentru cazurile în care algoritmul simplex este lent, dar ei nu-l pot înlocui complet.

 

 

Fundamentarea matematică a algoritmului  simplex

 

 

Algoritmul simplex pleacă de la presupunerea că dispunem deja de o soluție admisibilă de bază x­B, corespunzătoare unei baze B. De asemenea, presupunem că am rezolvat sistemul AŚx = b folosind această bază, rezultând astfel variabilele principale în funcție de cele secundare:

 

xB = B-1Śb – B-1ŚSŚxS

 

Înlocuind variabilele, cu formula găsită, în funcția obiectiv, obținem:

 

f(x) = Ś(B-1Śb – B-1ŚSŚxS) + ŚxS = ŚB-1Śb – (ŚB-1ŚS – )ŚxS =

= f(xB) – (ŚB-1ŚS – )ŚxS = f(xB) – (z– )ŚxS =  f(xB) – DŚxS

 

unde:

-       f(xB) = ŚB-1Śb  este valoarea funcției obiectiv în soluția de bază

-       ŚB-1ŚS = z este un vector n-m componente z = (zm+1, zm+2,...,zn).

-       D = z –  este un vector n-m componente D = (Dm+1, Dm+2,..., Dn)

 

Obținem următoarea formă a problemei:

 

Din motive de organizare și concentrare a datelor problemei, Danzig le-a trecut pe acestea într-un tabel ca cel de mai jos, numit tabel simplex.

 

 

 

 

c1  c2    ...   cm  cm+1         ...           cn

cB

xB

xB

x1  x2   ...   xm  xm+1         ...           xn

c1

c2

cm

x1

x2

xm

B-1Śb

            Im                         B-1ŚS

 

 

f(xB)

            0            zm+1         ...           zn

 

 

 

            0            Dm+1         ...           Dn

 

Fiecărei soluții de bază îi corespunde un tabel simplex și reciproc, deci, de fiecare dată când vom vorbi de un tabel simplex, vom spune și care este baza asociată.

Din forma funcției obiectiv se vede că:

 

-       într-o problemă de maxim:

xB este soluție optimă     Û      oricare ar fi xS ³ 0   Û

Û  ³ 0 oricare ar fi xS ³ 0    Û    Dj ³ 0,  j = 1,...,n   (toți Dj sunt pozitivi)

-       într-o problemă de minim:

xB este soluție optimă     Û      oricare ar fi xS ³ 0   Û

Û  £ 0 oricare ar fi xS ³ 0    Û    Dj £ 0,  j = 1,...,n   (toți Dj negativi)

 

Pentru a evita complicarea expunerii vom presupune în continuare că problema este de maxim, pentru cazul de minim raționamentul fiind analog.

Rezultatul obținut reprezintă criteriul de recunoaștere a optimalității soluției sau, mai simplu, criteriul de optim.

Dacă soluția nu este optimă atunci există evident o altă soluție de bază admisibilă mai bună. Se poate demonstra că dacă x și y sunt două soluții admisibile de bază cu f(x) £ f(y) și numărul de variabile principale prin care diferă cele două este k, cu 1 £ k £ m, atunci există un șir de soluții admisibile de bază: {x1 = x, x2, ..., xk = y} astfel încât:

 

1.      f(xi) £ f(xi+1) oricare ar fi 1 £ i < k

2.      xi diferă de xi+1 printr-o singură variabilă, oricare ar fi 1 £ i < k

 

Din cele de mai sus rezultă că e suficient să căutăm o soluție de bază admisibilă mai bună doar printre cele care diferă de cea actuală printr-o singură variabilă.

Trebuie deci să găsim acea variabilă principală care iese din bază și acea variabilă secundară care intră în bază. Rezultatul schimbării trebuie să fie:

 

1.      o soluție de bază (deci coloanele corespunzătoare noii variabile să formeze un minor principal);

2.      o soluție admisibilă (adică să aibă toate componentele pozitive);

3.      o soluție mai bună;

4.      cea mai bună posibilă dintre soluțiile mai bune.

 

Presupunem că înlocuim variabila principală xi (1£ i £ m) cu variabila secundară xj (m+1 £ j £ m). Aceasta este echivalent cu a scoate din ecuația i (singura în care apare xi) variabila xj, în funcție de variabila xi și de celelalte variabile secundare. Este evident că acest lucru (care este echivalent cu faptul că noua soluție trebuie să fie de bază) este posibil doar dacă coeficientul lui xj din această ecuație este diferit de 0 (aij ¹ 0). În acest caz avem succesiv:

 

xi + + aijŚxj = xi Û xj + + Śxi = Śxi Û

Û xj = Śxi ––Śxi

Înlocuind variabila xj în celelalte ecuații obținem:

 

xs + + asjŚ(Śxi – – Śxi ) = xs  Û

Û  xs + – Śxi = xs – Śxi pentru  s = 1,...,m și s ¹ i

 

Conform formulelor de mai sus rezultă că noua soluție de bază este admisibilă dacă:

 

xs – Śxi  ³ 0 oricare ar fi s =1,...,m diferit de i  Û    ³  oricare ar fi s =1,...,m, s ¹ i

și în urma schimbării noua soluție de bază va fi:

= Śxi     și   = xs – Śxi  pentru s ¹ i

 În concluzie, dacă ne hotărâm să introducem în bază variabila j, singura variabilă care o poate înlocui (pentru ca noua soluție să fie admisibilă de bază) nu poate fi decât aceea care corespunde acelui aij strict pozitiv din coloana j din matricea B-1ŚS, pentru care se obține valoarea minimă a rapoartelor dintre componentele soluției de bază actuale și componentele coloanei j. Pentru evidențierea acestora, ele se notează cu qs și avem:

qi =

 

Condiția de mai sus este numită criteriul de ieșire din bază.

Mai înainte am văzut ce efect are schimbarea unei variabile din bază asupra sistemului. Este important însă să vedem efectul ei și asupra funcției obiectiv. Valoarea funcției obiectiv în noua soluție de bază va fi:

f() = =

Pentru ca această soluție să fie cel puțin la fel de bună trebuie ca:

 

f() ³ f(xB) Û ³ f(xB) Û     Dj £ 0

 

În concluzie, dacă vrem să obținem o soluție strict mai bună vom alege o variabilă xj corespunzătoare unui Dj < 0. Noua soluție va exista efectiv doar dacă pe coloana j din matricea B-1ŚS există o componentă aij strict pozitivă și va fi efectiv strict mai bună doar dacă componenta corespunzătoare xi din soluția de bază este diferită de 0, îmbunătățirea fiind egală cu .

Situația în care toate componentele coloanei j din matricea B-1ŚS sunt mai mici sau egale cu 0 este lămurit de următoarea teoremă:

 

Teoremă: Dacă pe coloana j din matricea B-1ŚS, corespunzătoare unei variabile xj cu Dj < 0, toate componentele sunt mai mici sau egale cu zero atunci problema are optim infinit.

 

Demonstrație: Fie o soluție particulară a sistemului, în care variabila secundară xj = l > 0, l  oarecare iar celelalte sunt 0. În acest caz, variabilele principale vor fi: yli = xi – aijŚl și vor fi toate pozitive, ținând cont de faptul că toți aij £ 0 și, deci, soluția va fi admisibilă. Pentru o astfel de soluție, valoarea funcției obiectiv este:

 

f(yl) = f(xB) – DjŚl.   și avem:    

deci imaginea funcției f este nemărginită și afirmația este demonstrată.

Presupunem în continuare că există o componentă aij strict pozitivă. Deoarece dorim să trecem la cea mai bună dintre bazele posibile, vom alege dintre toate variabilele cu Dj < 0, pe cea pentru care se obține:

Această condiție este criteriul de intrare în bază.

Deoarece calculul necesar găsirii acestuia este laborios, Danzig a preferat înlocuirea acestei alegeri cu alegerea acelui j care corespunde celui mai negativ Dj (= –), variantă care este ușor de aplicat, îmbunătățește soluția și prin care se obține, în marea majoritate a cazurilor, același j.

În acest moment știm cum să găsim o soluție mai bună, dacă ea există și am putea calcula din nou elementele necesare analizării noii soluții, din tabelul simplex, folosind formulele fiecăruia:

 

xB = B-1Śb

z = ŚB-1ŚA

D = z – c

 

Acest mod de lucru este efectiv folosit în anumite variante ale algoritmului simplex (vezi forma revizuită) dar el presupune calcularea inversei matricei B, ceea ce necesită foarte mult timp. Acest motiv era suficient de convingător pentru ca Danzig să-și fi pus problema dacă nu cumva noul tabel simplex poate fi calculat pe baza fostului tabel simplex, făcând mult mai puține calcule și utilizând formule ușor de memorat și aplicat. Această întrebare era natural de pus, dacă ținem cont că noua soluție diferă de fosta soluție printr-o singură variabilă. Aceste formule au fost efectiv găsite, ele putând fi obținute urmărind efectul înlocuirii lui xi cu xj asupra sistemului:

 

-       noua soluție de bază se obține din fosta soluție cu formulele deja găsite mai sus:

 

= Śxi     și 

 = xs – Śxi  pentru s ¹ i

 

-       noii coeficienții ai variabilelor în cele m ecuații vor fi:

 

1.    variabilă principală xs va avea coeficientul 1 în ecuația k și 0 în celelalte ecuații;

2.    o variabilă secundară xk, diferită de xi, va avea coeficienții  în ecuațiile s ¹ i și coeficientul  în ecuația i.

3.    noua variabilă secundară xi va avea coeficienții   în ecuațiile s ¹ i și coeficien­tul  în ecuația i.

4.    noua valoare a funcției obiectiv va fi:  f() =

1.    noii Dj îi obținem înlocuind în funcția obiectiv variabila xj în funcție de xi:

 

f(x) = f() – – DjŚ– Śxi + Śxi) =

=  – –Śxi  =

= f() – –Śxi 

de unde rezultă că pentru k ¹ i și

 

Deși par să fie foarte multe formule complicate, frumusețea algoritmului și meritul lui Danzig constă tocmai în faptul că toate respectă o regulă vizuală ușor de memorat, numită regula dreptunghiului, așa cum se va vedea în algoritmul simplex.

 

 

ALGORITMUL  SIMPLEX

 

Reamintim că presupunem că problema este la forma standard de maxim și că dispunem de o soluție de bază admisibilă.

 

Pasul 1.    Se construiește tabelul simplex corespunzător bazei de care dispunem în ordinea următoare:

1.      pe linia a doua se trec toate variabilele într-o ordine oarecare;

2.      pe prima linie se trec coeficienții funcției obiectiv, fiecare deasupra variabilei corespunzătoare;

3.      se construiește matricea A, fiecare coloană fiind formată din coeficienții unei variabile din toate ecuațiile (ordinea în care se parcurg ecuațiile trebuie să fie aceeași pentru toate variabilele), având grijă ca, coloanele să fie trecute în ordinea în care au fost trecute variabilele pe linia 2;

4.      se construiește baza B, ordinea coloanelor fiind cea în care apar ele în matricea A;

5.      se calculează B-1;

6.      se calculează B-1ŚA și se trece în partea centrală a tabelului;

7.      se trec variabilele principale în a doua coloană, în așa fel încât, la intersecția liniei și coloanei corespunzătoare acestei variabile, să se afle valoarea 1.

8.      se trec în prima coloană coeficienții corespunzători variabilelor principale din funcția obiectiv, fiecare în dreptul variabilei corespunzătoare;

9.      se calculează soluția de bază cu formula B-1Śb, având grijă ca ordinea în care au fost trecuți termenii liberi în vectorul b să fie aceeași cu ordinea în care au fost parcurse ecuațiile la formarea matricii A;

10.  se trec în a treia coloană valorile variabilelor principale din soluția de bază, fiecare în dreptul variabilei corespunzătoare;

11.  se calculează f(xB) înmulțind două câte două componentele coloanei 1 cu cele din coloana 3 aflate pe aceeași linie și adunând toate produsele între ele (adică facem produsul scalar dintre cB și xB);

12.  se calculează pe rând fiecare zj j = 1,...,n un zj obținându-se înmulțind scalar cB cu coloana j din B-1ŚA aflată în centrul tabelului (această linie se calculează și se trece doar în primul tabel, scopul ei fiind calcularea lui D);

13.  se calculează pe rând fiecare Dj j = 1,...,n scăzând din linia lui z linia lui c (Dj = zj - cj)

 

Pasul 2.    Se analizează valorile Dj corespunzătoare variabilelor secundare (e ușor de văzut că întotdeauna, cei corespunzători variabilelor principale sunt toți 0, deci neinteresanți).

-      dacă toți sunt mai mari sau egali cu 0 atunci soluția actuală este cea optimă. Dacă există Dj = 0 în afara bazei, atunci pot apărea două cazuri:

1)      toate elementele din coloana aj din B-1ŚA sunt mai mici sau egale cu 0. Atunci toate soluțiile de forma xB - ajŚl sunt soluții optime, unde l > 0 oarecare;

2)      există o componentă aij a coloanei aj strict pozitivă. Atunci introducând variabila xj în bază în locul variabilei principală xi obținem altă soluție de bază optimă.

Dacă apar numai cazuri de tipul 2), obținem toate soluțiile de bază optime, mulțimea tuturor soluțiilor optime fiind formată din toate combinațiile convexe ale acestora. Dacă apare și cazul 1) atunci mulțimea soluțiilor optime este nemărginită fiind formată din combinațiile convexe ale soluțiilor de forma  xB - ajŚl unde xB sunt toate soluțiile optime de bază.

-      dacă există Dj < 0 atunci îl alegem pe cel mai negativ: Dk = . Variabila x­j va fi cea care intră în noua bază. Dacă minimul este multiplu atunci alegem, la întâmplare, unul dintre aceștia (cei minimi).

Pasul 3.    Se analizează elementele coloanei aj din B-1ŚA, corespunzătoare variabilei alese la pasul 2.

 

-       Dacă toate sunt mai mici sau egale cu 0 atunci problema are optim infinit și algoritmul ia sfârșit;

-       Dacă există componente strict pozitive, pentru acestea se calculează rapoartele qs = . Variabila xi corespunzătoare raportului minim este cea care va ieși din bază. Dacă acest minim este multiplu sunt posibile două cazuri:

1)      minimul este strict pozitiv. În acest caz se alege unul dintre aceștia la întâmplare;

2)      minimul este 0. Atunci xi corespunzători sunt 0, deci soluția este degenerată și noua soluție este la fel de bună. Această situație poate duce la ciclarea algoritmului și alegerea la întâmplare nu mai este suficientă, fiind nevoie de o regulă de alegere suplimentară care să evite ciclarea. O metodă de alegere se bazează pe faptul că, așa cum vom vedea, întotdeauna prima bază este matricea unitate și în dreptul ei, în toate tabelele simplex, se va afla inversa bazei corespunzător fiecăruia. În acest caz, pentru pozițiile în care s-a obținut minimul împărțim prima coloană a lui B-1 la coloana aj și alegem minimul dintre aceste rapoarte. Dacă minimul dintre aceștia este tot multiplu continuăm procedeul, pentru pozițiile ce dau noul minim, cu coloana a doua din B-1 și așa mai departe, până minimul rămâne unic. Nu este posibil să se epuizeze toate coloanele lui B-1 și minimul să rămână multiplu, deoarece, în acest caz, am avea: , pentru toți indicii jk ai coloanelor lui B-1, i1 și i2 fiind doi din indicii care dau același minim până la sfârșit sau altfel scris  pentru orice jk Þ liniile i1 și i2 din B-1 sunt proporționale, fapt ce contrazice faptul că B-1 este inversabilă.

Pasul 4.    Se calculează componentele tabelului simplex corespunzător noii baze pe baza tabelului actual și folosind următoarele reguli:

1.      se încadrează elementul aij, aflat la intersecția coloanei variabilei care intră în bază cu linia variabilei care iese din bază, care a fost numit de Danzig pivot, într-un dreptunghi

2.      coloana pivotului va avea 1 în dreptul pivotului și 0 în rest (inclusiv Dj);

3.      linia pivotului este linia actuală împărțită la pivot (inclusiv în soluția de bază);

4.      restul elementelor se calculează cu regula dreptunghiului (inclusiv soluția de bază, D și f(xB)). Regula dreptunghiului se bazează pe observația că în toate formulele prin care se calculează acestea nu apare decât valoarea lor actuală, pivotul și cele două elemente care ar completa dreptunghiul ce are poziția de calculat și pivotul pe diagonală. Regula dreptunghiului se enunță literar astfel: "noua valoare = produsul dintre elementele de pe diagonala pivotului minus produsul dintre cele aflate pe cealaltă diagonală totul împărțit la pivot". (pentru scurtarea timpului de lucru se poate observa că elementele unei linii care are 0 pe coloana pivotului rămân aceleași și de asemenea elementele unei coloane care are 0 pe linia pivotului)

Operația de calculare a noului tabel prin regulile de mai sus poartă denumirea de pivotare.

Pasul 5.    Se reia algoritmul de la pasul 2.

 

 

Exemplu: Fie problema de programare liniară:

 

 

pentru care știm că baza formată din coloanele a1, a2, a3 este admisibilă. Pentru rezolvare vom aduce problema la forma standard de maxim introducând variabilele de abatere x7, x8, x9 obținând:

 

 

Vom așeza în tabelul simplex variabilele în ordinea indicilor și vom avea:

c = , A = , B = , cB =

vom calcula matricea B-1 =   și pe baza acesteia soluția de bază xB = B-1Śb = și matricea B-1ŚA =  care se trec în tabelul simplex:

 

 

 

 

 3   2    1      4      3       5      0       0        0

cB

xB

xB

 x1  x2  x3     x4     x5     x6     x7      x8      x9

3

 

2

 

1

x1

 

x2

 

x3

1

 

2

 

3

 

 

 

 

 

 

 

 

 

și în final se vor calcula valoarea funcției obiectiv în această soluție, zj și Dj:

 

 

 

 3   2    1      4      3       5      0       0        0

cB

xB

xB

 x1  x2  x3     x4     x5     x6     x7      x8      x9

3

 


2

 


1

x1

 

x2

 

x3

 

1

 

2

 

3

 

 

10

 

 

 

 

Din tabel se observă că există Dj < 0, aceștia fiind D4, D5, D6, D8  iar minimul lor este D6.

Observație Dacă vom căuta acel Dj care dă cea mai bună îmbunătățire vom avea de găsit acel Dj dintre cei negativi pentru care se obține  și deci de calculat:

 = =

 = =

 = =

 = =

și în final max (,,,) =  și corespunde tot lui D6.

În concluzie, soluția actuală nu este optimă și soluția cea mai bună dintre cele posibile ca succesoare va avea variabila x6 printre cele principale.

Analizând coloana a6 observăm că există componente strict pozitive (de fapt, în acest caz sunt chiar toate) și calculăm pentru acestea rapoartele qi obținând:

 

q1 =  = ,   q2 =  = 14,   q3 =  =    

deci minimul corespunde variabilei x1 și aceasta este cea care va ieși din bază. În cest moment cunoaștem noua bază și vom construi tabelul simplex pe baza regulilor de calcul de la pasul 4:

 

1.      pivotul este a16 =

4.      de exemplu, pentru elementul de pe poziția a34 avem dreptunghiul:

 

 

 

 

 

 

 

 


și noua valoare de pe această poziție va fi:   =  –1

În final, tabelul corespunzător noii baze va fi:

 

 

 

 

 3      2    1      4      3     5      0       0      0

cB

xB

xB

 x1    x2   x3    x4     x5    x6     x7      x8    x9

5

 

2

 

1

x6

 

x2

 

x3

 

 

 

Continuând algoritmul vom găsi tabelele:

 

 

 

 

 3      2    1      4      3     5      0       0      0

cB

xB

xB

 x1    x2   x3    x4     x5    x6     x7      x8    x9

5

 

2

 

0

x6

 

x2

 

x8

 

 

 

 

 

 

 

 

 3        2     1      4      3    5      0      0     0

cB

xB

xB

 x1      x2    x3    x4     x5   x6     x7    x8    x9

5

 

3

 

0

x6

 

x5

 

x8

5

 

1

 

2

 

 

28

 

Ultimul tabel conține soluția optimă, deoarece toți Dj ³ 0. Deoarece nu mai există nici un Dj = 0 în afara celor din bază rezultă că soluția optimă este unică.

 

 

Determinarea unei soluții de bază admisibile de start

 

Presupunem încă odată că problema este la forma standard.

Algoritmul simplex necesită, pentru pornire, o soluție admisibilă de bază. Găsirea acesteia pur și simplu prin încercări nu este deloc o sarcină ușoară, gândindu-ne că aceasta presupune găsirea unui minor principal, inversarea acestuia și calcularea soluției, abia în acest moment putând vedea dacă aceasta are toate componentele pozitive, această căutare putând dura foarte mult.

Rezolvarea problemei pleacă de la observația că singura bază pentru care calculul de mai sus se poate face imediat este matricea unitate, caz în care soluția de bază corespunzătoare este chiar vectorul termenilor liberi. Aceasta presupune ca problema să aibă toți termenii liberi mai mari sau egali cu 0 și în matricea A să existe toate coloanele matricii unitate.

Dacă toți termenii liberi pot fi făcuți mai mari sau egali cu 0 foarte simplu, prin înmulțirea eventual cu –1 a restricției respective, existența tuturor coloanelor matricii unitate este evident că este foarte puțin probabilă și mai greu de obținut.

În acest sens plecăm de la observația că existența unui vector din coloana unitate printre coloanele matricii A este echivalentă cu existența unei variabile care apare doar în ecuația corespunzătoare lui 1 din acel vector, cu coeficientul 1. Acest lucru poate fi obținut  în două moduri:

 

a)      Începând de la prima ecuație, căutăm o variabilă care are coeficientul de același semn cu termenul liber, o scoatem din această ecuație în funcție de celelalte variabile, o înlocuim în celelalte și repetăm procedeul pornind de la a doua ecuație. Pot apărea trei cazuri:

1)      la un moment dat obținem o ecuație în care toți coeficienții variabilelor au semn contrar termenului liber, măcar unul dintre toți fiind diferit de 0. În acest caz ecuația nu are evident soluție admisibilă(pozitivă) și deci problema nu are soluție;

2)      toți coeficienții variabilelor și termenul liber sunt 0. În acest caz rezultă că această ecuație rezultă din cele anterioare și ea va fi eliminată, trecându-se la următoarea;

3)      se epuizează toate ecuațiile. În acest moment, variabilele care au fost scoase din fiecare ecuație formează baza dorită.

Procedeul de mai sus poate părea atractiv, dar presupune introducerea unui algoritm diferit de simplex, cu efect asupra omogenității calculelor și a vitezei de lucru. De asemenea, prin efectuarea calculelor de mai sus, datele problemei nu mai au semnificația economică inițială, ne mai putându-se face interpretări economice.

b)     Pentru toți vectorii coloană introducem în ecuațiile corespunzătoare câte o variabilă cu coeficientul 1. Vom obține evident un nou sistem de restricții și rămâne de văzut ce legătură este între soluțiile acestuia și cel inițial. Cele două sisteme au forma:

AŚx = b     și    AŚx + y = b

Este evident că o soluție a primului sistem este soluție și a celui de-al doilea (luăm y = 0) iar o soluție a celui de-al doilea este soluție și pentru primul doar dacă y = 0. Scopul nostru va fi deci, ca pornind de la soluția inițială a celei de-a doua probleme să ajungem la o soluție a acesteia în care y = 0. Ținând cont că în soluțiile de bază, variabilele secundare sunt toate egale cu 0, vom încerca să scoatem din bază variabilele y. Scopul algoritmului simplex este însă maximizarea funcției obiectiv, nu scoaterea a uneia sau alteia din variabile din bază. Pentru a echivala cele două scopuri putem proceda în două feluri:

1)      Alegem o nouă funcție obiectiv care să-și atingă extremul printre soluțiile pozitive chiar pentru y = 0 și în momentul când am obținut soluția respectivă pornim cu aceasta ca soluție inițială algoritmul simplex pentru fosta problemă.

2)      Adăugăm la fosta funcție obiectiv noile variabile cu niște coeficienți de asemenea natură aleși încât aportul variabilelor y la valoarea funcției să fie contrar scopului dorit (foarte mari pozitivi într-o problemă de minim și foarte mari negativi într-o problemă de maxim).

 

Vom detalia în continuare cele două metode:

 

Algoritmul simplex în două faze

 

Dată problema de programare liniară la forma standard de maxim:

 

 

în care am aranjat deja ca toți termenii liberi să fie pozitivi (b ³ 0).

 

Faza 1 Construim problema:

 

pe care o rezolvăm cu algoritmul simplex pornind rezolvarea de la baza matrice unitate, putând ajunge la două situații:

 

1)      minimul funcției g este strict pozitiv. Aceasta este echivalent cu faptul că egalitatea Ax + y = b se poate obține doar pentru y > 0 sau altfel spus Ax > b pentru orice x ³ 0, deci sistemul Ax = b nu are soluții admisibile și în concluzie problema inițială nu are soluție.

2)      minimul funcției g este 0. În acest caz, soluția optimă obținută are y = 0, deci verifică Ax = b fiind în concluzie o soluție admisibilă de bază a primei probleme.

 

Faza 2 Începând de la soluția găsită la faza 1 se rezolvă problema inițială cu algoritmul simplex.

 

Dezavantajul metodei constă în faptul că tabelul simplex final de la faza 1 trebuie modificat pentru a obține tabelul simplex inițial de la faza 2 (vectorii x, c, cB, z, D, f(xB), se elimină coloanele corespunzătoare lui y) și în plus nu vom mai avea în tabelele simplex ale problemei inițiale inversa bazei (care se găsea în dreptul coloanelor matricii unitate din prima fază) necesară în anumite variante ale algoritmului simplex.

 

 

Metoda bazei artificiale (metoda penalizării)

 

Dată problema de programare liniară la forma standard de maxim:

 

 

în care am aranjat deja ca toți termenii liberi să fie pozitivi (b ³ 0).

 

Construim problema:

 

în care M este o constantă presupusă foarte mare (mai mare decât orice constantă care ar putea apare în rezolvarea problemei). Rezolvăm problema cu algoritmul simplex pornind rezolvarea de la baza matrice unitate, putând ajunge la trei situații:

 

1)      problema are optim infinit. În acest caz, problema inițială are optim infinit.

2)      problema are optim finit și în soluția de bază avem cel puțin o variabilă din vectorul y. În acest caz problema inițială nu are soluții admisibile.

3)      problema are optim finit și în soluția de bază nu avem nici o variabilă din vectorul y. În acest caz problema inițială are optim finit, soluția optimă și maximul funcției fiind aceleași cu cele ale problemei modificate.

 

În final vom remarca faptul că variabilele y nu corespund unor mărimi economice ca celelalte, ele fiind introduse doar ca un artificiu de calcul pentru a putea porni algoritmul simplex. Din acest motiv ele se numesc variabile artificiale.


 

Exemplu Fie problema de programare liniară:

 

Forma standard a problemei va fi:

 

Avem deja termenii liberi și o coloană a matricii unitate  corespunzătoare variabilei x3. Pentru a obține și a doua coloană  vom introduce variabila x5 cu coeficientul 1 în a doua ecuație și în final vom avea de rezolvat problema:

 

Algoritmul simplex în două faze

Metoda bazei artificiale

 

 

 

Aplicând algoritmul simplex în două faze vom obține în prima fază succesiunea de tabele:

 

 

 

 

0

0

0

0

1

cB

xB

xB

x1

x2

x3

x4

x5

0

x3

10

3

1

1

0

0

1

x5

2

1

4

0

-1

1

 

 

2

1

4

0

-1

1

 

 

 

1

4

0

-1

0

 

 

 

 

0

0

0

0

1

cB

xB

xB

x1

x2

x3

x4

x5

0

x3

0

1

0

x2

1

0

 

 

0

0

0

0

0

-1

 

Am obținut optimul egal cu 0 în soluția de bază (x3,x2) care va fi soluția inițială pentru algoritmul simplex aplicat problemei inițiale în a doua fază. Eliminăm din tabel coloana lui x5, înlocuim valorile coeficienților funcției obiectiv și deci și valoarea acesteia, valorile D și obținem tabelul:


 


 

 

2

3

0

0

cB

xB

xB

x1

x2

x3

x4

0

x3

0

1

3

x2

1

0

 

 

0

0

 

 

 

 

2

3

0

0

cB

xB

xB

x1

x2

x3

x4

0

x3

4

0

-11

1

3

2

x1

2

1

4

0

-1

 

 

4

0

5

0

-2

 

 

 

 

2

3

0

0

cB

xB

xB

x1

x2

x3

x4

0

x4

0

1

2

x1

1

0

 

 

0

0

 

 

 

 

2

3

0

0

cB

xB

xB

x1

x2

x3

x4

0

x4

38

11

0

4

1

3

x2

10

3

1

1

0

 

 

30

7

0

3

0

 

Soluția optimă a primei probleme este deci x1 = 0 și x2 = 10 care dă un maxim al funcției egal cu 30. Dacă aplicăm a doua metodă vom obține succesiv tabele:

 

 

 

 

2

3

0

0

-M

cB

xB

xB

x1

x2

x3

x4

x5

0

x3

10

3

1

1

0

0

-M

x5

2

1

4

0

-1

1

 

 

-2M

-M

-4M

0

M

-M

 

 

 

-M-2

-4M-3

0

M

0

 

 

 

 

2

3

0

0

-M

cB

xB

xB

x1

x2

x3

x4

x5

0

x3

0

1

3

x2

1

0

 

 

0

0

M+

 

 

 

 

2

3

0

0

-M

cB

xB

xB

x1

x2

x3

x4

x5

0

x3

4

0

-11

1

3

-3

2

x1

2

1

4

0

-1

1

 

 

4

0

5

0

-2

2+M

 

 

 

 

2

3

0

0

-M

cB

xB

xB

x1

x2

x3

x4

x5

0

x4

0

1

-1

2

x1

1

0

0

 

 

0

0

M

 

 

 

 

2

3

0

0

-M

cB

xB

xB

x1

x2

x3

x4

x5

0

x4

38

11

0

4

1

-1

3

x2

10

3

1

1

0

0

 

 

30

7

0

3

0

M

 

Rezultatul final este evident același.

 

 

VARIANTE  ALE  ALGORITMULUI  SIMPLEX

 

1.      Algoritmul simplex dual

 

Pentru expunerea acestui algoritm trebuie introduse noțiunile de bază dual admisibilă și soluție dual admisibilă de bază. Prin definiție numim:

 

soluție de bază dual admisibilă

=

soluție de bază pentru care toți Dj ³ 0

bază dual admisibilă

=

bază corespunzătoare unei soluții de bază dual admisibile

Ca și în cazul algoritmului simplex, pentru a putea rezolva problema cu algoritmul simplex dual trebuie să dispunem deja de o bază inițială dual admisibilă. Această soluție poate exista ca urmare a unor calcule anterioare (vezi capitolul cu reoptimizarea) sau, ca și în cazul algoritmului simplex, poate fi aplicată o procedură prin care să găsim această bază. Prezentarea acesteia este mai complicată decât cea de la algoritmul simplex astfel încât:

 

-     dacă dispunem de o bază dual admisibilă vom rezolva problema cu algoritmul simplex dual

-     dacă nu dispunem de o bază dual admisibilă vom rezolva problema cu algoritmul simplex.

 

Pentru a evita orice confuzie, vom numi în continuare algoritmul simplex obișnuit algoritm simplex primal și o bază admisibilă bază primal admisibilă.

Se observă că o soluție dual admisibilă nu este în general primal admisibilă și reciproc, iar o soluție care este simultan primal și dual admisibilă este o soluție optimă și reciproc.

Presupunem că am adus problema la forma standard de maxim și dispunem de o bază dual admisibilă și dispunem deja de de o bază dual admisibilă. Algoritmul simplex dual constă în următorii pași:

 

Pasul 1.    Se construiește tabelul simplex asociat acestei baze, la fel ca și la algoritmul simplex primal;

Pasul 2.    Se analizează componentele soluției:

- Dacă toate componentele sunt mai mari sau egale cu 0 atunci soluția este și primal admisibilă, deci optimă.

- Dacă există componente strict negative, variabila corespunzătoare celei mai negative (xi = ) este cea care iese din bază. Dacă minimul este multiplu se ia una la întâmplare.

Pasul 3.    Se analizează linia li corespunzătoare variabilei xi aleasă la pasul 2:

- Dacă toate componentele aij j = 1,...,n sunt mai mari sau egale cu 0, atunci am avea o ecuație cu toți coeficienții necunoscutelor pozitivi și termenul liber strict negativ, deci problema nu are soluții primal admisibile.

- Dacă există componente strict negative, atunci pentru acestea se găsește acel indice pentru care se obține  (prin  am notat modulul numărului a). Dacă minimul este multiplu alegem unul dintre aceștia la întâmplare. Variabila corespunzătoare acestuia este cea care intră în bază.

Pasul 4.    Se construiește tabelul corespunzător noii baze aplicând aceleași reguli ca la algoritmul simplex primal;

Pasul 5.    Se reia algoritmul de la pasul 2

 

 

2.      Forma secundară

 

Este evident că modul de organizare al datelor în tabelul simplex nu este unicul mod de a organiza datele într-un tabel. Forma secundară este tocmai o astfel de alternativă. Presupunem și în acest caz că problema este la forma standard de maxim, că problema este la forma standard și că dispunem de o soluție inițială de bază care este primal sau dual admisibilă.

 

Pasul 1.    Datele problemei vor fi organizate într-un tabel de forma:

 

 

 

 

cS

c

x

f

xS

 

 

f(xB)

DS

cB

xB

xB = B-1Śb

B-1ŚS

cS

xS

0

–In-m

 

Se observă că singura diferența este că la coloana variabilelor bazei din stânga se adaugă și cele secundare, pe orizontală se lasă doar variabilele secundare iar în loc de matricea unitate în dreptul variabilelor principale vom avea matricea unitate în dreptul celor secundare (dar cu minus), D fiind calculat la fel, neglijându-se cei din dreptul variabilelor principale, care oricum erau 0.

 

Pasul 2.    +   Pasul 3.  Se găsesc variabila care iese din bază și cea care intră în bază cu aceleași reguli ca la algoritmul simplex primal sau, după caz, ca la cel dual.


 

Pasul 4.     Se construiește tabelul asociat noii baze aplicând regulile:

 

1)      Pivotul este același ca la tabelul simplex;

2)      Linia pivotului are –1 în dreptul pivotului și 0 în rest;

3)      Coloana pivotului se împarte la pivotul cu semn schimbat

4)      Celelalte elemente se calculează cu regula dreptunghiului

 

Pasul 5.      Se reia algoritmul de la pasul 2.

 

Exemplu Fie problema de programare liniară rezolvată mai sus:

 

Forma standard a problemei va fi:

iar după introducerea variabilelor artificiale obținem:

Tabelul corespunzător va fi:

 

 

 

 

2

3

0

cB

xB

xB

x1

x2

x4

 

 

-2M

-M-2

-4M-3

M

2

x1

0

-1

0

0

3

x2

0

0

-1

0

0

x3

10

3

1

0

0

x4

0

0

0

-1

-M

x5

2

1

4

-1

 

Aplicăm simplex primal și obținem cel mai negativ Dj corespunzător lui x2 și qi minim corespunzător lui x5. În acest moment avem o soluție de bază a problemei inițiale și putem elimina variabila x5. Obținem:

 

 

 

 

 


2

-M

0

 

 

 

 

2

0

cB

xB

xB

x1

x5

x4

 

cB

xB

xB

x1

x4

 

 

M+¾

 

 

 

2

x1

0

-1

0

0

 

2

x1

0

-1

0

3

x2

½

¼

¼

Û

3

x2

½

¼

0

x3

 

¼

 

0

x3

 

¼

0

x4

0

0

0

-1

 

0

x4

0

0

-1

-M

x5

0

0

-1

0

 

 

 

 

 

 

 

și în continuare:


 

 

 

 

3

0

 

 

 

 

3

0

cB

xB

xB

x2

x4

 

cB

xB

xB

x2

x3

 

 

4

5

-2

 

 

 

2

x1

2

4

-1

 

2

x1

 

3

x2

0

-1

0

ź

3

x2

0

-1

0

0

x3

4

-11

3

 

0

x3

0

0

-1

0

x4

0

0

-1

 

0

x4

 

 

 

 

 

2

0

 

cB

xB

xB

x1

x3

 

 

 

30

7

3

ź

2

x1

0

-1

0

 

3

x2

10

3

1

 

0

x3

0

0

-1

 

0

x4

38

11

4

 

Din rezolvarea de mai sus se observă că această metodă este mai eficientă doar dacă numărul variabilelor secundare este mai mic decât numărul variabilelor principale. Totuși, motivul principal pentru care a fost introdusă această variantă, este existența unor probleme în care, pe parcursul rezolvării, se adaugă foarte multe restricții (de exemplu rezolvarea problemelor în numere întregi), pentru o restricție în plus tabelul simplex mărindu-se cu o linie și o coloană (cum se va vedea la capitolul de reoptimizare) iar tabelul corespunzător formei secundare doar cu o linie.

 

 

3.      Forma revizuită a algoritmului simplex

 

O problemă mare (de exemplu cu 1000 variabile și 100 restricții) necesită în algoritmul simplex introducerea, memorarea și lucrul cu un tabel cu 100.000 componente, adică un număr imens de date. Din acest motiv, și remarcând faptul că în algoritmul simplex doar o parte din acestea contribuie efectiv la luarea deciziilor, s-a construit un algoritm care să țină cont de observațiile de mai sus, numit "forma revizuită a algoritmului simplex", în care se lucrează cu minimul necesar din datele tabelului simplex. Astfel, pentru testarea soluției actuale și trecerea eventuală la o nouă bază avem nevoie doar de următoarele elemente:

(1)   inversa bazei curente B-1

(2)   componentele vectorului D pentru a face testul de optim și a găsi variabila care intră în bază (dacă soluția nu e optimă)

(3)   coloana ak din B-1A corespunzătoare celui mai negativ Dj (dacă există strict negativi) pentru a face testul de optim infinit

(4)   soluția curentă pentru a găsi variabila care iese din bază (dacă mai e cazul)

 

Aceste elemente se așează într-un tabel de forma:

 

 

 

cB

 

 

 

 

xB

 

 

xB = B-1b

 

 

B-1

 

 

f(xB)

π = ŚB-1

 

numit tabelul simplex redus.

Operațiile ce se efectuează în cadrul algoritmului simplex revizuit sunt (presupunem că problema este la forma standard de maxim și deținem o soluție admisibilă de bază și inversa bazei corespunzătoare):

 

Pasul 1.    Se calculează Dj corespunzători variabilelor secundare cu formula cunoscută:

 

Dj = ŚB-1ŚPj - cj = πŚPj - cj

 

unde Pj este coloana corespunzătoare variabilei xj din matricea inițială.

 

Pasul 2.    Se analizează Dj calculați:

 

-       dacă toți sunt mai mari sau egali cu 0 soluția curentă este optimă. STOP

-       dacă există Dj strict negativi se alege minimul dintre aceștia Dk, variabila xk va intra în bază și se trece la pasul 3.

 

Pasul 3.    Se calculează ak = B-1Pk care se atașează ca nouă coloană la tabel:

 

 

 

cB

 

 

 

 

xB

 

 

xB = B-1b

 

 

B-1

 

 

ak = B-1Pk

 

 

f(xB)

π = ŚB-1

Dk

 

Pasul 4.    Se analizează componentele coloanei ak:

 

-       dacă toate sunt mai mici sau egale cu 0 problema are optim infinit. STOP

-       dacă există aik strict pozitivi se alege cel pentru care se obține:

 

ark =

 

și variabila xr va ieși din bază apoi se trece la pasul 5.

 

Pasul 5.    Se pivotează întregul tabel simplex și se elimină ultima coloană.

Pasul 6.    Se reia algoritmul de la pasul 2.

 

 

Exemplu Fie problema de programare liniară rezolvată mai sus:

 

Forma standard a problemei va fi:

iar după introducerea variabilelor artificiale obținem:

 

Iterația  1.  Prima bază este B = I2 = B-1 corespunzătoare variabilelor x3 și x5 de unde rezultă xB =  și π = (0,-M)ŚI2 = (0,-M). Primul tabel redus va fi:

 

0

-M

x3

x5

10

2

1

0

0

1

 

 

-2M

0

-M

 

Se calculează DS = πŚS – cS = (0,-M)Ś –  =  de unde rezultă că cel mai negativ este D2 și vom calcula coloana a2 = I2Ś = care se adaugă la tabelul anterior rezultând:

 

0

-M

x3

x5

10

2

1

0

0

1

1

4

 

 

-2M

0

-M

-4M-3

 

qi minim este cel corespunzător lui x5 și deci variabila x2 va intra în locul variabilei x5.

După pivotare și eliminarea ultimei coloane obținem:

 

0

3

x3

x2

½

1

0

¼

 

 

0

¾

 

Deoarece variabila artificială x5 a ieșit din bază ea va fi eliminată din problemă.

Iterația 2.   DS = πŚS – cS = (0,¾)Ś –  = ()

cel mai negativ este D1 și vom calcula coloana a1 = Ś = care se adaugă la tabelul anterior rezultând:

0

3

x3

x2

½

1

0

¼

¼

 

 

0

¾

 

 

qi minim este cel corespunzător lui x2 și deci variabila x1 va intra în locul variabilei x2.

După pivotare și eliminarea ultimei coloane obținem:

 

0

2

x3

x1

4

2

1

0

-3

1

 

 

4

0

2

 

Iterația 3.   DS = πŚS – cS = (0,2)Ś –  = ()

cel mai negativ este D4 și vom calcula coloana a4 = Ś = care se adaugă la tabelul anterior rezultând:

 

0

2

x3

x1

4

2

1

0

-3

1

3

-1

 

 

4

0

2

-2

 

 

qi minim este cel corespunzător lui x3 și deci variabila x4 va intra în locul variabilei x3.

După pivotare și eliminarea ultimei coloane obținem:

 

0

2

x4

x1

-1

0

 

 

0

 

Iterația 4.   DS = πŚS – cS = (,0)Ś –  = ()

cel mai negativ este D2 și vom calcula coloana a2 = Ś = care se adaugă la tabelul anterior rezultând:

 

0

2

x4

x1

-1

0

 

 

0

 

 

qi minim este cel corespunzător lui x1 și deci variabila x2 va intra în locul variabilei x1.

După pivotare și eliminarea ultimei coloane obținem:

 

0

3

x4

x2

38

10

4

1

-1

0

 

 

30

3

0

 

Iterația 5. DS = πŚS – cS = (3,0)Ś –  = () >0 deci soluția este optimă (și unică) STOP

 

Chiar dacă la prima vedere calculele par mai împrăștiate și deci mai lente, pentru probleme mari, pe calculator se economisește foarte multă memorie și se mărește foarte mult viteza de calcul.

Totuși, marele avantaj al acestei metode este acela că, la fiecare iterație, se folosesc datele problemei inițiale, ceea ce face ca erorile inerente de rotunjire să nu se propage, rămânând în limite acceptabile.

 

 



(*) De aici rezultă posibilitatea să calculăm coeficienții aij pe baza informațiilor disponibile privind cantitățile consumate Rij și nivelul xj:  aij = ; i = 1,...,m; j = 1,...,n