ćwiczenia 11
Transkrypt
ćwiczenia 11
Optymalizacja dyskretna ćw. 12 UAM 2016 jpl, js Algorytmy heurystyczne Jednostajny podział grafu dane: graf pełny na 2n wierzchołkach, G = (V , E), funkcja kosztu cost : E → Z+ ∪ {0}, cel: Znaleźć minimalna˛ wartość X C([X0 , X1 ]) = cost(u, v ), {u,v }∈E,u∈X0 ,v ∈X1 przy ograniczeniach V = X0 ∪ X1 i |X0 | = |X1 | = n. jpl, js Algorytmy heurystyczne Jednostajny podział grafu - przykład jpl, js Algorytmy heurystyczne Jednostajny podział grafu - przykład Podział [{0, 2, 5, 7}, {1, 3, 4, 6}] cost(2,1) + cost(2,4) + cost(2,6) + cost(5,3) = 8 + 7 + 2 + 4 = 21 jpl, js Algorytmy heurystyczne Jednostajny podział grafu - przykład jpl, js Algorytmy heurystyczne Jednostajny podział grafu - przykład Podział [{0, 2, 5, 7}, {1, 3, 4, 6}] cost(2,1) + cost(2,4) + cost(2,6) + cost(5,3) = 8 + 7 + 2 + 4 = 21 jpl, js Algorytmy heurystyczne Jednostajny podział grafu - przykład Podział [{0, 3, 5, 7}, {1, 2, 4, 6}] cost(0,2) + cost(3,4) = 9 + 9 = 18 jpl, js Algorytmy heurystyczne Oznaczenia X – uniwersum (zbiór rozwiaza ˛ ń), X ∈ X – rozwiazanie ˛ dopuszczalne o ile spełnia pewne założenia, Rozwiazanie ˛ optymalne – dopuszczalne i takie, które maksymalizuje zysk P(X ), N : X → 2X – sasiedztwo, ˛ hN – sposób w jaki wybieramy Y ∈ N(X ) dla danego X ∈ X. jpl, js Algorytmy heurystyczne GenericHillClimbing – wspinanie Algorithm 0.1: G ENERIC H ILL C LIMBING(cmax ) external N(), hN () wybierz rozwiazanie ˛ dopuszczalne X ∈ X searching ← true while searching 6= ∅ if N(X ) Y ← hN (X ) do then X ←Y else searching ← false return (X ) jpl, js Algorytmy heurystyczne Zadanie 12.1 Znajdź przykład zadania równomiernego (jednostajnego) podziału grafu wraz z podziałem poczatkowym, ˛ dla którego algorytm wymiany pary wierzchołków znajdzie jedynie ekstremum lokalne (w jakim sensie?), ale nie znajdzie globalnego. jpl, js Algorytmy heurystyczne Zadanie 12.1 jpl, js Algorytmy heurystyczne Zadanie 12.1 jpl, js Algorytmy heurystyczne Zadanie 12.1 jpl, js Algorytmy heurystyczne Zadanie 12.1 jpl, js Algorytmy heurystyczne Zadanie 12.1 jpl, js Algorytmy heurystyczne Zadanie 12.2 Jeżeli graf jest rzadki, to omawiany na wykładzie algorytm równomiernego (jednostajnego) podziału grafu nie jest efektywny. Zaprojektuj w tym przypadku lepszy algorytm heurystyczny oparty na strategii 1 symulowanego schładzania (wymrażania), 2 listy tabu, 3 genetycznej (ewolucyjnej). jpl, js Algorytmy heurystyczne GenericSimulatedAnnealing – schładzanie Algorithm 0.2: G ENERIC S IMULATEDA NNEALING(cmax , T0 , α) external N(), hN (), Random(), P() c←1 T ← T0 wybierz rozwiazanie ˛ dopuszczalne X ∈ X Xbest ← X while c ≤ cmax Y ← hN (X ) if Y 6= Fail > P(X ) if P(Y ) X ←Y then if P(X ) > P(X ) best then Xbest ← X do then r ← Random(0, 1) else if r < e(P(Y )−P(X ))/T then X ← Y c ←c+1 T ← αT return (Xbest ) jpl, js Algorytmy heurystyczne Zadanie 12.2 (a) (UGP=Uniform Graph Partition) Algorithm 0.3: UGPS IMULATEDA NNEALING(cmax , T0 , α) external Random() wybierz rozwiazanie ˛ dopuszczalne X ∈ X c ← 1; Xbest ← X ; T ← T0 \\T0 ≈ C(X ) while c ≤ cmax Y ← UGPh(X ) if C(Y ) < C(X ) X ←Y then if C(X ) < C(X ) then X best best ← X do r ← Random(0, 1) else if r < e−(C(Y )−C(X ))/T then X ← Y c ← c + 1 T ← αT return (Xbest ) jpl, js Algorytmy heurystyczne Zadanie 12.2 (a) Algorithm 0.4: C(X = (X0 , X1 )) external w[] \\ macierz wag p←0 for each a ∈ X0 for each b ∈ X1 do p ← p + w(a, b) return (p) Algorithm 0.5: UGP H(X = (X0 , X1 )) external w[], Random() a ← Random(X0 ); b ← Random(X1 ) X0 ← X0 \ {a} ∪ {b}; X1 ← X1 \ {b} ∪ {a} return ((X0 , X1 )) jpl, js Algorytmy heurystyczne GenericTabuSearch – listy tabu Algorithm 0.6: G ENERIC TABU S EARCH(cmax , L) external N(), change(), P() c←1 wybierz rozwiazanie ˛ dopuszczalne X ∈ X Xbest ← X while c ≤ cmax NT ← N(X ) \ {TabuList[d] : max{1, c − L} ≤ d ≤ c − 1} Y ∈ NT for each if Y nie jest dopuszczalne do then NT ← NT \ {Y } if N = ∅ T then break do znajdź Y ∈ NT które maksymalizuje P(Y ) TabuList[c] ← change(Y , X ) X ←Y if P(X ) > P(Xbest ) then Xbest ← X c ←c+1 return (Xbest ) jpl, js Algorytmy heurystyczne Zadanie 12.2 (b) Algorithm 0.7: UGPTABU S EARCH(cmax , L) external N(), C() c←1 wybierz rozwiazanie ˛ dopuszczalne X ∈ X Xbest ← X while c ≤ cmax NT ← N(X ) \ {TabuList[d] : max{1, c − L} ≤ d ≤ c − 1} if NT = ∅ then break znajdź Y ∈ NT które minimalizuje C(Y ) do TabuList[c] ← X X ←Y if C(X ) < C(Xbest ) then Xbest ← X c ←c+1 return (Xbest ) jpl, js Algorytmy heurystyczne Zadanie 12.2 (b) Algorithm 0.8: N(X = (X0 , X1 )) S←∅ for each a ∈ X0 for each b ∈ X1 Y0 ← X0 \ {a} ∪ {b} do Y1 ← X1 \ {b} ∪ {a} S ← S ∪ {(Y0 , Y1 )} return (S) jpl, js Algorytmy heurystyczne GenericGeneticAlgorithm Algorithm 0.9: G ENERIC G ENETIC A LGORITHM(popsize, cmax ) external N(), hN (), rec(), P() c←1 wybierz populacje˛ poczatkow ˛ a˛ P Xbest ← element z P maksymalizujacy ˛ P(·) for each X ∈ P do X ← hN (X ) while c ≤ cmax połacz ˛ elementy P w pary Q ← P for each para (W , X ) (Y , Z ) ← rec(W , X ) do Y ← hN (Y ); Z ← hN (Z ) do Q ← Q ∪ {Y , Z } P ← popsize najlepszych elementów z Q ˛ P(·) Y ← element z P maksymalizujacy if P(Y ) > P(Xbest ) then Xbest ← Y c ←c+1 return (Xbest ) jpl, js Algorytmy heurystyczne Zadanie 12.2 (c) Algorithm 0.10: UGPG ENETIC A LGORITHM(popsize, cmax ) external UGPh(), UGPrec(), C(), p \\prawdopodobieństwo mutacji c←1 wybierz populacje˛ poczatkow ˛ a˛ P Xbest ← element z P minimalizujacy ˛ C(·) while c ≤ cmax sortuj P rosnaco ˛ wzgledem ˛ funkcji C(·) Q ← P for i ← 1 to popsize/2 (Y , Z ) ← UGPrec(P2i−1 , P2i ) if Random(0, 1) < p then Y ← UGPh(Y ) do if Random(0, 1) < p then Z ← UGPh(Z ) do Q ← Q ∪ {Y , Z } P ← popsize najlepszych elementów z Q Y ← element z P minimalizujacy ˛ C(·) if C(Y ) < C(Xbest ) then Xbest ← Y c ←c+1 return (Xbest ) jpl, js Algorytmy heurystyczne Zadanie 12.2 (c) Algorithm 0.11: UGP REC((X , Y )) external randSet() \\ randSet(X , k ) losowy podzbiór X mocy k XY ← X0 ∩ Y0 k ← |X 0 |− |XY | k0 ← k2 ; k1 ← k − k0 A0 ← XY ∪ randSet(X0 \ XY , k0 ) ∪ randSet(Y0 \ XY , k1 ) B0 ← XY ∪ (X0 \ A0 ) ∪ (Y0 \ A0 ) A ← (A0 , (X0 ∪ X1 ) \ A0 ) B ← (B0 , (X0 ∪ X1 ) \ B0 ) return ((A, B)) jpl, js Algorytmy heurystyczne Zadanie 12.2 (c) Algorithm 0.12: UGP H(X = (X0 , X1 )) external w[], Random() a ← Random(X0 ); b ← Random(X1 ) X0 ← X0 \ {a} ∪ {b}; X1 ← X1 \ {b} ∪ {a} return ((X0 , X1 )) jpl, js Algorytmy heurystyczne Zadanie 12.2 Zaprojektuj algorytm heurystyczny dla problemu plecakowego oparty na strategii 1 wspinania (hill climbing) 2 symulowanego schładzania (wymarzania), 3 listy tabu, 4 genetycznej (ewolucyjnej). jpl, js Algorytmy heurystyczne Problem plecakowy Instancja: zyski: p0 , . . . , pn−1 wagi: w0 , . . . , wn−1 pojemność: M Uniwersum: X = Bn = {0, 1}n . Rozwiazanie ˛ X = {x0 , . . . , xn−1 } ∈ X jest dopuszczalne gdy W (X ) = n−1 X xi wi ≤ M, i=0 Chcemy zmaksymalizować: P(X ) = n−1 X xi pi . i=0 jpl, js Algorytmy heurystyczne Sasiedztwo: ˛ N(X ) = {Y ∈ {0, 1}n : dist(X , Y ) = 1} Sasiedztwo ˛ X składa sie˛ z n-elementowych ciagów ˛ binarnych różniacych ˛ sie˛ z X dokładnie jednym bitem. jpl, js Algorytmy heurystyczne Algorithm 0.13: P(X []) external p[] \\ wektor zysków s←0 for i ← 0 to n − 1 do s ← s + X [i]p[i] return (s) Algorithm 0.14: W(X []) external w[] \\ wektor wag s←0 for i ← 0 to n − 1 do s ← s + X [i]w[i] return (s) jpl, js Algorytmy heurystyczne Wspinanie (Hill Climbing) Algorithm 0.15: K NAPSACK H ILL C LIMBING(p[], w[]) external Random() Xbest ← [0, . . . , 0] W ←0 searching ← true while searching S ← {j ∈ {0..n − 1} : Xbest [j] = 0}; if S = ∅ then break do i ← Random(S); W ← W + w[i] if W ≤ M then Xbest [i] ← 1 else searching ← false return (Xbest ) jpl, js Algorytmy heurystyczne symulowane schładzanie Algorithm 0.16: K NAPSACK S IMULATEDA NNEALING(cmax , T0 , α) external Random(), P() c ← 0; T ← T0 ; W ← 0; X ← [0, . . . , 0]; Xbest ← X while c ≤ cmax j ← Random(0..n − 1) 1) or (W + w[j] ≤ M) if (X [j] = if X [j] =0 X [j] ← 1 then W ← W + w[j] if P(X ) > P(Xbest ) then Xbest ← X then do r ← Random(0, 1) if r < e−p[j]/T else X [j] ← 0 then W ← W − w[j] c ←c+1 T ← αT return (Xbest ) jpl, js Algorytmy heurystyczne listy tabu Algorithm 0.17: K NAPSACK TABU S EARCH(cmax , L) external P(), W () wybierz rozwiazanie ˛ dopuszczalne X ∈ {0, 1}n Wb ← W (X ); Xbest ← X ; c ← 1 while c ≤ cmax N ← {0, . . . , n − 1} start ← max{0, c − L} for j ← start to c − 1 do N ← N \ {TabuList[j]} for each i ∈ N do if X [i] = 0 and Wb + w[i] > M then N ← N \ {i} do if N = ∅ then break znajdź i ∈ N które maksymalizuje (−1)X [i] p[i]/w[i] TabuList[c] ← i; X [i] ← 1 − X [i] if X [i] = 1 then Wb ← Wb + w[i] else Wb ← Wb − w[i] if P(X ) > P(Xbest ) then Xbest ← X c ←c+1 return (Xbest ) jpl, js Algorytmy heurystyczne genetyczny Algorithm 0.18: K NAPSACK G ENETIC A LGORITHM(popsize, cmax ) external h(), rec(), P(), p \\prawdopodobieństwo mutacji c←1 wybierz populacje˛ poczatkow ˛ a˛ P Xbest ← element z P maksymalizujacy ˛ P(·) while c ≤ cmax sortuj P malejaco ˛ wzgledem ˛ funkcji P(·) Q ← P for i ← 1 to popsize/2 (Y , Z ) ← rec(P2i−1 , P2i ) if Random(0, 1) < p then Y ← h(Y ) do if Random(0, 1) < p then Z ← h(Z ) do Q ← Q ∪ {Y , Z } P ← popsize najlepszych elementów z Q Y ← element z P maksymalizujacy ˛ P(·) if P(Y ) < P(Xbest ) then Xbest ← Y c ←c+1 return (Xbest ) jpl, js Algorytmy heurystyczne jak znaleźć dobrego sasiada ˛ Algorithm 0.19: H(X []) external W (), Random() ready ← false repeat i ← Random(0..n − 1) if X [i] = 0 X [i] ← 1 then if W (X ) + w[i] ≤ M then ready ← true X [i] ← 0 else ready ← true until ready return (X ) jpl, js Algorytmy heurystyczne jak X zrobić dopuszczalnym? Algorithm 0.20: FEASIBLE(X ) external Random(), W () while W (X ) > M do X [Random(0..n − 1)] ← 0 return (X ) jpl, js Algorytmy heurystyczne jak powstaja˛ dzieci Algorithm 0.21: REC(X , Y ) external Random() k ← Ramdom(0..n − 1) for i ← 0 to k A[i] ← X [i] do B[i] ← Y [i] for i ← k + 1 to n − 1 A[i] ← Y [i] do B[i] ← X [i] A ← feasible(A); B ← feasible(B) return (A, B) jpl, js Algorytmy heurystyczne inny sposób powstawania dzieci Algorithm 0.22: REC(X , Y ) external Random() for i ← 0 to n − 1 if Random(0..1) =0 A[i] ← X [i] then do B[i] ← Y [i] A[i] ← Y [i] else B[i] ← X [i] A ← feasible(A); B ← feasible(B) return (A, B) jpl, js Algorytmy heurystyczne