Wpisany przez Robert Dudek
wtorek, 27 grudnia 2005 22:22
Zero-jedynkowy addytywny algorytm Balasa pozwala na rozwiązanie następującego binarnego programu liniowego:
Znaleźć minimum: z=c1x1 + c2x2 + ... + cnxn
Przy ograniczeniach: ai1x1 + ai2x2 + ... + ainxn ≤ bi
gdzie: i = 1, 2, ..., m
xj = 0 lub 1
j = 1, 2, ..., n.
Zasada działania algorytmu.
Do śledzenia postępu przeglądu używa się dwu wektorów: uT = (u1, u2, ..., un) oraz xT = (x1, x2, ..., xn). Jeśli w skład rozwiązania częściowego wchodzą zmienne xj1, xj2, ..., xjs, wybrane w takim właśnie porządku, to składowe wektora x odpowiadające tym zmiennym mają wartości albo 0 albo 1. Pozostałe składowe wektora x, odpowiadające zmiennym swobodnym, mają wartości –1. Składowe wektora u są postaci:
u =
jk - jeśli xjk = 1 i jego dopełnienie nie było rozważane
-jk – jeśli xjk = 0 lub 1 i jego dopełnienie było rozważane
0 - jeśli k>s
Krok początkowy.
Krok 1.
Sprawdzić, czy b≥0. Jeśli tak, to optymalnym rozwiązaniem jest x = 0. W przeciwnym razie podstawić uT = (0, 0, ..., 0), xT = (-1, -1, ..., -1), z' = ∞ (dostatecznie duża liczba).
Kroki iteracyjne
Krok 2.
Obliczyć:
yi = bi - Σaijxj, j należy do J
y' = min yi i = 1, 2, ..., m
z = Σcjxj, j należy do J
gdzie J jest zbiorem wskaźników zmiennych o ustalonych wartościach (rozwiązanie częściowe). Jeśli y'≥0 oraz z<z', to przyjąć z = z' oraz x' = x. Wektor x' jest nowym potencjalnym rozwiązaniem. Przejść do kroku 6 (cofanie się). W przeciwnym razie iść dalej.
Krok 3.
Utworzyć następujący podzbiór T zmiennych swobodnych xj:
T = {j: z + cj < z', aij < 0 dla i takich, że yi < 0}.
Jeśli T = {} (zbiór pusty), to przejść do kroku 6. W przeciwnym razie iść dalej.
Krok 4.
TEST NIEDPOPUSZCZALNOŚCI. Sprawdzić, czy istnieje taki wskaźnik i, że:
yi < 0 oraz
yi - Σ min{0, aij} < 0, dla j należącego do T.
Jeśli tak, to przejść do kroku 6. W przeciwnym razie iść dalej.
Krok 5.
TEST ROZGAŁĘZIEŃ BALASA. Dla każdej zmiennej swobodnej x utworzyć zbiór:
Mj = {i: yi - aij < 0}.
Jeśli wszystkie zbiory Mj są puste, przejść do kroku 6. W przeciwnym razie obliczyć:
vj = Σ (yi - aij), dla i należącego do Mj
dla każdej zmiennej swobodnej xj, gdzie vj = 0, gdy M,j = {} (zbiór pusty).
Powiększyć bieżące rozwiązanie częściowe o tę zmienną xj, dla której vj osiąga wartość największą. Wróć do kroku 2.
Krok 6.
COFANIE SIĘ:
Przykład
Aby zilustrować omówiony algorytm, rozważmy obecnie następujące zagadnienie:
Znaleźć minimum:
z = 5x1 + 7x2 + 10x3 + 3x4 + x5
przy warunkach:
-x1 + 3x2 - 5x3 - x4 + 4x5 ≤ -2
2x1 - 6x2 + 3x3 + 2x4 - 2x5 ≤ 0
x2 - 2x3 + x4 + x5 ≤ -1
Iteracja 1
Podzbiór T jest równy {1,3,4}. Test niedopuszczalności zawodzi. Zbiory Mj oraz wartości vj dla j=1, 2, ... 5 są odpowiednio równe:
M1 = {1, 2}, M2 = {1, 3}, M3 = {2}, M4 = {1, 2, 3}, M5 = {1, 3},
v1 = -4, v2 = -7, v3 = -3, v4 = -5, v5 =-8,
max = {vj 1≤j≤5} = v3 = -3
Do rozwiązania częściowego dodajemy zmienną x3 = 1. Pozostałe zmienne są swobodne i mają wartość 0.
Iteracja 2
T = {2, 5}. Test niedopuszczalności zawodzi. Otrzymujemy:
M1 = {2}, M2 = {}, M4 = {2}, M5 = {1, 2},
v1 = -5, v2 = 0, v4 = -5, v5 = -2,
Następną zmienną dodaną do rozwiązania częściowego jest x2 = 1, ze względu na to, że:
max = {vj j = 1, 2, 4, 5} = v2 = 0
Iteracja 3
Wektor xT = (0, 1, 1, 0, 0) jest dopuszczalny i staje się potencjalnym rozwiązaniem x', a z' = 17. Wykonuje się krok 6 (cofanie się). Mamy teraz x3 = 1, x2 = 0, a pozostałe zmienne są swobodne.
Iteracja 4
T = {5}. Test niedopuszczalności jest spełniony dla i = 2 (drugie ograniczenie) i przechodzimy do cofania się. Teraz x2 i x3 są ustalone jako 0, a pozostałe zmienne są swobodne.
Iteracja 5
T = {1, 4}. Test niedopuszczalności jest spełniony dla i = 3 i przechodzimy do cofania się. Przegląd jest zakończony, bo nie można się już cofnąć.
Optymalnym rozwiązaniem jest zatem:
x'1 = 0, x'2 = 1, x'3 = 1, x'4 = 0, x'5 = 0 oraz z' = 17
Znaleźć minimum: z=c1x1 + c2x2 + ... + cnxn
Przy ograniczeniach: ai1x1 + ai2x2 + ... + ainxn ≤ bi
gdzie: i = 1, 2, ..., m
xj = 0 lub 1
j = 1, 2, ..., n.
Zasada działania algorytmu.
Do śledzenia postępu przeglądu używa się dwu wektorów: uT = (u1, u2, ..., un) oraz xT = (x1, x2, ..., xn). Jeśli w skład rozwiązania częściowego wchodzą zmienne xj1, xj2, ..., xjs, wybrane w takim właśnie porządku, to składowe wektora x odpowiadające tym zmiennym mają wartości albo 0 albo 1. Pozostałe składowe wektora x, odpowiadające zmiennym swobodnym, mają wartości –1. Składowe wektora u są postaci:
u =
jk - jeśli xjk = 1 i jego dopełnienie nie było rozważane
-jk – jeśli xjk = 0 lub 1 i jego dopełnienie było rozważane
0 - jeśli k>s
Krok początkowy.
Krok 1.
Sprawdzić, czy b≥0. Jeśli tak, to optymalnym rozwiązaniem jest x = 0. W przeciwnym razie podstawić uT = (0, 0, ..., 0), xT = (-1, -1, ..., -1), z' = ∞ (dostatecznie duża liczba).
Kroki iteracyjne
Krok 2.
Obliczyć:
yi = bi - Σaijxj, j należy do J
y' = min yi i = 1, 2, ..., m
z = Σcjxj, j należy do J
gdzie J jest zbiorem wskaźników zmiennych o ustalonych wartościach (rozwiązanie częściowe). Jeśli y'≥0 oraz z<z', to przyjąć z = z' oraz x' = x. Wektor x' jest nowym potencjalnym rozwiązaniem. Przejść do kroku 6 (cofanie się). W przeciwnym razie iść dalej.
Krok 3.
Utworzyć następujący podzbiór T zmiennych swobodnych xj:
T = {j: z + cj < z', aij < 0 dla i takich, że yi < 0}.
Jeśli T = {} (zbiór pusty), to przejść do kroku 6. W przeciwnym razie iść dalej.
Krok 4.
TEST NIEDPOPUSZCZALNOŚCI. Sprawdzić, czy istnieje taki wskaźnik i, że:
yi < 0 oraz
yi - Σ min{0, aij} < 0, dla j należącego do T.
Jeśli tak, to przejść do kroku 6. W przeciwnym razie iść dalej.
Krok 5.
TEST ROZGAŁĘZIEŃ BALASA. Dla każdej zmiennej swobodnej x utworzyć zbiór:
Mj = {i: yi - aij < 0}.
Jeśli wszystkie zbiory Mj są puste, przejść do kroku 6. W przeciwnym razie obliczyć:
vj = Σ (yi - aij), dla i należącego do Mj
dla każdej zmiennej swobodnej xj, gdzie vj = 0, gdy M,j = {} (zbiór pusty).
Powiększyć bieżące rozwiązanie częściowe o tę zmienną xj, dla której vj osiąga wartość największą. Wróć do kroku 2.
Krok 6.
COFANIE SIĘ:
- Zmienić w wektorze u znak najbardziej w prawo położonej składowej dodatniej. Nadać wszystkim składowym leżącym na prawo od niej wartość 0. Jest to nowe rozwiązanie częściowe. Wrócić do kroku 2.
- Jeśli wektor u nie ma dodatniej składowej, to przegląd pośredni został zakończony. Optymalnym rozwiązaniem jest x', a odpowiadającą mu wartością funkcji celu jest z'. Jeśli z' = ∞, to nie ma rozwiązania dopuszczalnego.
Przykład
Aby zilustrować omówiony algorytm, rozważmy obecnie następujące zagadnienie:
Znaleźć minimum:
z = 5x1 + 7x2 + 10x3 + 3x4 + x5
przy warunkach:
-x1 + 3x2 - 5x3 - x4 + 4x5 ≤ -2
2x1 - 6x2 + 3x3 + 2x4 - 2x5 ≤ 0
x2 - 2x3 + x4 + x5 ≤ -1
Iteracja 1
Podzbiór T jest równy {1,3,4}. Test niedopuszczalności zawodzi. Zbiory Mj oraz wartości vj dla j=1, 2, ... 5 są odpowiednio równe:
M1 = {1, 2}, M2 = {1, 3}, M3 = {2}, M4 = {1, 2, 3}, M5 = {1, 3},
v1 = -4, v2 = -7, v3 = -3, v4 = -5, v5 =-8,
max = {vj 1≤j≤5} = v3 = -3
Do rozwiązania częściowego dodajemy zmienną x3 = 1. Pozostałe zmienne są swobodne i mają wartość 0.
Iteracja 2
T = {2, 5}. Test niedopuszczalności zawodzi. Otrzymujemy:
M1 = {2}, M2 = {}, M4 = {2}, M5 = {1, 2},
v1 = -5, v2 = 0, v4 = -5, v5 = -2,
Następną zmienną dodaną do rozwiązania częściowego jest x2 = 1, ze względu na to, że:
max = {vj j = 1, 2, 4, 5} = v2 = 0
Iteracja 3
Wektor xT = (0, 1, 1, 0, 0) jest dopuszczalny i staje się potencjalnym rozwiązaniem x', a z' = 17. Wykonuje się krok 6 (cofanie się). Mamy teraz x3 = 1, x2 = 0, a pozostałe zmienne są swobodne.
Iteracja 4
T = {5}. Test niedopuszczalności jest spełniony dla i = 2 (drugie ograniczenie) i przechodzimy do cofania się. Teraz x2 i x3 są ustalone jako 0, a pozostałe zmienne są swobodne.
Iteracja 5
T = {1, 4}. Test niedopuszczalności jest spełniony dla i = 3 i przechodzimy do cofania się. Przegląd jest zakończony, bo nie można się już cofnąć.
Optymalnym rozwiązaniem jest zatem:
x'1 = 0, x'2 = 1, x'3 = 1, x'4 = 0, x'5 = 0 oraz z' = 17
| Autor | Język programowania | Komentarz | Otwórz | Pobierz | Ocena |
| Robert Dudek | C/C++ | MS Visual Studio | ![]() | ![]() |
![]() ![]() ![]() ![]() / 1 |
| Michał Kot | C/C++ | ![]() | ![]() |
![]() ![]() ![]() ![]() / 2 |
Poprawiony: wtorek, 21 czerwca 2011 17:42



/ 1