INTRODUCERE Domeniul programării liniare în numere întregi ocupă un loc deosebit în teoria optimizării atât prin caracterul problemelor cercetate, cît şi prin complexitatea problemelor, a algoritmilor de soluţionare. Numeroase probleme cu caracter aplicativ pot fi formulate ca probleme de programare liniară în numere întregi. Una dintre aceste probleme este problema rucsacului. Problema rucsacului este o problemă NP- complexă şi este utilizată pe larg la cercetarea complexităţii a numeroase alte probleme. Lucrarea dată examinează problema rucsacului atât în contextul general al programării liniare în numere întregi, cît şi în cadrul metodelor specifice de rezolvare, a aplicaţiilor mai importante. Lucrarea constă din cinci capitole. Capitolul I "Probleme de programare liniară în numere întregi. Problema rucsacului" conţine două paragrafe. În §1.1 sunt expuse câteva formulări ale problemei rucsacului: problema 0/1 a rucsacului, problema rucsacului în numere întregi, problema rucsacului cu inegalităţi (atunci când restricţia ia forma inegalităţii) şi este demonstrat că toate trei forme ale problemei rucsacului sunt echivalente. În §1.2 este cercetată complexitatea problemei rucsacului. Se demonstrează, că problema 0/1 a rucsacului este NP-complexă. La demonstrarea NP-complexităţii problemei rucsacului în numere întregi reformulăm 1
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
INTRODUCERE
Domeniul programării liniare în numere întregi ocupă un loc deosebit în
teoria optimizării atât prin caracterul problemelor cercetate, cît şi prin complexitatea
problemelor, a algoritmilor de soluţionare. Numeroase probleme cu caracter
aplicativ pot fi formulate ca probleme de programare liniară în numere întregi. Una
dintre aceste probleme este problema rucsacului. Problema rucsacului este o
problemă NP-complexă şi este utilizată pe larg la cercetarea complexităţii a
numeroase alte probleme.
Lucrarea dată examinează problema rucsacului atât în contextul general al
programării liniare în numere întregi, cît şi în cadrul metodelor specifice de
rezolvare, a aplicaţiilor mai importante.
Lucrarea constă din cinci capitole.
Capitolul I "Probleme de programare liniară în numere întregi. Problema
rucsacului" conţine două paragrafe.
În §1.1 sunt expuse câteva formulări ale problemei rucsacului: problema 0/1 a
rucsacului, problema rucsacului în numere întregi, problema rucsacului cu
inegalităţi (atunci când restricţia ia forma inegalităţii) şi este demonstrat că toate trei
forme ale problemei rucsacului sunt echivalente.În §1.2 este cercetată complexitatea problemei rucsacului. Se demonstrează, că
problema 0/1 a rucsacului este NP-complexă. La demonstrarea NP-complexităţii
problemei rucsacului în numere întregi reformulăm problema 0/1 a rucsacului în
problema rucsacului în numere întregi.
Capitolul II "Metode de rezolvare a problemelor de programare liniară în
numere întregi", constă din trei paragrafe, în care sunt descrise următoarele metode
de soluţionare a problemelor liniare în numere întregi: Metoda Gomory, Metoda
Branch and Bound, Metoda programării dinamice.
În capitolul III, propunem un algoritm GRASP (Greedy Randomized Adaptive
Search Procedure) pentru a genera o aproximare bună a setului optimal în sensul
1
PARETO (eficient) în probleme de optimizare combinatorie multi-obiectiv .
Algoritmul este aplicat la rezolvarea problemei rucsacului 0/1 cu r-funcţii
obiectiv. Această problemă este formulată asemenea problemei clasice 0/1 a
rucsacului cu r funcţii obiectiv, cu n-elemente (articole), fiecare cu costul şi greutatea
respective, care trebuie introduse în r rucsacuri cu diferite capacităţi pentru a
maximiza costurile totale. Algoritmul se bazează pe o funcţie scalară ponderată
(combinaţia liniară a funcţiilor obiectiv).
La fiecare iteraţie a algoritmului, este determinat un vector prioritar, şi este
alcătuită o soluţie luând în consideraţie preferinţele fiecărui caz. Soluţia găsită este
înlocuită (verificată) printr-o căutare locală, încercându-se îmbunătăţirea funcţiei
scalare ponderate.
Pentru a găsi o mulţime de soluţii eficiente vom folosi diferiţi vectori de
preferinţă, care sunt distribuiţi uniform pe frontiera PARETO.
Algoritmul propus a fost testat pe problemele cu r=2,3,4, şi numărul de
elemente n=250,500,750. Calitatea soluţiilor aproximative este evaluată fiind
comparată cu soluţiile date de 2 algoritmi genetici luaţi din literatura de specialitate.
În capitolul IV numit “Optimizarea globală prin metoda GRASP continuă”
prezentăm o metodă de optimizare globală neobişnuită, numită continuă (C-GRASP),
care este o extensie realizată de Feo şi Resende's a algoritmului GRASP din domeniul
de optimizare discretă la optimizarea globală continuă. Această metodă de căutare
locală este simplu de implementat, este aplicată pe larg, şi nu se foloseşte de
informaţia derivată, astfel creând un suport convenabil pentru rezolvarea problemelor
de optimizare globală. Noi ilustrăm eficacitatea procedurii pe un set de probleme
standarde.
Capitolul V “Aplicaţii” constă din două paragrafe.
În §5.1 este analizată şi rezolvată o problemă de tip rucsac: problema
investiţiilor capitale în care funcţia obiectiv este separabilă şi neliniară.
În §5.2 este expusă nemijlocit problema rucsacului, metoda de rezolvare a
căreia ne-o imaginăm ca un proces din n etape, fiecare etapă constând din umplerea
2
optimă a rucsacului cu obiecte de tip întreg. Tot în acest paragraf e rezolvat un
exemplu particular, în care se determină costul maxim al rucsacului.
3
CAPITOLUL I
PROBLEME DE PROGRAMARE LINIARĂ ÎN NUMERE ÎNTREGI.
PROBLEMA RUCSACULUI
1.1. FORMULĂRI ŞI PROPRIETĂŢI
Prin problema de programare liniară în numere întregi se înţelege o
problemă de programare liniară în care pentru o parte din variabile sau pentru toate se
impune condiţia să ia numai valori întregi. Astfel de restricţii apar, ca de obicei,
atunci cînd variabilele respective desemnează cantităţi indivizibile.
Problema programării liniare în numere întregi are forma:
c1x1+c2x2+...+cnxn max, (1)
(2)
unde N este mulţimea numerelor naturale. De regulă se presupune, că atît
coeficienţii problemei (l)-(2), cît şi termenii liberi sînt numere întregi.
Dacă M = {1,2,...,n }, atunci avem cazul problemei de programare liniară total
în numere întregi, pe scurt PLT.
Dacă M {l,2,...,n}, atunci avem cazul problemei de programare liniară mixtă,
abreviat PLM.
Viaţa cotidiană ne oferă un număr enorm de probleme, care, ori pot fi
formulate ca probleme de tipul (l)-(2), ori pot fi reduse la (l)-(2) printr-o
consecutivitate de transformări elementare. E de ajuns să cerem în problema de
repartizare eficientă a resurselor limitate ca necunoscutele să fie numere întregi (la
producţia garniturilor de mobilă, de exemplu, necunoscutele nu pot fi fracţionare
deoarece e absurd să se producă o jumătate de masă, o treime de scaun etc.) şi
4
obţinem o problemă de programare liniară în numere întregi. Dacă în problema de
transport se examinează ca marfă de livrat de la producători la beneficiari ori
aparate TV, ori automobile, ori calculatoare etc., atunci obţinem alte exemple de
probleme de tipul (l)-(2). Chiar şi în problema dietei unele dintre necunoscute,
corespunzătoare produselor alimentare vândute în recipiente indivizibile, trebuie să fie
întregi. În sfârşit, un număr mare de probleme de tipul (l)-(2) apar în
optimizarea combinatorie, teoria grafelor, logica matematică şi în general, în
cercetarea operaţională.
Un caz particular al problemei de programare liniară în numere întregi este
problema rucsacului.
Din n obiecte cu greutăţile a1, a2,..., an şi costurile c1, c2,..., cn trebuie selectate
într-un rucsac acele din ele, care au în sumă o greutate nu mai mare decât b şi un cost
total maxim posibil.
Dacă obiectele nu pot fi tăiate, atunci avem problema discretă sau problema 0/1
a rucsacului, în care variabilele pot lua doar valorile 0 şi 1. Dacă pentru orice obiect
putem să luăm doar o parte din el X J [0,1], atunci spunem că avem problema
continuă a rucsacului.
Notînd xj=
obţinem următorul model matematic al problemei discrete:
(3)
Variabilele xj care pot avea numai valorile 0 şi 1 mai sunt numite şi
booleene, iar problema de mai sus - problemă de programare booleana sau
problema de programare 0/1. Evident că o problemă de programare 0/1 poate avea
mai multe restricţii, ceea ce ar corespunde în problema rucsacului restricţiilor de
volum, de completare etc.
Dacă raportăm costurile obiectelor la greutăţile lor, obţinem costurile pe unitate
5
de greutate. La rezolvarea problemei continue, o ordonare a obiectelor în funcţie de
creşterea acestor raporturi ne dă posibilitatea să obţinem soluţia optimă, încărcând
obiectele, pe cît e posibil în întregime şi anume în această ordine, pînă cînd rucsacul se
umple. Componentele xj vor lua pe rînd valorile xj=1, pînă cînd greutatea rămasă
disponibilă, notată bd, nu mai permite să se pună un obiect întreg. Ultimul obiect se
taie şi se ia din el numai o parte xj=bd/aj.
Problema discretă cu părere de rău e mult mai complicată şi pentru n suficient
de mare nu mai poate fi rezolvată efectiv. Mai mult, din cele de mai sus reiese că
problema rucsacului în numere întregi nu poate fi rezolvată, în general, prin
aproximarea soluţiei optime a problemei continue corespunzătoare pînă la cea mai
apropiată soluţie optimă întreagă, de aceea ultima poate să încalce ori restricţiile
problemei de programare în numere întregi, ori condiţia de optimalitate. Ca rezultat
survine concluzia, că problemele de programare liniară în numere întregi cer, în
general, alte metode de rezolvare, special adaptate la specificul lor, ceea ce nu exclude
posibilitatea, că la rezolvarea unor probleme particulare să se utilizeze metode ale
programării liniare sau neliniare.
O altă formă de scriere a problemei rucsacului este problema rucsacului în
numere întregi:
c1x1+c2x2+...+cnxn max,
(4)
Un caz particular al problemei rucsacului este atunci cînd restricţia ia
forma inegalităţii:
(5)
obţinînd în acest mod, problema rucsacului cu inegalităţi.
6
Afirmaţie. Toate trei formulări ale problemei rucsacului, şi anume problema 0/1 a
rucsacului, problema rucsacului în numere întregi, problema rucsacului cu
inegalităţi, sunt echivalente.
Uşor se demonstrează, că problema rucsacului cu inegalităţi, se reduce la
problema rucsacului în numere întregi, adică sunt echivalente. Dacă în restricţia din
problema (4) adăugăm variabila , atunci echivalenţa acestor două probleme
este evidentă.
E mai complicat de demonstrat că problema rucsacului cu inegalităţi este
echivalentă şi cu problema 0/1 a rucsacului. Pentru a demonstra că ele sunt totuşi
echivalente, adăugăm în inegalitatea (5) expresia y (y- număr întreg ), unde
, iar
Înlocuind y în problema (3) obţinem:
demonstrînd astfel echivalenţa acestor două probleme.
1.2. COMPLEXITATEA PROBLEMEI
Ne interesează clasificarea problemelor de recunoaştere a proprietăţilor după
complexitatea lor. Vom nota prin P clasa problemelor de recunoaştere, care pot fi
rezolvate cu ajutorul unui algoritm polinomial. Clasa P poate fi determinată exact cu
ajutorul oricărui algoritm formal de determinare, cum ar fi maşina Turing. Dar, se
vede, că toate modelele de calcul posedă proprietatea, că dacă problema poate fi
soluţionată într-un timp polinomial cu ajutorul unui model, atunci ea poate fi
rezolvată într-un timp polinomial cu orice alt model. Astfel, clasa P este stabilă în
raport cu diverse schimbări în cadrul supoziţiilor iniţiale. De aceea, vom determina
clasa P neformal ca o clasă a problemelor de recunoaştere, pentru care sunt
7
cunoscuţi algoritmi polinomiali de soluţionare. Cu alte cuvinte, P este clasa
problemelor simple de recunoaştere, pentru care există algoritmi eficienţi.
Introducem clasa NP [6], o clasă mai extinsă de probleme de recunoaştere. Ca
o problemă să aparţină clasei NP, nu cerem ca răspunsul fiecărei probleme individuale
să fie primit într-o perioadă polinomială de timp cu ajutorul unui oarecare algoritm.
Cerem, pur şi simplu, ca în cazul, cînd pentru problema individuală x obţinem
răspunsul da, să existe o recunoaştere scurtă pentru x, adevărul căreia poate fi
verificat polinomial.
Definiţie. Vom spune, că problema de recunoaştere x intră în clasa NP, dacă
există polinomul p(n) şi algoritmul A (algoritmul de recunoaştere), astfel încît se
îndeplineşte următoarea condiţie: şirul de caractere x este problema individuală a
problemei A cu răspunsul da numai în cazul cînd există şirul c(x) şi |c(x)| < p(|x|), şi
algoritmul A, primind la intrare xSc(x), ajunge la răspunsul da după nu mai mult de
p(|x|) paşi.
Trebuie de menţionat, că pentru a determina apartenenţa unei probleme la clasa
de probleme NP, nu trebuie de explicat cum mai efectiv de recunoscut şirul c(x) la
intrarea lui x. Este necesar, pur şi simplu, de arătat existenţa cel puţin a unui singur şir
de caractere pentru fiecare x.. Menţionăm, că clasa P este submulţime a clasei NP. Cu
alte cuvinte, pentru orice problemă ce se rezolvă efectiv putem construi
recunoaşteri scurte. Pentru a înţelege aceasta, presupunem, că pentru problema A
există algoritmul polinomial AA. Dacă x este o problemă individuală a problemei A
cu răspunsul da, atunci algoritmul AA, folosit pentru x, peste un număr polinomial de
paşi oferă răspunsul da. Înscrierea rezultatului funcţionării algoritmului AA pentru
intrarea x este o confirmare convenabilă c(x).Într-adevăr, pentru a controla c(x), este
de ajuns să verificăm corectitudinea îndeplinirii algoritmului AA..
Dar, de ce NP - clasa problemelor de recunoaştere ne interesează?
Teoremă. Problema 0/1 a rucsacului este NP-complexă.
8
Demonstraţie. Evident, această problemă intră în NP; în afară de aceasta
putem arăta, că problema acoperirea exactă 3-M se exprimă polinomial în
problema 0/1 a rucsacului. Din familia F={Si,...Sn}, formată din n 3-M, vom
construi aşa numere întregi c1,c2,...,cn şi K, iar din c1,c2,...,cn putem forma o submulţime
cu suma K, atunci şi numai atunci, cînd în F există familia ce formează acoperirea
optimă a mulţimii S={u1, u2 ,..., u3m }.
Ne putem imagina toate mulţimile din F ca vectori binari de lungime 3m, de
exemplu: {u1, u5, u6 } şi {u2, u4 , u6 } iau forma 100011 şi 010101. Vom interpreta
aceşti vectori binari ca numere întregi, scrise în baza (n +1). Cu alte cuvinte, mulţimii
S, îi corespunde numărul întreg . În afară de aceasta fie K-număr întreg,
ce-i corespunde
Afirmăm, că în F există subfamilii, ce acoperă exact {u1,u2,...,u3m} numai în cazul,
dacă printre cj există submulţimi cu suma K.Demonstrăm suficienţa. Presupunem că există mulţimea , că
, calculînd această sumă în sistemul de numeraţie cu baza n+1 observăm,
că în termenii sumei se întâlnesc numai numerele 0 şi 1 şi în afară de aceasta
numărul termenilor este mai mic decît baza n+1. Drept urmare, la aşa înmulţire nu sînt
transferuri. De aceea dacă aceasta înseamnă, că în fiecare din 3m poziţii
există exact o unitate sau, cu alte cuvinte, subfamilia
C={Sj, j S } exact acoperă {u1, u2 ,..., u3m }.
Demonstrăm necesitatea. Dacă C este acoperire exactă a mulţimii {u1, u2 ,...,
u3m }, atunci rezultă că . Putem demonstra de asemenea că problema 0/1 a
rucsacului este NP-complexă chiar şi atunci, cînd K se alege egal cu .
9
CAPITOLUL II
METODE DE REZOLVARE A PROBLEMELOR DE PROGRAMARE
LINIARĂ ÎN NUMERE ÎNTREGI
2.1. METODA GOMORY
Se consideră problema:
( 1 )
(2)
unde rang(A) = m.
dintre ele avînd O metodă incipientă de soluţionare a acestei probleme
porneşte cu soluţionarea problemei relaxate [3], care nu ţine cont de integritatea
variabilelor.
1°. Dacă soluţia optimă x* a problemei relaxate are toate componentele întregi,
atunci (l)-(2) este rezolvată.
2°. Dacă problema relaxată nu are soluţii admisibile, atunci şi (l)-(2) nu are soluţii
admisibile.
3°. Dacă soluţia optimă z* are cel puţin o componentă neîntreagă, atunci se
alcătuieşte o restricţie liniară suplimentară, verificată de orice soluţie întreagă a
problemei (1)-(2) şi neverificată de soluţia optimă neîntreagă x* a problemei relaxate.
Ea se alătură sistemului de restricţii al problemei. Se rezolvă problema extinsă şi se
verifică iarăşi condiţiile l°-3°.
Lesne se înţelege că pasul 3° va genera iterativ o consecutivitate de probleme,
fiecare, în comparaţie cu problema precedentă, cu o restricţie mai
10
mult. Dacă procedeul de alcătuire a restricţiei adiţionale este pus la punct, după un număr
finit de iteraţii ori se determină soluţia problemei (l)-(2), ori se determină că (l)-(2) nu
are soluţie. Dacă procedeul de alcătuire a restricţiei adiţionale e inadecvat, paşii l°-3° se
pot repeta la nesfirşit, generîndu-se probleme cu un număr de restricţii oricît de mare.
Ideea unei asemenea metode îi aparţine lui Dantzig. Meritul de a indica o
procedură riguroasă şi bine pusă la punct de formare a restricţiilor adiţionale îi aparţine
lui Gomory.
Algoritmul lui Gomory de soluţionare a problemei de programare liniară în
numere întregi
La expunerea algoritmului vom avea nevoie de următoarele notaţii:
[x] — partea întreagă a lui x R — cel mai mare număr întreg, mai mic decît x;
{x}= x-[x]— partea fracţionară a lui x R.
Sunt evidente proprietăţile:
[x] x , 0<{x}< 1.
Exemple :
[0,1]=0; {0,1} = 0,1.
[1,1]=1; {1,1} = 0,1.
[-0,2]= -1; {0,2} = 0,8.
Oricărei soluţii admisibile de bază optime x' a problemei relaxate (l)-(2) îi
corespunde un sistem (echivalent sistemului (2)):
(3)
(J este- mulţimea indicilor componentelor nebazice), la care s-a ajuns printr-o
consecutivitate de pivotări ale algoritmului simplex. Sistemul (3), în notaţiile de mai
sus, se scrie sub forma:
(4)
11
Teorema 1. Dacă soluţia optimă admisibilă, de bază x' a problemei relaxate
(1)-(2) are componenta x j k = k neîntreagă ({ }>0), atunci:
I. orice soluţie întreagă a sistemului (2) satisface inecuaţia:
(5)
II. soluţia optimă admisibilă de baza (neîntreagă) x1 a problemei relaxate ( l ) -
(2) nu satisface inecuaţia (5).
Demonstraţie . I. Fie x* o careva soluţie întreagă a sistemului (2). Rezultă că
x* este soluţie şi a sistemului (3), şi a sistemului (4). Din (4) rezultă că:
este de asemenea întreagă, existînd două posibilităţi:
echivalent cu
(6) şi (7)
Să arătăm că (6) nu este verificată de nici o soluţie admisibilă a problemei (1)-(2).
Într-adevăr, (6) este echivalentă cu
,
care contrazice nenegativităţii componentelor ,{ kj}, , j J. Ca rezultat, deoarece
(6) şi (7) definesc două semispaţii reciproc complementare faţă de Rn, rezultă că orice
soluţie întreagă a sistemului (3), nesatisfacînd (6), va satisface (7) (echivalent cu (5)).
II. Soluţia x', fiind soluţie admisibilă de bază a sistemului (3), are nule toate
componentele nebazice .Înlocuind aceste valori în (5), obţinem 0 >{ }, ce
contrazice supoziţiei teoremei: .
12
Corolarul 1. Dacă soluţia optimă x' a problemei relaxate nu este întreagă ( )
şi toate componentele , ale tabelului simplex sunt întregi, atunci (5) defineşte
o inegalitate contradictorie, ceea ce înseamnă că (l)-(2) nu are soluţii întregi.
Teorema 1 şi corolarul 1 ne permit să concretizăm ideea lui Dantzig, expusă în
preambulul acestui subcapitol, prin următorul algoritm:
0°. Se rezolvă problema relaxată (l)-(2) şi se determină soluţia optimă x*.
1°. Dacă x* are toate componentele întregi, atunci (l)-(2) este rezolvată.
2°. Dacă problema relaxată nu are soluţii admisibile, atunci şi (l)-(2) nu are soluţii
admisibile.
3°. Se formează restricţia adiţională (5).
Dacă (5) este contradictorie (vezi corolarul (1)), atunci (l)-(2) nu are soluţii
întregi.
Dacă (5) nu este contradictorie, atunci problema curentă se extinde cu restricţia (5).
Se determină soluţia optimă x* a problemei extinse relaxate şi se trece la pasul 1o.
Remarca 1. Restricţia adiţională (5) taie efectiv mulţimea de soluţii admisibile X a
problemei relaxate (1)-(2), înlăturînd o parte a ei. Restricţia adiţională (5) se scrie sub
forma de ecuaţie introducînd variabile ecart xn+1>0, care se scade din membrul stîng.
Adăugarea la sistemul (2) a acestei restricţii conduce la problema extinsă relaxată:
(8)
(9)
Dacă (8)-(9) are soluţie întreagă, algoritmul ia sfîrşit. În cazul în care problema
are soluţie întreagă, algoritmul continuă cu formarea altei restricţii adiţionale şi
extinderea cu ea a problemei curente.
13
Remarca 2. Problema (8)-(9) poate fi soluţionată sau prin algoritmul simplex
primal, sau prin algoritmul simplex dual.
Algoritmul simplex primal se realizează ori prin metoda celor două faze, ori prin
metoda coeficienţilor de penalizare. În ultimul caz (8)-(9), în urma introducerii variabilei
artificiale xn+2 0 se aduce la forma:
unde M este coeficientul de penalizare.
Algoritmul simplex dual, la etapa de iniţiere, cere înmulţirea ultimei ecuaţii
cu -1. Ca rezultat, termenul liber devine negativ, iar variabila x n+1 se trasformă în