A hátizsák probléma (a hátizsák probléma is ) egy NP-teljes kombinatorikus optimalizálási probléma . Nevét a végső célról kapta: minél több értékes dolgot tegyen egy hátizsákba, feltéve, hogy a hátizsák befogadóképessége korlátozott. A hátizsák-probléma különféle változataival találkozhatunk a közgazdaságtan , az alkalmazott matematika , a kriptográfia és a logisztika területén .
Általánosságban a probléma a következőképpen fogalmazható meg: egy adott " költség" és "súly" tulajdonságú tételkészletből ki kell választani egy olyan részhalmazt , amelynek összköltsége maximális, az össztömeg korlátozásának betartása mellett.
Legyen egy objektumkészlet, amelyek mindegyikének két paramétere van - tömeg és érték. Van egy hátizsák is, bizonyos teherbírással. A feladat egy olyan hátizsák megépítése, amelyben a benne lévő tárgyak maximális értéket képviselnek, miközben a hátizsák össztömegére vonatkozó korlátot be kell tartani.
Matematikailag a probléma a következőképpen fogalmazódik meg: van rakomány. Minden egyes terhelésre meghatározzák annak tömegét és értékét . A hátizsákban lévő tárgyak összsúlyának korlátját a teherbírás határozza meg . Szükséges
maximalizálni korlátozásokkal és [1] .A problémafelvetés számos általánosítást tesz lehetővé, attól függően, hogy milyen feltételekkel támasztják a hátizsákot, tárgyakat vagy azok választását. A legnépszerűbb fajták a következők:
A hátizsák-probléma egyik legáltalánosabb változata a nemlineáris . A következőképpen fogalmazható meg:
Hagyja, hogy a vektor határozza meg a hátizsákban lévő egyes cikkek példányainak számát. Ekkor a probléma az, hogy megtaláljuk a függvény minimumát
,
adott megkötéssel:
.
A függvényeket folyamatosnak és differenciálhatónak tételezzük fel . egy egész állandó, a halmaz nem üres [7] .
Lineáris függvények esetén a probléma a halmaztól függően a klasszikus megfogalmazások egyikére redukálódik :
A funkciók megválasztásának szabadsága szélesebb körű feladatok megoldását tesz lehetővé, beleértve a termelő létesítmények megszervezését is, a minták optimális eloszlása egy regionalizált mintában , vagy a négyzetes hátizsák probléma megoldása [7] .
Mint fentebb említettük, a hátizsák probléma az NP-teljes osztályba tartozik, és eddig nem találtak rá olyan polinomiális algoritmust , amely ésszerű időn belül megoldaná. Ezért a hátizsák-probléma megoldása során választani kell a "nagy" hátizsákokra nem alkalmazható pontos algoritmusok és a közelítő algoritmusok közül, amelyek gyorsan működnek, de nem garantálják a probléma optimális megoldását.
Más diszkrét problémákhoz hasonlóan a hátizsákos probléma is megoldható az összes lehetséges megoldás kimerítő felsorolásával .
A probléma állapotának megfelelően vannak hátizsákba rakható tárgyak, és meg kell határozni a rakomány maximális költségét, amelynek súlya nem haladja meg a .
Minden tételnél 2 lehetőség van: a tárgyat a hátizsákba helyezik, vagy a tárgyat nem a hátizsákba helyezik. Ekkor az összes lehetséges opció felsorolása időbonyolultságú , ami lehetővé teszi, hogy csak kis számú elemre használjuk [8] . Az objektumok számának növekedésével a probléma ezzel a módszerrel elfogadható időn belül megoldhatatlanná válik.
Az ábra egy iterációs fát mutat három elemhez. Minden levél az elemek bizonyos részhalmazának felel meg. A fa összeállítása után meg kell találni a maximális értékű levelet azok közül, amelyek tömege nem haladja meg a [9] -et .
Az elágazó és kötött módszer a nyers erő módszer egy változata, azzal a különbséggel, hogy a nyers erőfa tudatosan nem optimális ágait kizárjuk. A brute force módszerhez hasonlóan ez is lehetővé teszi az optimális megoldás megtalálását, ezért a pontos algoritmusokhoz tartozik.
Az eredeti algoritmus, amelyet Peter Kolesar javasolt 1967-ben, azt javasolja, hogy az elemeket egységköltségük (az érték és a súly aránya) szerint rendezzék, és készítsenek egy nyers erőfát . Javulása abban rejlik, hogy az egyes csomópontokhoz tartozó fa felépítése során megbecsülik a megoldás értékének felső korlátját , és a fa építése csak a maximális becsléssel rendelkező csomópontra vonatkozik [10] . Amikor a maximális felső korlát a fa levelében van, az algoritmus befejezi a munkáját.
Az elágazás és a kötés azon képessége, hogy csökkentse az iterációk számát, nagymértékben függ a bemeneti adatoktól. Csak akkor célszerű használni, ha a tételek fajlagos értékei jelentősen eltérnek [11] .
Az elemek súlyának további megszorításával a hátizsák-probléma pszeudopolinomiális időben megoldható dinamikus programozási módszerekkel .
Legyen minden elem súlya pozitív egész szám. Ezután a probléma megoldásához ki kell számítani az optimális megoldásokat mindenre , ahol az adott teherbírás. Határozzuk meg a teherbírású hátizsákba elhelyezhető tárgyak maximális értékét .
Rekurzív képleteket írhat :
ahol a -edik elem értéke és súlya van, és az üres halmazból származó maximumot nullának kell tekinteni.
Valójában az utolsó egyenlet R. Bellman funkcionális egyenlete vagy a dinamikus programozás funkcionális egyenlete. Ebben az esetben a megoldáshoz elegendő kiszámítani az összes értéket , kezdve a [12] -ig . Ha minden lépésnél eltárolunk egy olyan elemkészletet, amely a maximális értéket realizálja, akkor az algoritmus az optimális elemkészletet is megadja.
Mivel minden lépésben meg kell találni az elemek maximumát, az algoritmus számítási összetettsége . Mivel ez exponenciálisan függhet a bemenet méretétől, az algoritmus pszeudopolinomiális . Ezért ennek az algoritmusnak a hatékonyságát az értéke határozza meg . Az algoritmus kiváló eredményeket ad a -ra , de nem túl jót a [13] -ra .
Hátizsák probléma 0-1A 0-1 hátizsák feladat megoldása közel áll az előző feladat megoldásához, de figyelembe kell venni, hogy minden tétel egy példányban van. Legyen az első rendelkezésre álló tételekből nyert tételek maximális értéke , amelyek össztömege nem haladja meg a .
Kiszámolva megtalálhatja a pontos megoldást. Ha a tömb elfér a gép memóriájában, akkor valószínűleg ez az algoritmus az egyik leghatékonyabb [12] .
// Bevitel: // Elemértékek (v tömbbe betöltve) // Tételsúlyok (w tömbbe betöltve) Tételek száma (n) Terhelhetőség (W) j esetén 0 - tól W - ig tegye : m [ 0 , j ] := 0 1 - től n - ig csinálom : j esetén 0 - tól W - ig tegye : ha w [ i ] > j , akkor : m [ i , j ] := m [ i -1 , j ] mást : m [ i , j ] := max ( m [ i -1 , j ], m [ i -1 , j - w [ i ]] + v [ i ])A megoldást dinamikus programozással a következőképpen szemléltethetjük: egy kétdimenziós síkon az objektumok számát a tengely mentén , súlyukat pedig a tengely mentén ábrázoljuk. Az első lépésben a koordináták origójából két egyenest építünk: egy vízszintes, amely megfelel annak, hogy az első objektumot nem vettük fel, és egy ferde vonal, amely megfelel az első objektumnak. A tengelyre vetületük megegyezik a tárgy súlyával. A második lépésben ismét 2 vonal épül, vízszintes (a második objektumot nem vették fel) vagy ferde (a második objektumot vették). Állítsuk be a vízszintes ívek hosszát nullára, a ferde ívek hosszát pedig az objektum értékére [14] . Így a probléma bármely megoldása megfelel egy útvonalnak a felépített fában . A probléma a maximális hosszúságú út megtalálására redukálódik [14] . Hagyja, hogy a kapacitás a hátizsák .
Cikkszám | Érték | A súlyt |
---|---|---|
egy | 3 | 5 |
2 | 5 | tíz |
3 | négy | 6 |
négy | 2 | 5 |
Az ábrán látható, hogy az optimális megoldás összértéke 7, mivel ez a maximális érték a megszerkesztett fában.
Dinamikus programozás a tételértékek felettAz ismétlődési relációkat nemcsak az objektumok súlya, hanem az érték tekintetében is fel lehet írni. Ehhez a tételek minimális súlyát a teljes értékkel jelöljük, amelyet az első tételekből kaphatunk . Ha a kívánt súlyt nem lehet elérni, akkor jelölje meg .
Ezt követően megoldjuk a funkcionális dinamikus programozási egyenletet :
,
kezdeti feltételekkel :
A legtöbb NP-teljes feladathoz hasonlóan nem mindig szükséges pontos megoldást találni, mivel az optimálishoz közeli megoldások alkalmazhatók az alkalmazott feladatokban.
A probléma mohó algoritmussal való megoldásához szükséges a dolgokat meghatározott értékük (vagyis egy tárgy értékének súlyához viszonyított aránya) szerint rendezni, és a legmagasabb fajlagos értékű tárgyakat elhelyezni a hátizsákban [10] .
Ennek az algoritmusnak a futási ideje a rendezési idő és a halmozási idő összege. A tételek rendezésének összetettsége . Ezután kiszámítja, hogy a teljes idő alatt hány elem fér el a hátizsákban [10] . Az ebből eredő bonyolultság , amikor a rendezésre van szükség, és amikor az adatok már rendezve vannak [10] .
Példa . Hagyja, hogy a kapacitás a hátizsák . A tételek már egységérték szerint vannak rendezve. Használjuk a mohó algoritmust.
én | a súlyt | ár | ár/súly |
---|---|---|---|
egy | tizenöt | 60 | négy |
2 | harminc | 90 | 3 |
3 | ötven | 100 | 2 |
Az elsőt a hátizsákba tesszük, utána a másodikat. A harmadik elem nem fér be a hátizsákba. A hátizsákban lévő tárgyak összértéke 150. Ha a második és harmadik elemet vennénk, akkor az összérték 190 lenne. Így kaptunk néhány nem optimális megoldást.
Meg kell érteni, hogy egy mohó algoritmus az optimálistól tetszőlegesen távoli válaszhoz vezethet. Például, ha az egyik elem súlya 1 és költsége 2, a másik súlya pedig W és költsége W, akkor a mohó algoritmus 2-es összköltséget fog értékelni W optimális válasz mellett. ugyanakkor ugyanaz az algoritmus a korlátlan hátizsák-problémára az optimális érték legalább 50%-ának megfelelő választ ad [10] .
A mohó algoritmust először George Danzig [16] javasolta a korlátlan hátizsák probléma megoldására.
Mivel a feladat polinomiális idejű megoldásának pontos algoritmusát nem sikerült megtalálni, felmerült a probléma, hogy garantált pontosságú polinomiális megoldást kapjunk . Ehhez számos közelítő séma létezik teljesen polinomiális időre , azaz olyan összetettséggel, amely polinom és -ben .
A klasszikus séma mögött az az ötlet, hogy csökkentse a tételértékek megadásának pontosságát. Ha a hasonló értékű tételeket egy csoportba vonja össze, csökkentheti a különböző tételek számát. Az algoritmus a következőképpen van felírva [15] :
Számos különböző közelítési séma létezik. Ezek azonban erősen függenek a hátizsák-probléma megfogalmazásától. Például, ha egy második egyenlőtlenségi típusú kényszer (kétdimenziós hátizsák) jelenik meg a feltételben, akkor a feladatnak már nincs ismert polinomiális idősémája [17] .
Más NP-nehéz optimalizálási problémákhoz hasonlóan a hátizsák-probléma megoldására genetikai algoritmusokat használnak . Nem garantálják az optimális megoldás megtalálását polinomiális időben , és nem adnak becslést a megoldás közelségéről az optimálishoz, de jó időmutatókkal rendelkeznek, lehetővé téve, hogy gyorsabban találjon egy meglehetősen jó megoldást, mint más ismert determinisztikus vagy heurisztikus . mód. [tizennyolc]
Minden egyed ( genotípus ) azoknak a tárgyaknak a részhalmaza, amelyeket a táskába szeretnénk csomagolni (tömegük meghaladhatja a megengedett teherbírást). A kényelem érdekében az információkat bináris karakterláncokként tároljuk, amelyekben minden bit meghatározza, hogy ez az elem belefér-e egy táskába [19] .
A fitnesz funkció határozza meg a megoldás közelségét az optimálishoz. Például a tételek összértéke szolgálhat ilyennek, feltéve, hogy a teljes tömeg nem haladja meg a teherbírást.
Egy sor generációváltás után, amelyben a legrátermettebb egyedeket keresztezik , a többit pedig figyelmen kívül hagyják, az algoritmusnak az eredeti megoldásokat kell javítania [19] .
A részhalmazösszeg feladat megoldásaA hátizsák 0-1 probléma speciális esete a részhalmazösszeg probléma . Legyen a hátizsák teherbírása, a -edik cikk súlya és költsége . Így a feladat az, hogy a hátizsákot a lehető legszorosabban töltse be, vagy teljesen kimerítse az erőforrásokat:
A megoldáshoz használhatja az említett genetikai algoritmust . Az egyén vektor . Fitness funkcióként a tárgyak össztömegének közelségét kell használni a -hoz, az egyetlen tulajdonsággal, hogy a hátizsákba elférő készletek előnyösebbek (a tárgyak össztömege kisebb, mint ) [19] .
Határozzuk meg formálisan a fitnesz függvényt . Legyen az összes elem súlyának összege. Ezután - a hátizsákban lévő tárgyak súlyának maximális lehetséges eltérése a -tól .
Legyen az adott vektor elemeinek összsúlya. Aztán feltesszük:
[19]
Az általános algoritmus segítségével közelítő megoldást találhatunk:
A végrehajtás vagy a megoldás megtalálásakor, vagy adott számú iteráció után megszakad [19] .
Nem tudni biztosan, hogy ki adta meg először a hátizsák-probléma matematikai megfogalmazását. Az egyik első utalás erre George Ballard Matthews cikkében található[20] [21] 1897-ben kelt. Ennek a problémának az intenzív tanulmányozása azután kezdődött, hogy D. B. Dantzig 1957-ben megjelent az „ English. Discrete Variable Extrémum Problem » [22] , különösen a XX. század 70-90-es éveiben, elméleti szakemberek és gyakorlati szakemberek által [2] . Az érdeklődést sok tekintetben a probléma meglehetősen egyszerű megfogalmazása, számos változata és tulajdonsága, és egyben megoldásuk összetettsége váltotta ki. 1972-ben ez a probléma felkerült M. Karp NP-teljes problémák listájára ( "Reducibility among Combinatorial Problems" angol cikk) [23] .
A hátizsák-probléma vizuális értelmezése oda vezetett, hogy a különböző tudásterületeken alkalmazásra talált: a matematikában, a számítástechnikában és e tudományok metszéspontjában a kriptográfiában is . Az egyik számítógépes nyelvészeti munkában [24] a szövegek automatikus összegzésének problémájának megfogalmazását javasolják , amelynek egy speciális esete a hátizsák-probléma megfogalmazásának felel meg.
A hátizsák-probléma alapján elkészült az első aszimmetrikus titkosítási algoritmus . A nyilvános kulcsú kriptográfia ötletét először Whitfield Diffie és Martin Hellman mutatta be az 1976 -os Országos Számítógépes Konferencián [25] [26] .
Ezenkívül a hátizsák-probléma számos ipari probléma modelljeként szolgálhat [2] [27] :
1978-ban Ralph Merkle és Martin Hellman kifejlesztette az általános nyilvános kulcsú titkosítás első algoritmusát , a Merkle-Hellman kriptorendszert a hátizsák - probléma alapján. Egylépcsős ( angolul singly-iterated ) és többlépcsős ( angol multiply-iterated ) változatot adtak ki, és az algoritmus csak titkosításra volt használható. De Adi Shamir adaptálta digitális aláírásokhoz [28] .
Ezt követően más, a hátizsák-problémán alapuló kriptorendszereket javasoltak, amelyek közül néhány a Merkle-Hellman kriptorendszer módosítása. Ismert titkosítási rendszerek [29] :
Tekintettel arra, hogy az általános hátizsák probléma nem oldható meg pontosan ésszerű időn belül, kriptográfiai problémákban használható. Ehhez egy nyilvánosan ismert elemkészlettel az üzenetet továbbított elemek halmazaként jelenítjük meg, és elküldjük a teljes súlyukat [28] .
Meghatározás. A hátizsák vektor n elemből álló rendezett halmaz, ahol a -edik elem súlya [30] .
A hátizsák vektor egy nyilvános kulcs . Az egyszerű szöveg titkosításához azt bithosszúságú blokkokra bontják , ahol minden bit meghatározza egy-egy elem jelenlétét a hátizsákban (például a sima szöveg a hat lehetséges elem közül az első négynek felel meg a hátizsákban). Úgy tartják, hogy az egyes egy tárgy jelenlétét jelzi a hátizsákban, a nulla pedig a hiányát [28] .
Ezt követően a rendszer kiszámítja a hátizsákban lévő tárgyak összsúlyát az adott nyílt szöveghez, és titkosított szövegként továbbítja [28] .
Példa a titkosításra ezzel az algoritmussal:
Legyen adott egy hosszúságú hátizsák vektor .
egyszerű szöveg | 1 1 1 1 1 0 | 0 0 1 1 0 0 | 0 0 0 0 0 0 | 0 0 0 0 0 1 |
---|---|---|---|---|
Dolgok a hátizsákban | 3 4 6 7 10 | 6 7 | tizenegy | |
Rejtjelezett szöveg | 3 + 4 + 6 + 7 + 10 = 30 | 6 + 7 = 13 | 0 | tizenegy |
A hátizsák probléma | |
---|---|
Alkalmazások | |
A hátizsák problémán alapuló kriptorendszerek |
|
Továbbá |
NP-teljes problémák | |
---|---|
A halmozás (csomagolás) maximalizálási problémája |
|
gráfelmélet halmazelmélet | |
Algoritmikus problémák | |
Logikai játékok és rejtvények | |