Informace k praktickým domácím úkolům z optimalizačních metod (NOPT048)

Paralelky středa od 14:00 a čtvrtek od 17:20

Zadání

Testovací data

1. úkol

2. úkol

Trochu o celočíselném programování

Zatímco pro řešení problémů lineárního programování (LP) se používá simplexový algoritmus (který sice obecně není polynomiální ale obvykle se tak chová), k řešení celočíselného lineárního programování se obvykle používá algoritmus branch-and-cut (který se zdaleka polynomiálně nechová). V jádru není branch-and-cut nic jiného, než chytrý způsob, jak pomocí metody rozděl a panuj projít všechna celočíselná řešení problému a najít to nejlepší. Algoritmus řeší problém tak, že přidáním nějaké podmínky rozdělí problém na dva podproblémy (např. prodproblém s x je nejvýš 4 a podproblém s x je alespoň 5) a ty vyřeší rekurzivně. Před rozdělením ale řešič nejdřív spočítá řešení lineární relaxace problému. To má vícero důvodů. Pokud je řešení relaxace celočíselné, pak není třeba pokračovat, neb jsme našli optimum. Naopak, pokud řešení relaxace má horší hodnotu účelové funkce než doposud nejlepší celočíselné řešení, taktéž nemusíme tento podproblém řešit, neb lepší řešení z něj nedostaneme. Na základě řešení relaxace se můžeme například rozhodnout, jak problém rozdělit (např. budeme vždy dělit jen podle proměnné, která není celočíselná). Podrobněji se o branch-and-cut můžete dočíst např. v knize Applied Mathematical Programming (kapitoly 9.4 a 9.5) nebo Wikipedii. Popis algoritmu, který používá GLPK najdete v dokumentaci (níže v užitečných zdrojích) v kapitole 5.1.2.

Jak můžeme tedy řešiči pomoct? Například:

Pozor! To, jaké chytristiky řešiči pomohou silně závisí na konkrétním řešiči. GLPK je poměrně hloupé a tedy mu pomůže leccos, ale třeba u komerčních řešičů je velká šance, že stejně dokáží vymyslet něco lepšího než vy.

Užitečné zdroje