Hrvatski matematički elektronski časopis math.e | |
http://www.math.hr/~mathe/ |
Heuristički algoritmi za 0-1 problem naprtnjače
Anamari Nakić
Navikli smo vjerovati da računalo može riješiti probleme brže i
točnije od nas samih, dovoljno mu je pokazati kako.
Jedan od poznatih matematičkih
zadataka jest i problem trgovačkog putnika. Prilično ga je jednostavno opisati,
način pronalaženja rješenja brzo se nametne, ali koliko bi vremena računalu trebalo da riješi ovaj
problem - to je već drugo pitanje. Dakle, trgovački putnik mora obići n gradova
tako da završi u onom u kojem je i počeo, te da svaki grad (osim prvoga) obiđe samo jednom.
Svaka dva grada povezuje jedna cesta tako da je mnogo različitih načina na koje naš
trgovački putnik može posjetiti sve gradove, no njegov je cilj prijeći što manje kilometara i
vratiti se kući što prije. Prvo što nam pada na pamet jest izračunati duljine svih mogućih
puteva koji zadovoljavaju uvjete i odabrati onaj najkraći. Za n gradova takvih je puteva n!.
Tako bismo za 5 gradova morali izračunati duljine
U ovom je slučaju ipak bolje izračunati neko približno rješenje nego oporučno budućim generacijama ostaviti da čekaju da vaše računalo završi s radom. Iako je naša želja pronaći optimalno rješenje, to je ponekad preteško pa bismo se zadovoljili i nekim dopustivim rješenjem koje ne mora nužno biti optimalno, ali zadovoljava sve uvjete problema. Vrlo često metode približnog računanja imaju čvrstu matematičku pozadinu koja svjedoči o njihovoj pouzdanosti neovisno o ulaznim podacima. U isto vrijeme daju i ocjenu konvergencije pa uvijek možemo biti svjesni koliko smo blizu ( ili daleko ) optimalnom rješenju. No, ponekad je iz rezultata očito da nije daleko od optimalnog, ali (još uvijek) nije dokazano koliko je metoda dobra te koliko smo blizu najboljem rješenju i nema garancije da će račun dati dobre rezultate za različite ulazne parametre. Takve metode nazivaju se heurističkima.
Naziv heuristički algoritam koristi se za opisivanje algoritma koji se bazira na heuristici. Takvi su algoritmi obično iterativni. Potragu za rješenjem počinju nekim trivijalnim dopustivim rješenjem problema koje je često daleko od optimalnog. Pri svakoj iteraciji modificiraju trenutno rješenje kako bi došli što bliže optimalnom. Heuristika se koristi prilikom odabira parametara za iduću iteraciju unutar algoritma kao i prilikom odabira konstanti koje se koriste tijekom algoritma. Heuristički algoritmi baziraju se na različitim strategijama: tako neki pronalaze ideju oponašajući kaljenje metala (eng. simulated annealing), neki penjanje uz planinu (eng. hill-climbing), a neki evolucijske procese.
Osim heurističkih, postoje i aproksimacijski algoritmi koji se koriste u iste svrhe. Razlika između ovih dviju vrsta algoritama u tome je što za aproksimacijske algoritme postoje neke matematičke ocjene konvergencije, tj. možemo odrediti koliko ćemo se dobro približiti optimalnom rješenju. Za heurističke algoritme nema matematičkog dokaza da rade dobro, ali se u primjenama pokazuju zadovoljavajućim, a mogu biti brži od aproksimacijskih algoritama.
Konkretno, uzmimo da bi za obilazak 5 gradova putnik morao prijeći najmanje 768 kilometara. Heuristički algoritam mogao bi dati za rješenje baš 768, ali i 1000 i 1048 ili neki drugi broj, ovisno o ulaznim parametrima. Čak štoviše, prilikom ponovnog izvođenja algoritma (programa) s istim parametrima mogli bismo dobiti sasvim drugo rješenje. Nema garancije da ćemo dobiti dobar rezultat, ali nakon nekoliko pokretanja programa šanse su velike da ćemo doći do zadovoljavajuće kilometraže.
Osnovna ideja ovog tipa heurističkog algoritma jest zamijeniti dopustivo rješenje X novim, najboljim rješenjem Y iz njegove okoline, koje je također dopustivo. Treba biti pažljiv jer moglo bi se dogoditi da u sljedećem koraku zamijenimo Y s X pa bismo se počeli vrtjeti u krug, što nikako ne želimo. Zato se izgrađuje "tabu-lista" u kojoj se nalaze neka rješenja koja algoritam ne smije odabrati u sljedećem koraku. U tabu-listi ne nalaze se sva dopustiva rješenja koja je algoritam u nekom koraku posjetio, već samo ona posjećena u zadnjih L iteracija (uobičajeno je L = 10). Za potpuno onemogućavanje ciklusa, L bi trebao biti jako velik, no tada ne bi bilo mnogo dozvoljenih odabira i bilo bi ih teško naći. Time bi se program usporio, što je u suprotnosti s onim što se heurističkim algoritmima nastoji postići: dopušta se lošiji rezultat, ali se omogućava veća brzina izvođenja programa.
Algoritam simuliranog kaljenja, kao i tabu algoritam, omogućava bijeg iz lokalno optimalnog rješenja (koje ne mora nužno biti i globalno optimalno), a bazira se na metodi oplemenjivanja metala koja se naziva kaljenjem i koristi se već 7000 godina. Proces se sastoji od 3 faze: zagrijavanja na visoku temperaturu, zadržavanja na toj temperaturi i zatim hlađenja, obično na sobnu temperaturu. Polaganim hlađenjem inducira se promjena kristalne rešetke metala tako da njezina energija postaje najmanja moguća. Tako metali postaju čvršći. Hlađenje je potrebno obaviti vrlo pažljivo: ako se ohladi prebrzo, može doći do pucanja metala, a potrebno je i neko vrijeme kako bi došlo do potrebnih transformacija u molekularnoj strukturi metala.
U općenitom slučaju naša je želja maksimalizirati neku funkciju P, tj. pronaći takav X da je P(X) maksimalna. Ova metoda aktualno dopustivo rješenje X zamjenjuje nekim njemu bliskim dopustivim rješenjem Y ako je P(Y) P(X). No, ponekad je i u slučaju kada je P(Y) < P(X) dopušteno X zamijeniti s Y: ako za slučajno generirani r [0,1] vrijedi
X će se zamijeniti s Y. Vjerojatnost da se dopustivo rješenje X zamijeni s Y kada je P(Y) < P(X) iznosi e(P(Y) - P(X)) / T. Na taj način algoritam neće zaglaviti u lokalnom minimumu.
Kako
ova metoda simulira hlađenje, kontrolna varijabla koja oponaša
padanje temperature (T) iznimno je važna, a njezina je početna vrijednost
T0 > 0. Tijekom izvođenja
programa varijabla T smanjuje se prema određenom rasporedu
hlađenja. Uobičajeno je da se nakon svake iteracije T promijeni prema
pravilu T : = T,
Spremajući se za put, vjerojatno se uvijek trudite ponijeti što manje stvari, a opet dovoljno da imate sve što vam može zatrebati. To vjerojatno činite odoka, imate već iskustva u pakiranju. No, u nekom skladištu ponekad je teško procijeniti koju robu staviti u kamion tako da bude maksimalno popunjen, a da zarada nakon istovara bude najveća moguća uz postojeća ograničenja (npr. veličina kamiona ili ukupna težina tereta). Optimalno je rješenje, kao i kod problema trgovačkog putnika, za velik broj predmeta (uz memorijska i procesorska ograničenja današnjih računala) teško pronaći pa ćemo se poslužiti heurističkim algoritmima.
0-1 problem naprtnjače jedan je od poznatijih ( i jednostavnijih ) problema iz klase NP. Neke njegove inačice koristile su se u kriptiranju. Jedna od njih je i problem zbroja podskupa: u danom skupu prirodnih brojeva potrebno je odrediti postoji li podskup kojem je zbroj elemenata jednak nekom zadanom broju. No, vratimo se našem originalnom problemu i zapišimo ga formalnije kako bismo ga mogli lakše koristiti u programiranju.
Ako je dano n predmeta (y0,..., yn-1), svaki od njih s težinom wi i cijenom pi , i = 0,...n-1, potrebno je utvrditi koje je predmete moguće odabrati tako da suma njihovih težina ne prelazi zadani M, a da je njihova ukupna vrijednost maksimalna. Tada je rješenje n-torka X = (x0,..., xn-1) {0,1}n, takva da je
Uređenu n-torku interpretiramo ovako: ako smo i-ti predmet stavili
u ruksak, xi = 1, u suprotnom xi = 0. Funkcija
Ovaj problem može se egzaktno riješiti metodom iscrpljujućeg pretraživanja prostora dopustivih rješenja (riječ je o tzv. backtracking algoritmu, detaljnije o tome možete pročitati u [3]).
Slijede dva heuristička algoritma za 0-1 problem naprtnjače.
Neka je X = (x0,..., xn-1) neko dopustivo rješenje te neka je j slučajno izabran broj, 0 j n-1 . Tada se novo rješenje Y = (y0,..., yn-1) dobije tako da
|
Primijetite da je Y dopustivo rješenje ako xj = 1 ili ako je xj = 0 i w(X) + wj M. Sada je očito da je
|
Pretpostavimo sada da je Y dopustivo rješenje (w(Y) M). Ako je xj = 0,
onda je P(X) < P(Y) i X će biti zamijenjen s Y. Ako je pak
xj = 1, onda je
Najčešće se za početnu vrijednost uzima X = (0,...,0). Još je potrebno odrediti parametre T0, i cmax. Pravilo ne postoji: nakon nekoliko pokušaja s različitim vrijednostima varijabli pokaže se koje vrijednosti daju najbolja rješenja. Parametar T0 se odabire tako da je vjerojatnost zamjene na početku algoritma visoka. Ako se želi da temperatura sporo pada, mora biti blizu 1 ( = 0.995, 0.999, 0.9999). U suprotnom, što je manji, temperatura će brže padati. Preporučljivo je da broj iteracija bude veći od 1000 (cmax 1000). Ovaj algoritam nema ocjene koliko se možemo približiti rješenju. Za neke će ulazne podatke raditi loše, pa je potrebno malo eksperimentirati s parametrima kako bi se dobila efikasna verzija programa.
Dodatak: Pseudokod za algoritam simuliranog kaljenja za 0-1 problem naprtnjače
Kao i kod algoritma simuliranog kaljenja, novo rješenje Y
dobiveno iz X razlikovat će se od X samo u jednoj koordinati:
yi = 1 - xi. Način na koji ćemo odabirati
koordinatu i neće
biti slučajan, već ćemo pokušati povećati profit što je više
moguće. Pokazalo se da je bolje gledati omjere profita i težine
pi/wi nego samo profite. Ovo je, dakle, naša strategija:
Dodatak: Pseudokod tabu algoritma za 0-1 problem naprtnjače
I problem trgovačkog putnika i 0-1 problem naprtnjače spadaju u klasu NP. Jedno od svojstava problema te klase jest da još uvijek nije poznato postoji li upotrebljivi algoritam polinomijalne složenosti koji pronalazi optimalno rješenje. Eksponencijalni algoritmi svakako postoje, ali lako ćete se uvjeriti da oni za veće instance problema nisu praktični.
Pronalazak bržih algoritama za NP-teške probleme jedno je od velikih otvorenih pitanja suvremene matematike. O težini tog problema i njegovoj važnosti svjedoči podatak da je za njegovo rješenje slavni Clay institut ponudio milijun dolara. U pokušajima da se ovaj problem riješi (naravno, iz ljubavi prema znanosti, nikako prema novcu), postignuti su mnogi važni rezultati i ovo je jedno od matematičkih područja koje se razvija velikom brzinom. Stoga požurite, jer milijun dolara možda čeka upravo vas. Dovoljno je odgovoriti na jednostavno pitanje:
te odgovarajuće vrijednosti profita:
te odgovarajuće vrijednosti profita:
[1] M. Sipser: Introduction to the Theory of Computation, PWS, Boston, 1997.
[2] D.L. Kreher, D.R. Stinson: Combinatorial Algorithms - Generation, Enumeration and Search, CRC Press, Boca Raton, 1999.
[3] R.Manger, M.Marušić: Strukture podataka i algoritmi, PMF-Matematički odjel, Zagreb, 1999.
[4] R. Sedgewick: Algorithms in C, Addison-Wesley, Reading, 1990.