Máme-li optimalizační problémy, tak si kvůli složitosti často vystačíme s -aproximací, čili s řešením které má cenu , kde značíme optimum, pro konstantu v případě minimalizačního problému. Je to totéž jako říci, že relativní chyba nepřekročí . Pro maximalizační problémy chceme alespoň optima.
Problém Obchodního cestujícího
Máme neorientovaný graf s a chceme nejkratší hamiltonovskou kružnici. Hamiltonovskost je sama o sobě úplná. Relaxujeme problém a budou nás zajímat je úplné grafy s platnou trojúhelníkovou nerovností.
Algoritmus
Najdeme minimální kostru a obejdeme ji, zakořeníme kostru projdeme ji do hloubky a poznamenáme si hrany kterými jsme prošli. Každou hranu kostry ale projdeme 2krát a je to sled. Sled upravíme tak, abychom vždy kdybychom měli navštívit již navštívený vrchol tak místo toho půjdeme do nejbližšího nenavštíveného. Máme tedy hamiltonovskost a jelikož v grafu platí trojúhelníková nerovnost, celková délka nevzrostla.
Algortimus je 2-aproximační
Označíme si délku minimální kostry a jako optimum a jako výsledek algoritmu. Z toho jak jsme vytvořili nám vychází a vychází nám .
Problém batohu
Máme předmětů s hmotnostmi a cenami , a danou kapacitu batohu .
Chceme najít takovou podmnožinu předmětů , že:
- a je maximální.
Aproximace — kvantování cen
Chceme nalézt řešení s relativní chybou nejvýše .
Idea:
Zmenšíme ceny, aby byly menší než pevné a tím zrychlíme DP.
Kvantování cen
- Označme
- Kvantujeme ceny:
- Nové ceny jsou celá čísla v intervalu
- Zaokrouhlením může být každá cena snížena nejvýše o , tedy maximálně celkem
- Aby chyba byla , volíme
Algoritmus AproximaceBatohu
- Odstraňme ze vstupu všechny předměty s
- Spočítejme , nastavíme
- Pro každé :
- Vyřešíme batoh pomocí DP pro kvantované ceny , původní hmotnosti a kapacitu
- Vrátíme výběr předmětů z kvantovaného řešení a spočítej jejich hodnotu v původních cenách
Důkaz přesnosti
- Označme jako optimální řešení původního problému
- Označme jako výstup našeho algoritmu Získáme:
a
Složením obou:
Složitost
- Kvantované ceny mají maximální součet
- Čas na řešení DP:
- Ostatní kroky běží v
Problém batohu s malými čísly (pseudopolynomiální algoritmus)
Zadání
Máme:
- předmětů
- každý s hmotností a cenou
- kapacitu batohu
Cílem je najít podmnožinu , která:
- se vejde do batohu:
- má co největší cenu: je maximální
Idea algoritmu
Namísto klasického dynamického programování podle hmotnosti, sledujeme všechny možné ceny a ke každé hledáme nejmenší možnou hmotnost, za kterou ji lze dosáhnout.
Definice
Označme:
- = celková suma cen (horní mez)
- = minimální možná hmotnost, kterou lze získat pomocí prvních předmětů s přesnou cenou
- Pokud nelze ceny dosáhnout, položíme
Iniciace
Pro (žádné předměty):
- pro
Rekurence (přechod)
Pro :
- buď -tý předmět nevybereme: pak
- nebo ho vybereme: pak (pokud )
Tedy celkově:
Výstup
Po výpočtu všech najdeme největší takové, že:
To je maximální dosažitelná cena při dané kapacitě.
Rekonstrukce řešení
Zavedeme si pomocné pole = index posledního předmětu použitý k dosažení ceny s hmotností .
Pak zpětně dohledáme předměty:
- je poslední
- je předposlední
- atd. To celé trvá
Časová složitost
- Přechod přes předmětů a možných cen:
- Rekonstrukce: