Podręcznik
3. Algorytm metody Simplex – zapis algebraiczny
Przedstawimy teraz formalny zapis przedstawionego wyżej dwufazowego schematu rozwiązywania zadania programowania liniowego w postaci kanonicznej (zadania PLin_K).
Przypominamy, że
, a elementy macierzy
oznaczmy
, tak że
Algebraiczny opis algorytmu Simplex
Faza I (Obliczenia wstępne)
- Przekształć zadanie do postaci kanonicznej PLin_K.
- Utwórz zadanie pomocnicze PLin_P.
- Używając algorytmu opisanego w fazie II z macierzą jednostkową jako pierwszą macierzą bazową, rozwiąż zadanie PLin_P. Jeżeli wartość optymalna funkcji minimalizowanej w tym zadaniu jest większa od zera to ograniczenia są sprzeczne i stop. Jeżeli nie, przejdź do 4.
- Wyznacz zbiór indeksów początkowych zmiennych bazowych
, gdzie zbiór K jest określony wzorem (2.4), oraz początkową macierz bazową
. Przejdź do fazy II.
Faza II (Zasadnicza)
Informacja początkowa
Znamy zbiór indeksów początkowych zmiennych bazowych 
0. Podstaw l: = 0.
1. Wylicz tzw. wektor cen zredukowanych: ![\mathbf{Δ}^{(l)}=[(\mathbf{B}^{(l)} )^{-1} A]^T \mathbf{c}_{Ind\mathbf{B}}^{(l)}-c∈\mathbb{R}^n, \mathbf{Δ}^{(l)}=[(\mathbf{B}^{(l)} )^{-1} A]^T \mathbf{c}_{Ind\mathbf{B}}^{(l)}-c∈\mathbb{R}^n,](https://esezam.okno.pw.edu.pl/filter/tex/pix.php/8b57986bafebc01f598ab9f6dcdb9663.gif)
Jeżeli tak – znaleziono rozwiązanie, którego niezerowe elementy są równe: ![[x_k]_{k \in Ind\mathbf{B}^{(l)}}=(\mathbf{B}^{(l)})^{-1}b [x_k]_{k \in Ind\mathbf{B}^{(l)}}=(\mathbf{B}^{(l)})^{-1}b](https://esezam.okno.pw.edu.pl/filter/tex/pix.php/2711e66d13b4c09a570aa552a3ddedb9.gif)
i stop. Jeżeli nie, przejdź do 3 Fazy II.
3. (Wybór indeksu kolumny wprowadzanej do bazy) Wyznacz 
4. (Sprawdzenie warunku braku rozwiązania) Sprawdź czy
?
Jeżeli tak – to zadanie nie ma rozwiązania (jest nieograniczone) i stop. Gdy nie, przejdź do 5 Fazy II.
5. (Wybór indeksu kolumny usuwanej z bazy)
gdzie
a
to s-ty element kolumny (wektora)
.
6. Wylicz nową bazę
podstaw
i przejdź do 1 Fazy II.
Omówimy krótko kroki kluczowej II fazy algorytmu.
- Poszukiwanie największego (krok 3) albo najmniejszego (krok 5) elementu to przeglądanie tablicy o n albo nie więcej niż
elementach, nie jest więc zadaniem skomplikowanym. - W kroku 5 może się zdarzyć tzw. degeneracja. Algorytmowi to nie przeszkodzi w wykonywaniu dalszych kroków, ale gdy degeneracja nastąpiła w iteracji l-tej, to w iteracji
może nastąpić zerowe zmalenie funkcji celu. Stwarza to potencjalną możliwość powrotu algorytmy do tego samego wierzchołka po liczbie iteracji większej od pięciu (możliwość wystąpienia cyklu – pętlenia). Określono sposoby zabezpieczenia się przed tym zjawiskiem, por. wspomniany podręcznik A. Stachurskiego (podrozdział 2.3), i z praktycznego punktu widzenia można go pominąć. - Krok 6 to przejście do nowego wierzchołka, przy czym wybór kolumny wprowadzonej do bazy w kroku 3 daje największe możliwe zmalenie funkcji celu.
- Główne problemy implementacyjne związane są z szybkością i dokładnością tego algorytmu. Najwięcej kłopotów jest w nim z opracowaniem procedur, które nie odwracając wprost macierzy będą dawały takie same wyniki jak odwracanie macierzy bazowych.
W ciągu tych lat, które upłynęły od pierwszej publikacji G.B. Dantziga poprawiano i ulepszano metodę Simplex w różnych kierunkach, tak że współczesne implementacje tej metody potrafią znaleźć w rozsądnym czasie rozwiązania zadań o setkach tysięcy zmiennych i kilkudziesięciu tysiącach ograniczeń (praktyczne zadania o takich wymiarach mają dużo zer w macierzy A, macierz A jest rzadka, zatem przy zastosowaniu odpowiednich metod można takie zadania „zmieścić” w pamięci komputerów).
Zadanie pn. „SEZAM: System Edukacyjnych Zasobów Akademickich i Multimedialnych” realizowane w ramach projektu „NERW PW. Nauka – Edukacja – Rozwój – Współpraca” współfinansowanego ze środków Unii Europejskiej w ramach Europejskiego Funduszu Społecznego



![A=[A_1\,⋮...⋮\,A_k\,⋮...⋮\,A_n]; A=[A_1\,⋮...⋮\,A_k\,⋮...⋮\,A_n];](https://esezam.okno.pw.edu.pl/filter/tex/pix.php/ee3b9e89f0e014913cfe3f858cbc6fde.gif)

![c=\begin{bmatrix}c_1\\ \vdots \\ c_n\end{bmatrix}=[c_k]_{k\in \overline{1,n}}.. c=\begin{bmatrix}c_1\\ \vdots \\ c_n\end{bmatrix}=[c_k]_{k\in \overline{1,n}}..](https://esezam.okno.pw.edu.pl/filter/tex/pix.php/4a4dbdb7a9444ad637d85509244a0d09.gif)
![\mathbf{B}^{(l)}=[A_{k∈Ind\mathbf{B}^{(l)} }]=[A_r^{(l)} ]_{r∈\overline{1,p}} \mathbf{B}^{(l)}=[A_{k∈Ind\mathbf{B}^{(l)} }]=[A_r^{(l)} ]_{r∈\overline{1,p}}](https://esezam.okno.pw.edu.pl/filter/tex/pix.php/65dde72b9457ea789df0fc38527d135b.gif)
![\mathbf{c}_{Ind\mathbf{B}}^{(l)}=[c_k ]_{k∈Ind\mathbf{B}^{(l)}}). \mathbf{c}_{Ind\mathbf{B}}^{(l)}=[c_k ]_{k∈Ind\mathbf{B}^{(l)}}).](https://esezam.okno.pw.edu.pl/filter/tex/pix.php/3f182eba2a318e675fd4a7bdc344a35b.gif)


![B^{(l+1)}=B^{(l)}+(A_{r ̂ }-A_{s ̂ }([0⋮...⋮0⋮1⋮0⋮...⋮0]), B^{(l+1)}=B^{(l)}+(A_{r ̂ }-A_{s ̂ }([0⋮...⋮0⋮1⋮0⋮...⋮0]),](https://esezam.okno.pw.edu.pl/filter/tex/pix.php/2875f6700573bb56b99eb75f098ee9b7.gif)