Programy liniowe, gry i algorytmy
Czy programy liniowe mają coś wspólnego z informatyką? Okazuje się, że bardzo wiele. Po pierwsze, istnieją (bardzo ciekawe!) efektywne algorytmy rozwiązujące programy liniowe. Ponadto, programy liniowe są kluczowym narzędziem w optymalizacji kombinatorycznej, algorytmach aproksymacyjnych czy algorytmach online...
Bliźniacze programy liniowe
Program liniowy jest to minimalizacja (maksymalizacja) liniowej funkcji celu o argumentach przy zachowaniu pewnej liczby równości lub nierówności liniowych zawierających zmienne Oto przykład:
Ponieważ w powyższym przykładzie mamy tylko dwie zmienne, możemy łatwo wyobrazić sobie zbiór rozwiązań dopuszczalnych, tzn. zbiór punktów w przestrzeni dwuwymiarowej spełniających podane nierówności. Jest to czworokąt o wierzchołkach i Interesują nas rozwiązania optymalne, czyli rozwiązania dopuszczalne, które minimalizują (maksymalizują) funkcję celu. W szczególności, jeśli zbiór rozwiązań dopuszczalnych jest nieograniczony, rozwiązanie optymalne może nie istnieć. Dla programów o wszystkich zmiennych nieujemnych można dość łatwo wykazać (zachęcam Czytelnika, aby spróbował swoich sił dla dwóch wymiarów), że jeśli jakieś rozwiązanie optymalne istnieje, to istnieje też takie, które jest wierzchołkiem zbioru rozwiązań dopuszczalnych. Po sprawdzeniu wszystkich wierzchołków okazuje się, że rozwiązanie optymalne dla powyższego przykładu to
Czy programy liniowe mają coś wspólnego z informatyką? Okazuje się, że bardzo wiele. Po pierwsze, istnieją (bardzo ciekawe!) efektywne algorytmy rozwiązujące programy liniowe. Ponadto, programy liniowe są kluczowym narzędziem w optymalizacji kombinatorycznej, algorytmach aproksymacyjnych czy algorytmach online. Dla przykładu, problem maksymalnego przepływu jest szczególnym przypadkiem programu liniowego (dla sieci o wierzchołkach i krawędziach taki program ma zmiennych i ograniczeń).
Przejdźmy teraz do głównego tematu tego artykułu: każdy program liniowy ma swojego brata bliźniaka. Aby się o tym przekonać, spróbujmy znaleźć jakiś prosty (istotnie prostszy niż dowodzenie twierdzenia o wierzchołkach) sposób, żeby przekonać kolegę, że rozwiązanie o wartości funkcji celu jest faktycznie rozwiązaniem optymalnym, albo chociaż że jest bliskie optymalnemu. Innymi słowy, szukamy oszacowania górnego na wartość funkcji celu rozwiązań dopuszczalnych. Zauważmy, że tak się szczęśliwie złożyło, iż rozwiązania dopuszczalne naszego programu są nieujemne. Dlatego proste oszacowanie możemy dostać już na podstawie pierwszej nierówności: Dodając pierwsze dwie nierówności pomnożone przez otrzymujemy jeszcze lepsze oszacowanie: Spróbujmy pójść tą drogą jeszcze dalej. Mianowicie, chcemy znaleźć takie liczby że mnożąc -tą nierówność przez i dodając otrzymane nierówności, dostaniemy jak najlepsze oszacowanie na wartość funkcji celu. Żeby wartość funkcji celu faktycznie szacowała się z góry przez taką sumę, musi zachodzić oraz A więc otrzymaliśmy pewne zadanie do rozwiązania. Spostrzegawczy Czytelnik zapewne zauważył już, że jest to zadanie programowania liniowego! Możemy je zapisać następująco:
Ponownie stosując trik z wyznaczeniem wierzchołków wielokąta, otrzymujemy, że jest rozwiązaniem optymalnym naszego nowego programu. A jaką otrzymaliśmy wartość funkcji celu? Mamy czyli idealnie! Możemy więc łatwo przekonać kolegę, że rozwiązanie oryginalnego problemu jest nie tylko bliskie optymalnemu, ale nawet że jest optymalne.