ć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

Podobne dokumenty