Problém batohu (také problém batohu ) je NP-úplný kombinatorický optimalizační problém . Svůj název dostal podle konečného cíle: dát do batohu co nejvíce cenných věcí za předpokladu, že kapacita batohu je omezená. S různými variacemi problému batohu se můžeme setkat v ekonomice , aplikované matematice , kryptografii a logistice .
Obecně lze problém formulovat následovně: z dané množiny položek s vlastnostmi „cena“ a „hmotnost“ je třeba vybrat podmnožinu s maximálními celkovými náklady při dodržení omezení celkové hmotnosti.
Nechť existuje množina objektů, z nichž každý má dva parametry – hmotnost a hodnotu. Nechybí ani batoh s určitou nosností. Úkolem je postavit batoh s maximální hodnotou předmětů uvnitř, při respektování limitu batohu na celkovou hmotnost.
Matematicky je problém formulován následovně: existuje náklad. Pro každé zatížení se určí jeho hmotnost a hodnota . Limit celkové hmotnosti věcí v batohu je dán nosností . Nutné
maximalizovat s omezeními a [1] .Problémové prohlášení umožňuje velké množství zobecnění v závislosti na podmínkách kladených na batoh, předměty nebo jejich volbu. Nejoblíbenější odrůdy jsou následující:
Jedna z nejobecnějších variant problému batohu je nelineární . Lze jej formulovat následovně:
Nechte vektor určit počet výskytů každé položky v batohu. Pak je problém najít minimum funkce
,
s daným omezením:
.
Předpokládá se, že funkce jsou spojité a diferencovatelné na . je celočíselná konstanta, množina je neprázdná [7] .
V případě lineárních funkcí je problém redukován na jednu z klasických formulací v závislosti na množině :
Volnost ve výběru funkcí umožňuje řešit širší třídu úkolů, včetně organizace výrobních zařízení, optimální rozložení vzorků v regionalizovaném vzorku nebo řešení problému kvadratického batohu [7] .
Jak již bylo zmíněno výše, problém batohu patří do třídy NP-complete a zatím pro něj nebyl nalezen žádný polynomiální algoritmus , který by jej vyřešil v rozumném čase. Při řešení problému s batohem je proto nutné volit mezi přesnými algoritmy, které nejsou použitelné pro „velké“ batohy, a přibližnými, které fungují rychle, ale nezaručují optimální řešení problému.
Stejně jako u jiných diskrétních problémů lze problém s batohem vyřešit vyčerpávajícím výčtem všech možných řešení.
Podle stavu problému existují položky, které lze vložit do batohu, a je třeba určit maximální náklady na náklad, jehož hmotnost nepřesahuje .
Pro každý předmět jsou 2 možnosti: předmět je umístěn v batohu, nebo předmět není umístěn v batohu. Pak má výčet všech možných možností časovou složitost , což umožňuje jeho použití jen pro malý počet položek [8] . S nárůstem počtu objektů se problém stává touto metodou v přijatelném čase neřešitelný.
Obrázek ukazuje iterační strom pro tři položky. Každý list odpovídá nějaké podmnožině položek. Po sestavení stromu je nutné najít list s maximální hodnotou mezi těmi, jejichž hmotnost nepřesahuje [9] .
Metoda větví a vázaných je variací metody hrubé síly s tím rozdílem, že jsou vyloučeny vědomě neoptimální větve stromu hrubé síly. Stejně jako metoda hrubé síly umožňuje najít optimální řešení a patří tedy k přesným algoritmům.
Původní algoritmus, navržený Peterem Kolesarem v roce 1967, navrhuje třídit položky podle jejich jednotkové ceny (poměr hodnoty k hmotnosti) a sestavit strom hrubé síly . Jeho vylepšení spočívá v tom, že v procesu budování stromu pro každý uzel je odhadnuta horní mez hodnoty řešení a konstrukce stromu pokračuje pouze pro uzel s maximálním odhadem [10] . Když je maximální horní mez v listu stromu, algoritmus ukončí svou práci.
Schopnost větvení a vazby snížit počet iterací do značné míry závisí na vstupních datech. Je vhodné jej použít pouze v případě, že se konkrétní hodnoty položek výrazně liší [11] .
S dodatečným omezením na hmotnosti položek lze problém batohu vyřešit v pseudopolynomiálním čase pomocí metod dynamického programování .
Váha každé položky nechť je kladné celé číslo. Poté je pro vyřešení problému nutné vypočítat optimální řešení pro všechny , kde je daná nosnost. Definujme jako maximální hodnotu předmětů, které lze umístit do batohu s nosností .
Pro můžete psát rekurzivní vzorce :
kde je hodnota a váha -té položky a maximum z prázdné množiny by mělo být považováno za rovné nule.
Ve skutečnosti je poslední rovnicí funkcionální rovnice R. Bellmana neboli funkcionální rovnice dynamického programování. V tomto případě k vyřešení stačí vypočítat všechny hodnoty , počínaje a až [12] . Pokud navíc v každém kroku uložíme sadu položek, která realizuje maximální hodnotu, pak algoritmus také poskytne optimální sadu položek.
Protože v každém kroku je nutné najít maximum položek, má algoritmus výpočetní náročnost . Protože může exponenciálně záviset na velikosti vstupu, je algoritmus pseudopolynomiální . Proto je účinnost tohoto algoritmu určena hodnotou . Algoritmus dává vynikající výsledky pro , ale ne příliš dobré pro [13] .
Problém batohu 0-1Řešení úlohy batohu 0-1 se blíží řešení předchozí úlohy, je však nutné počítat s tím, že každá položka je v jediném exempláři. Dovolit je maximální hodnota položek získaných z prvních dostupných položek s celkovou hmotností nepřesahující .
Výpočtem můžete najít přesné řešení. Pokud se pole vejde do paměti stroje, pak je tento algoritmus pravděpodobně jedním z nejúčinnějších [12] .
// Vstup: // Hodnoty položek (načteny do pole v) // Hmotnosti položek (načtené do pole w) // Počet položek (n) // Nosnost (W) pro j od 0 do W proveďte : m [ 0 , j ] := 0 pro já od 1 do n udělám : pro j od 0 do W proveďte : pokud w [ i ] > j pak : m [ i , j ] := m [ i -1 , j ] jinak : m [ i , j ] := max ( m [ i -1 , j ], m [ i -1 , j - w [ i ]] + v [ i ])Řešení lze znázornit pomocí dynamického programování následovně: na dvourozměrné rovině je počet objektů vykreslen podél osy a jejich hmotnost je vynesena podél osy. V prvním kroku se z počátku souřadnic sestaví dvě čáry: vodorovná, která odpovídá skutečnosti, že první objekt nebyl pořízen, a nakloněná, která odpovídá prvnímu pořízenému objektu. Jejich průměty na osu se rovnají váze předmětu. Ve druhém kroku se opět postaví 2 čáry, horizontální (druhý objekt nebyl pořízen) nebo šikmý (druhý objekt byl pořízen). Délku vodorovných oblouků nastavíme na nulu a délku šikmých oblouků na hodnotu objektu [14] . Jakékoli řešení problému tedy odpovídá nějaké cestě v konstruovaném stromu . Problém se redukuje na nalezení cesty maximální délky [14] . Nechte kapacitu batohu .
Číslo položky | Hodnota | Váha |
---|---|---|
jeden | 3 | 5 |
2 | 5 | deset |
3 | čtyři | 6 |
čtyři | 2 | 5 |
Z obrázku je vidět, že celková hodnota pro optimální řešení je 7, protože se jedná o maximální hodnotu ve zkonstruovaném stromu.
Dynamické programování nad hodnotami položekRekurentní vztahy lze psát nejen s ohledem na váhu předmětů, ale také s ohledem na hodnotu. K tomu označíme minimální váhu položek celkovou hodnotou , kterou lze získat z prvních položek. Pokud požadovanou hmotnost nelze získat, označte ji jako .
Poté vyřešíme rovnici funkcionálního dynamického programování :
,
Stejně jako u většiny NP-úplných problémů není vždy nutné získat přesné řešení, protože řešení, která jsou blízká optimální, lze použít v aplikovaných problémech.
K vyřešení problému s chamtivým algoritmem je nutné seřadit věci podle jejich konkrétní hodnoty (tedy poměru hodnoty předmětu k jeho váze) a do batohu umístit předměty s nejvyšší specifickou hodnotou [10] .
Doba běhu tohoto algoritmu je součtem doby třídění a doby skládání. Složitost řazení položek je . Dále spočítá, kolik věcí se do batohu vejde za celkový čas [10] . Výsledná složitost při řazení je potřeba a když jsou data již setříděna [10] .
Příklad . Nechte kapacitu batohu . Položky jsou již seřazeny podle hodnoty jednotky. Použijme chamtivý algoritmus.
i | váha | cena | cena/váha |
---|---|---|---|
jeden | patnáct | 60 | čtyři |
2 | třicet | 90 | 3 |
3 | padesáti | 100 | 2 |
Do batohu vložíme první položku a po ní druhou. Třetí položka se do batohu nevejde. Celková hodnota věcí v batohu je 150. Pokud by se vzal druhý a třetí předmět, celková hodnota by byla 190. Tím jsme získali nějaké neoptimální řešení.
Mělo by být zřejmé, že chamtivý algoritmus může vést k odpovědi libovolně vzdálené od optimální. Pokud má například jedna položka váhu 1 a cenu 2 a druhá má váhu W a cenu W, pak chamtivý algoritmus získá celkové náklady 2 s optimální odpovědí W. stejný algoritmus pro neohraničený problém batohu zároveň povede k odpovědi alespoň 50 % hodnoty optima [10] .
Chamtivý algoritmus poprvé navrhl George Danzig [16] pro řešení neomezeného problému batohu.
Protože nebyl nalezen přesný algoritmus pro řešení úlohy v polynomiálním čase , vyvstal problém získat polynomické řešení se zaručenou přesností . K tomu existuje řada přibližných schémat plně polynomiálního času , tedy se složitostí, která je polynomem v a .
Myšlenkou klasického schématu je snížit přesnost uvádění hodnot položek. Spojením položek podobné hodnoty do jedné skupiny můžete snížit počet různých položek. Algoritmus je napsán následovně [15] :
Existuje mnoho různých aproximačních schémat. Silně však závisí na formulaci problému batohu. Pokud se například v podmínce objeví druhé omezení typu nerovnosti (dvourozměrný batoh), pak problém již nemá známé polynomiální časové schéma [17] .
Stejně jako u jiných NP-tvrdých optimalizačních problémů se k řešení problému s batohem používají genetické algoritmy . Nezaručují nalezení optimálního řešení v polynomiálním čase a neposkytují odhad blízkosti řešení k optimálnímu, ale mají dobré časové ukazatele, které umožňují najít poměrně dobré řešení rychleji než jiné známé deterministické nebo heuristické metody. [osmnáct]
Každý jedinec ( genotyp ) je podmnožinou věcí, které chceme do brašny zabalit (jejich celková hmotnost může přesáhnout povolenou nosnost). Pro usnadnění jsou informace uloženy jako binární řetězce, ve kterých každý bit určuje, zda se tato položka vejde do brašny [19] .
Fitness funkce určuje blízkost řešení k optimálnímu. Jako taková může sloužit například celková hodnota položek za předpokladu, že celková hmotnost nepřesáhne nosnost.
Po sérii generačních změn, při kterých se kříží nejschopnější jedinci a zbytek se ignoruje, má algoritmus zlepšit původní řešení [19] .
Řešení problému součtu podmnožinySpeciálním případem problému batohu 0-1 je problém součtu podmnožiny . Nechť je nosnost batohu, váha -té položky a její cena . Úkolem je tedy naložit batoh co nejtěsněji nebo zcela vyčerpat zdroje:
K jeho vyřešení můžete použít zmíněný genetický algoritmus . Jednotlivec je vektor . Jako fitness funkci by se mělo používat blízkost celkové hmotnosti předmětů k , přičemž jedinou vlastností je, že sady, které se vejdou do batohu, jsou výhodnější (celková hmotnost předmětů je menší než ) [19] .
Pojďme formálně definovat funkci fitness . Nechť je součet vah všech položek. Potom - maximální možná odchylka hmotnosti předmětů v batohu od .
Nechť je celková váha položek pro daný vektor. Poté vložíme:
[19]
Pomocí obecného algoritmu můžeme najít přibližné řešení:
Provádění se přeruší buď při nalezení řešení, nebo po daném počtu iterací [19] .
Není jisté, kdo byl první, kdo dal matematickou formulaci problému s batohem. Jednu z prvních zmínek o ní lze nalézt v článku George Ballarda Matthewse[20] [21] z roku 1897. Intenzivní studium tohoto problému začalo po vydání knihy D. B. Dantziga v roce 1957 „ Angličtina. Extrémní problém diskrétních proměnných » [22] , zejména v 70.–90. letech 20. století, jak teoretiky, tak praktiky [2] . Zájem v mnoha ohledech vyvolala poměrně jednoduchá formulace problému, velké množství jeho odrůd a vlastností a zároveň složitost jejich řešení. V roce 1972 byl tento problém zařazen do seznamu NP-úplných problémů M. Karpa ( anglický článek "Reducibility Among Combinatorial Problems" ) [23] .
Vizuální interpretace problému batohu vedla k tomu, že našel uplatnění v různých oblastech poznání: v matematice, informatice a na průsečíku těchto věd v kryptografii . V jedné z prací o počítačové lingvistice [24] je navržena formulace problému automatické sumarizace textů , jehož speciální případ odpovídá formulaci problému batohu.
Na základě problému s batohem byl vytvořen první asymetrický šifrovací algoritmus . Myšlenku kryptografie s veřejným klíčem poprvé představili Whitfield Diffie a Martin Hellman na National Computer Conference v roce 1976 [25] [26] .
Problém batohu může také sloužit jako model pro velké množství průmyslových problémů [2] [27] :
V roce 1978 Ralph Merkle a Martin Hellman vyvinuli první algoritmus pro zobecněné šifrování veřejného klíče , kryptosystém Merkle-Hellman , založený na problému batohu. Vydali jednostupňové ( anglicky singly-iterated ) a vícestupňové ( anglicky multiply-iterated ) verze a algoritmus mohl být použit pouze pro šifrování. Ale Adi Shamir jej upravil pro použití v digitálních podpisech [28] .
Následně byly navrženy další kryptosystémy založené na problému batohu, z nichž některé jsou modifikací kryptosystému Merkle-Hellman. Známé kryptosystémy [29] :
Vzhledem k tomu, že obecný problém batohu nelze vyřešit přesně v rozumném čase, lze jej použít v kryptografických problémech. Za tímto účelem s veřejně známou sadou položek budeme reprezentovat zprávu jako sadu přenášených položek a zašleme jejich celkovou váhu [28] .
Definice. Vektor batohu je uspořádaná množina n položek, kde je hmotnost -té položky [30] .
Vektor batohu je veřejný klíč . Pro zašifrování otevřeného textu se rozdělí na bloky o bitové délce, přičemž každý bit určuje přítomnost předmětu v batohu (otevřený text například odpovídá přítomnosti prvních čtyř ze šesti možných předmětů v batohu). Předpokládá se, že jednička označuje přítomnost předmětu v batohu a nula jeho nepřítomnost [28] .
Poté se vypočítá celková váha předmětů v batohu pro daný otevřený text a přenese se jako šifrovaný text [28] .
Příklad šifrování pomocí tohoto algoritmu:
Nechť je dán batohový vektor s délkou .
prostý text | 1 1 1 1 1 0 | 0 0 1 1 0 0 | 0 0 0 0 0 0 | 0 0 0 0 0 1 |
---|---|---|---|---|
Věci v batohu | 3 4 6 7 10 | 6 7 | jedenáct | |
Šifrovaný text | 3 + 4 + 6 + 7 + 10 = 30 | 6 + 7 = 13 | 0 | jedenáct |
Problém s batohem | |
---|---|
Aplikace | |
Kryptosystémy založené na problému batohu |
|
dodatečně |
NP-úplné problémy | |
---|---|
Maximalizační problém stohování (balení) |
|
teorie grafů teorie množin | |
Algoritmické problémy | |
Logické hry a hádanky | |