Podręcznik
Strona: | SEZAM - System Edukacyjnych Zasobów Akademickich i Multimedialnych |
Kurs: | 3. Metody generacji kolumn i odcięć |
Książka: | Podręcznik |
Wydrukowane przez użytkownika: | Gość |
Data: | poniedziałek, 6 października 2025, 18:51 |
Opis
Wersja podręcznika: 1.0
Data publikacji: 01.01.2022 r.
Wykłady
W1…WN, odpowiadające w sumie ok. 10-12 godz. standardowego wykładu
1. Metoda generacji kolumn
Wprowadzenie
Wiele zagadnień związanych z badaniami operacyjnymi jest formułowanych w sposób ścisły lub przybliżony przy pomocy modeli programowania liniowego. Opracowanie algorytmu sympleks pozwoliło na stosunkowo łatwe wyznaczanie rozwiązań optymalnych takich zadań. Pomimo, że w najgorszym przypadku złożoność obliczeniowa tego algorytmu rośnie wykładniczo, to jednak przeciętnie zadania są rozwiązywane bardzo efektywnie.
Istnieje jednak grupa problemów, które choć formalnie zaliczają się do zadań programowania liniowego, to jednak rozwiązanie ich klasycznymi metodami jest nieopłacalne, głównie ze względu na wielkość zajmowanej pamięci, ale także ze względu na czas obliczeń. Cechą charakterystyczną tych zadań jest występowanie bardzo dużej liczby zmiennych, przy stosunkowo niewielkiej liczbie ograniczeń. W niektórych przypadkach liczba zmiennych może być nieskończona lub trudna do wyznaczenia. Oczywiste jest, że przechowywanie w pamięci całej macierzy ograniczeń takiego zadania oraz wykonywanie przekształceń na wszystkich jej elementach jest niemożliwe, a w najlepszym razie nieefektywne.
Rozwiązaniem jest zastosowanie metody generacji kolumn. Jest ona oparta na skorygowanej metodzie sympleks, w której przechowuje się tylko aktualną macierz bazową. Różnica między obydwiema metodami polega na tym, że w metodzie generacji kolumn nowe kolumny wprowadzane do bazy w każdej iteracji nie są bezpośrednio wyszukiwane w macierzy ograniczeń, lecz są wyznaczane w oddzielnym zadaniu optymalizacji.
Skorygowana metoda prymalna sympleks
Rozważmy następujące zadanie programowania liniowego:
Zmaksymalizować
Przy ograniczeniach

Załóżmy, że kolumny macierzy zostały przedstawione w taki sposób, że
, gdzie
jest macierzą bazową o wymiarach
×
(det
),
jest macierzą utworzoną z pozostałych kolumn macierzy
. Niech ponadto
, gdzie
jest wektorem zmiennych bazowych odpowiadających kolumnom macierzy
, natomiast
jest wektorem zmiennych niebazowych odpowiadających kolumnom macierzy
. Warunek
możemy teraz zapisać następująco:
Ponieważ jest macierzą nieosobliwą, zatem istnieje macierz odwrotna
. Możemy więc wyrazić
w zależności od
:
Rozwiązanie bazowe otrzymujemy, gdy zmienne niebazowe
są na swoich dolnych ograniczeniach, czyli
. Twierdzenie mówiące, że jeśli zadanie programowania liniowego ma rozwiązanie optymalne, to ma również rozwiązanie bazowe optymalne, pozwala nam, przy poszukiwaniu rozwiązania optymalnego, ograniczyć się tylko do przeszukiwania rozwiązań bazowych dopuszczalnych.
W algorytmie skorygowanej metody prymalnej sympleks, wychodząc od dowolnego dopuszczalnego rozwiązania bazowego, znajdujemy kolejno inne dopuszczalne rozwiązania bazowe polepszające wartość fukcji celu . Przejście pomiędzy dwoma kolejnymi dopuszczalnymi rozwiązaniami bazowymi odbywa się poprzez wprowadzenie do bazy jednej ze zmiennych niebazowych.
Załóżmy, że mamy wyjściowe rozwiązanie bazowe określone wzorem (5). Chcemy teraz znaleźć inne dopuszczalne rozwiązanie bazowe dające większą wartość funkcji celu . Niech
, wtedy
wykorzystując równanie (5) eliminujemy i otrzymujemy
Po podstawieniu w powyższym równaniu otrzymujemy wartość rozwiązania bazowego równą
. Zapiszmy równania (5) i (7) w następujący sposób
Oznaczmy przez wartość funkcji celu
, a przez
elementy wektora xB . Niech N będzie zbiorem indeksów kolumn macierzy N , a ponadto
oraz
gdzie , jest kolumną macierzy
. Możemy teraz równania (5) i (7) zapisać następująco:
Zadaniem naszym jest wybór takiej zmiennej niebazowej, aby, po wprowadzeniu jej do bazy, nowe rozwiązanie było lepsze od poprzedniego. Załóżmy, że do bazy chcemy wprowadzić jedną ze zmiennych niebazowych . Spróbujmy więc stopniowo zwiększać wartość zmiennej
, która do tej pory była na swym dolnym ograniczeniu. Z równania (8) widzimy, że wartość funkcji celu
będzie się zwiększała tylko wtedy, gdy
będzie mniejsze od zera. Oznacza to, że zmienną wprowadzaną do bazy możemy wybrać tylko spośród tych zmiennych niebazowych
, dla których parametry
nazywane cenami zredukowanymi są ujemne (
. Zauważmy, że zwiększaniu się zmiennej
towarzyszy także zmiana wartości zmiennych bazowych
. Ponieważ wartość żadnej z nich nie może być ujemna, to, jeśli któryś ze współczynników
w równaniach (8) jest dodatni, wtedy określa on maksymalną wartość, którą może przyjąć zmienna
bez naruszenia ograniczenia
:
Ponieważ ograniczenie to musi być spełnione dla wszystkich zmiennych bazowych , to
Po osiągnięciu przez wybraną zmienną niebazową wartości
max jedna lub kilka zmiennych bazowych znajdzie się na swym dolnym ograniczeniu; spośród nich wybieramy zmienną, która zostanie usunięta z bazy.
Zmienną niebazową wprowadzaną do bazy może być dowolna zmienna , dla której
. Na ogół jednak, w celu polepszenia szybkości zbieżności, wybiera się taką zmienną
dla której
Algorytm skorygowanej metody prymalnej sympleks
W algorytmie skorygowanej metody prymalnej sympleks nie operuje się tzw. macierzą sympleksową, lecz macierzą bazową oraz całą macierzą ograniczeń. W każdej iteracji przegląda się wszystkie kolumny aj odpowiadające zmiennym niebazowym. Poszczególne kroki algorytmu przedstawiają się następująco:
Należy pamiętać o tym, że, tak jak w zwykłej metodzie sympleksowej, wyłącznie zmienne bazowe mogą przyjmować wartości niezerowe i, wraz z odpowiadającymi im kolumnami, stanowią pełne rozwiązanie zadania (1)–(3).
Wykrywanie nieograniczoności



k-tej nie jest większy od zera, wtedy możliwy jest nieograniczony wzrost zmiennej niebazowej



Sytuacja taka oznacza, że rozwiązywane przez nas zadanie jest nieograniczone i algorytm powinien zostać w tym momencie przerwany.
Wyznaczanie początkowego dopuszczalnego rozwiązania bazowego
Rozpoczęcie obliczeń metodą sympleksową jest uwarunkowane znajomością początkowego dopuszczalnego rozwiązania bazowego. Jeśli początkowe dopuszczalne rozwiązanie bazowe nie jest łatwo dostępne, wtedy trzeba je wygenerować rozwiązując skorygowaną prymalną metodą sympleksową następujące zadanie pomocnicze:
Zmaksymalizować
przy ograniczeniach
gdzie , a
jest m-wymiarowym wektorem tzw. zmiennych sztucznych.
Dla zadania tego można z łatwością określić początkowe dopuszczalne rozwiązanie bazowe . Po zakończeniu rozwiązywania tego zadania mogą wystąpić następujące przypadki:
- 1) min ŵ = w < 0 – zbiór rozwiązań dopuszczalnych zadania wyjściowego jest pusty (zadanie wyjściowe jest sprzeczne).
- 2) ŵ = 0 i wśród zmiennych bazowych nie występują zmienne sztuczne – wyznaczono początkowe dopuszczalne rozwiązanie bazowe.
- 3) ŵ = 0 i wśród zmiennych bazowych występują zmienne sztuczne. Możliwe są wówczas dwa warianty:
- a) Zmienna bazowa
jest zmienną sztuczną oraz
dla każdego
– w zadaniu wyjściowym występuje redundancja.
- b) Zmienna bazowa
jest zmienną sztuczną oraz istnieje
takie, że
– należy zastąpić zmienną
zmienną
, a otrzymane początkowe dopuszczalne rozwiązanie bazowe jest zdegenerowane (istnieją zmienne bazowe równe 0).
- a) Zmienna bazowa
Metoda generacji kolumn
W skorygowanej metodzie prymalnej sympleks posługujemy się w sposób jawny całą macierzą ograniczeń – z góry znamy liczbę kolumn oraz jej zawartość. Możemy jednak łatwo dojść do wniosku, że znajomość całej macierzy ograniczeń nie jest konieczna. W każdym kroku wstawiamy do macierzy bazowej nową kolumnę odpowiadającą zmiennej niebazowej, nie jest jednak istotne czy nowa kolumna została wybrana z podanej ‘explicite’ macierzy ograniczeń, czy też została wyliczona w jakiś inny sposób. Najważniejsze jest aby odpowiadająca tej kolumnie cena zredukowana była jak najmniejsza, a jeśli jest przy tym ujemna, to wprowadzenie nowej kolumny spowoduje poprawienie poprzedniego rozwiązania. Zadanie wyznaczenia nowej kolumny możemy więc w sposób ogólny zapisać następująco:
gdzie jest szukanym wektorem zmiennych minimalizującym cenę zredukowaną
, który jako nowa kolumna zostanie wprowadzony do macierzy bazowej (indeks
ma tylko znaczenie symboliczne),
– wektor cen dualnych,
– cena w funkcji celu odpowiadająca znalezionej kolumnie.
Zauważmy, że jeśli w wyniku rozwiązania tego zadania otrzymamy kolumnę, która już znajduje się w bazie, to wartość ceny zredukowanej odpowiadającej tej kolumnie będzie wynosiła 0, czyli nastąpi zakończenie algorytmu.
Metoda generacji kolumn działa analogicznie do skorygowanej metody prymalnej sympleks z tą tylko różnicą, że nowe kolumny wstawiane w każdym kroku do macierzy bazowej są wyznaczane w oddzielnym zadaniu optymalizacji. Takie podejście pozwala na rozwiązywanie zadań z macierzą ograniczeń o potencjalnie nieskończonej liczbie kolumn. Nie jest bowiem konieczne pamiętanie całej tej macierzy; do znalezienia kolejnego dopuszczalnego rozwiązania bazowego wystarczy znajomość aktualnej macierzy bazowej.
Na poniższym rysunku przedstawiono schemat działania metody generacji kolumn. Możemy wyróżnić zadanie nadrzędne, będące głównym zadaniem optymalizacji oraz zadanie podrzędne. W każdej iteracji do zadania podrzędnego przekazywany jest wektor cen dualnych , który służy do obliczenia nowej kolumny
. Kolumna ta jest następnie zwracana do zadania nadrzędnego.
Zadanie podrzędne
W zadaniu podrzędnym wyznaczane są kolumny z macierzy ograniczeń o najmniejszych wartościach ceny zredukowanej . Aby zadanie to miało sens, na kolumnę
muszą zostać nałożone pewne ograniczenia. Na przykład można ograniczyć zakres wartości jakie mogą przyjmować poszczególne elementy kolumny
:
. Ograniczenia nałożone na rozwiązanie zadania podrzędnego zawężają zbiór kolumn, które mogą być wstawione do macierzy bazowej zadania nadrzędnego, czyli – zbiór wszystkich rozwiązań dopuszczalnych zadania podrzędnego określa wszystkie możliwe kolumny występujące w macierzy ograniczeń zadania nadrzędnego. Jeżeli na przykład do ograniczenia
dodamy warunek całkowitoliczbowości, wtedy macierz ograniczeń zadania nadrzędnego będzie składała się ze skończonej liczby kolumn, w których każdy element musi należeć do przedziału [d, e] i być liczbą całkowitą. Bardziej złożone ograniczenia nakładane na kolumny wyznaczane w zadaniu podrzędnym zostały przedstawione w przykładach w dalszej części tej pracy.
W metodzie generacji kolumn, poza wyznaczeniem w kolejnej iteracji nowej kolumny wstawianej do macierzy bazowej, konieczne jest określenie wartości ceny cj w funkcji celu odpowiadającej tej kolumnie. Cena ta na ogół nie jest podana w sposób jawny, lecz zależy od wyznaczanego wektora :
. Skutkiem tego może być poważne zwiększenie złożoności funkcji celu zadania podrzędnego
2. Metoda płaszczyzn tnących
Niniejszy rozdział przedstawia jedno z klasycznych podejść do rozwiązywana zadań optymalizacji dyskretnej, polegające na iteracyjnym rozwiązywaniu problem uciąglonego przy jednoczesnym dodawaniu dodatkowych ograniczeń odcinających rozwiązania ułamkowe.
2.1. Wprowadzenie
Chcemy rozwiązać następujące zadanie programowania liniowego całkowitoliczbowego (ZPLC):
gdzie $A, b$ są całkowitoliczbowe.
Ograniczenia zadania modelują zależności wynikające bezpośrednio z treści zadania lub pośrednio, np. modelujące wymagane zależności logiczne lub inne powiązania między zmiennymi nie wyrażone bezpośrednio w zadaniu. Ja przykład może służyć wyznaczenie maksymalnej wartości z zmiennych, co zazwyczaj modeluje się dodatkową zmienną ograniczającą od góry zmienne stanowiące argument funkcji maksimum. Często problem można zamodelować w różny sposób, np. różnie ujmując ograniczenia, a nawet przyjmując różne definicje zmiennych decyzyjnych. Możemy więc mieć różne modele matematycznego dla danego problemu. Pytanie, które czy są modele "lepsze" lub "gorsze" z punktu widzenia zasobów potrzebnych do rozwiązania problemu.
![\left[ \begin{array}{cc}
1 & 1 \\
-1 & 1 \\
6 & 2 \\
\end{array}
\right] \left[ \begin{array}{c}
x_1 \\
x_2 \\
\end{array}
\right] \leq
\left[ \begin{array}{c}
5 \\
0 \\
21 \\
\end{array}
\right] \left[ \begin{array}{cc}
1 & 1 \\
-1 & 1 \\
6 & 2 \\
\end{array}
\right] \left[ \begin{array}{c}
x_1 \\
x_2 \\
\end{array}
\right] \leq
\left[ \begin{array}{c}
5 \\
0 \\
21 \\
\end{array}
\right]](https://esezam.okno.pw.edu.pl/filter/tex/pix.php/9b8c78112784f96fca0372bcc7f326a4.gif)

Zbiór rozwiązań dopuszczalnych jest następujący


Ale zbiór

![\left[ \begin{array}{cc}
1 & \frac{3}{2} \\
-1 & 1 \\
\frac{26}{5} & 4 \\
\end{array}
\right] \left[ \begin{array}{c}
x_1 \\
x_2 \\
\end{array}
\right] \leq
\left[ \begin{array}{c}
6 \\
0 \\
20 \\
\end{array}
\right] \left[ \begin{array}{cc}
1 & \frac{3}{2} \\
-1 & 1 \\
\frac{26}{5} & 4 \\
\end{array}
\right] \left[ \begin{array}{c}
x_1 \\
x_2 \\
\end{array}
\right] \leq
\left[ \begin{array}{c}
6 \\
0 \\
20 \\
\end{array}
\right]](https://esezam.okno.pw.edu.pl/filter/tex/pix.php/8f1770a3c15fc04eb017a874862c308d.gif)
Wówczas zbiór rozwiązań dopuszczalnych wygląda jak na poniższym rysunku

Który z opisów jest lepszy? Czy lepiej oznacza więcej czy mniej ograniczeń? Czy to ma znaczenie?
Najlepszy modele problemu jest opis zwarty, a więc taki, że wzystkie punkty zbioru dopuszczlnego stają się wierzchołami wielościanu. Wówczas można pominąć warunek całkowitoliczbowości w modelu i rozwiązać problem liniowy ze zmiennymi ciągłymi, który jak wiemy jest znacznie prostszy obliczeniowo.
![\left[ \begin{array}{cc}
1 & 1 \\
-1 & 1 \\
6 & 0 \\
\end{array}
\right] \left[ \begin{array}{c}
x_1 \\
x_2 \\
\end{array}
\right] \leq
\left[ \begin{array}{c}
4 \\
0 \\
18 \\
\end{array}
\right] \left[ \begin{array}{cc}
1 & 1 \\
-1 & 1 \\
6 & 0 \\
\end{array}
\right] \left[ \begin{array}{c}
x_1 \\
x_2 \\
\end{array}
\right] \leq
\left[ \begin{array}{c}
4 \\
0 \\
18 \\
\end{array}
\right]](https://esezam.okno.pw.edu.pl/filter/tex/pix.php/6260d080671b2e6cf93914ca11667a04.gif)

Ten najbardziej zwarty opis na rysunku wygląda następująco:



jest nazywany uwypukleniem zbioru


Dla każdego zbioru , przy czym
jest opisem wielościennym tego zbioru, zachodzi
.
Dla każdego zbioru , przy czym
jest opisem wielościennym tego zbioru, zachodzi
.







Sformułowanie 1

Sformułowanie 2

Rozważym przykład dla dwóch lokalizacji i dwóch klientów.
Sformułowanie 1

Zobaczmy przestrzeń rozwiązań dopuszczalnych np. dla




Sformułowanie 2

Teraz dla



Rysunki wskazują, że sformułowanie 2 jest silniejsze (przynajmniej w rozważanym obszarze).
2.2. Idea metody płaszczyzn tnących
W ogólnym przypadku trudno jest uzyskać najbardziej zwarty opis , bo liczb ograniczeń rośnie wykładniczo lub szybciej, ale można przybliżać uwypuklenie zbioru
w pewnym otoczeniu punktu optymalnego.
Idea metody płaszczyzn tnących polega na stopniowym zawężaniu opis wielościennego w wyniku dodawania ograniczeń do już istniejących
nowych o postaci
, tak aby:
- dodatkowe ograniczenia odcinały pewne rozwiązania
nie należące do
- poszukiwane rozwiązanie ZPLC stawało się punktem wierzchołkowym opis wielościennego
- funkcja celu ZPL osiągała maksimum na
w punkcie wierzchołkowym całkowitoliczbowym
Dodatkowe ograniczenia nie powinny odcinać rozwiązań dopuszczalnych oryginalnego problemu. Tego typu ograniczenia nazwywamy nierównościami zgodnymi.
Np. zgodne są pierwotne ograniczenia problemu lub ograniczenia opisujące .

Jeżeli


Powstałem w ten sposób nowe ogranicznie jest ograniczeniem zgodnym.

gdzie wszystkie zmienne

Ponieważ

A to oznacza, że

Jak widać oryginalne ograniczenie można zastąpić trzema ograniczeniami zgodnymi ustalającymi wartości wszystkich trzech zmiennych.
2.3. Rodzaje cięć
Różne pakiety optymalizacyjne umożliwiają zastosowanie różnych cięć. Przykładowo IBM ILOG Cplex zawiera m.in. następujące cięcia:
- Clique Cuts (co najwyżej jedna zmienna binarna równa 1)
- Cover Cuts (dla ograniczeń plecakowych)
- Disjunctive Cuts (cięcia zgodne dla jednego podproblemu drzewa podziału i niezgodne dla drugiego)
- Flow Cover Cuts (wielkość przepływu uzależniona od zmiennej binarnej, podobne do plecaka)
- Flow Path Cuts
- Gomory Fractional Cuts
- Generalized Upper Bound (GUB) Cover Cuts
- Implied Bound Cuts
- Mixed Integer Rounding (MIR) Cuts
- Zero Half Cuts
Warto,wiedzieć jakie cięcia są wykorzystywane, aby świadomie sterować procesem. W szczególności zazwyczaj można odczytać liczbę dodanych cięć lub dla każdego typu cięcia można ustawiać parametry takie jak częstość danego rodzaju cięć, zakaz cięć, strategia (np. umiarkowana lub agresywana) stosowania cięć danego rodzaju.
Cięcia Cover cuts
Rozważamy ograniczenie typu ( -- zmienna binarna)
Pokrycie jest minimalne jeżeli nie jest pokryciem dla dowolnego
.
Zauważmy, że cięcie
jest zgodne. Pytanie, czy można wygenerować lepsze cięcia? Rozważmy następujący przykład.
Ogólnie, cover cut można poszerzyć
gdzie
Cięcia Chvatala-Gomory'ego
Niech przy czym
jest największą liczbą całkowitą nie większa od
, zaś
odpowiednią liczbą ułamkową.
Niech . Wówczas nierówność skalarna
Nierówność
Nierówność
jest zgodna z , gdyż
jest całkowite i
jest całkowite
Chvatal pokazał, że w ten sposób można generować dowolne cięcia.
2.4. Algorytmy płaszczyzn tnących
W poszukiwanym rozwiązaniu optymalnym muszą być spełnione następujące warunki optymalności dla zadania ZPL z dodanymi cięciami
Możliwe są trzy podejścia, w których dwa z powyższych warunków są zawsze spełnione, natomiast trzeci ulega relaksacji. Trzy podstawowe algorytmy metod płaszczyzn tnących są następujące
- algorytm form całkowitych (spełnione warunki 1 i 3)
- metoda prymalna całkowitoliczbowa (spełnione warunki 1 i 2)
- metoda dualna całkowitoliczbowa (spełnione warunki 2 i 3)
Ogólny schemat algorytmu form całowitych jest następujący
Jest to ogólny schemat, który pozostawia otwarte pytanie w jaki sposób generować nowe cięcia.
2.5. Metoda podziału i odcięć
Metoda płaszczyzn odcinających jest często stosowana razem z metodą podziału i oszacowań tworząc jeden z najsilniejszych algorytmów optymalizacji liniowej dyskretnej. Taka kombinacja nazywana jest metodą podziału i odcięć (Branch & Cut) i ma następujący schemat:
- Inicjacja listy problemów
- Niech
i
- Dopóki
niepusty
- Wybierz i usuń problem z
- Rozwiąż relaksację ciągłą
- Idź do 3 jeżeli zadanie sprzeczne. W p.p. oznaczmy rozwiązanie przez
i funkcję celu przez
.
- Jeżeli
, idź do 3.
- Jeżeli
całkowitoliczbowe, to
i idź do 3.
- W razie potrzeby, znajdź płaszczyzny odcinające
. Jeżeli istnieją to dodaje od relaksacji LP i idź do 3.2.
- Podziel problem na nowe problemy i dodaj je do
. Idź do 3.
- Wybierz i usuń problem z
- Zwróć