Przeskocz do treści

Delta mi!

Programy liniowe, gry i algorytmy

Łukasz Kowalik

o artykule ...

  • Publikacja w Delcie: sierpień 2013
  • Publikacja elektroniczna: 31-07-2013
  • Autor: Łukasz Kowalik
    Afiliacja: Instytut Informatyki, Wydział Matematyki, Informatyki i Mechaniki, Uniwersytet Warszawski
  • Wersja do druku [application/pdf]: (143 KB)

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 celumath argumentach math przy zachowaniu pewnej liczby równości lub nierówności liniowych zawierających zmienne math Oto przykład:

pict

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 math math i  math 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 math

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  math wierzchołkach i  math  krawędziach taki program ma math zmiennych i  math  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 math o wartości funkcji celu math 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: math Dodając pierwsze dwie nierówności pomnożone przez math otrzymujemy jeszcze lepsze oszacowanie: math Spróbujmy pójść tą drogą jeszcze dalej. Mianowicie, chcemy znaleźć takie liczby math że mnożąc math-tą nierówność przez math 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ć math oraz math 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:

pict

Ponownie stosując trik z wyznaczeniem wierzchołków wielokąta, otrzymujemy, że math jest rozwiązaniem optymalnym naszego nowego programu. A jaką otrzymaliśmy wartość funkcji celu? Mamy math czyli idealnie! Możemy więc łatwo przekonać kolegę, że rozwiązanie math oryginalnego problemu jest nie tylko bliskie optymalnemu, ale nawet że jest optymalne.

Pełna treść artykułu dostępna jest w wersji do druku