1 Pendahuluan
Dalam mencari titik minimum dari suatu fungsi nonlinear, terdapat beberapa metode, salah satunya adalah
metode Descent Direction dalam mennentukan arah 𝑝 𝑘 dan Line Search dalam menentukan steplength
𝛼 𝑘 . Dalam mencari titi minimum, titik iterasi pada metode Descent Direction terlebih dahulu menentukan
arah 𝑝 𝑘 , selanjutnya dicari berapa jauhnya perpindahan 𝛼 𝑘 yang dinyatakan dalam persamaan berikut
𝑥 𝑘+1 = 𝑥 𝑘 + 𝛼 𝑘 𝑝 𝑘 (1)
Dalam laporan ini, akan dicari minimum dari fungsi griewank berorde 2, yang didefiniskan sebagi berikut
2 2
𝑥𝑖2
∑︁ Ö 𝑥𝑖
𝑓 (𝑥) = 1 − cos √ (2)
𝑖=1
4000 𝑖=1 𝑖
Sealnjutnya akan dievaluasi dalam interval −5 ≤ 𝑥1 , 𝑥2 ≤ 5. Pencarian titik minimum dilakukan dengan
menggunakan metode Descent Direction dalam menentukan arah 𝑝 𝑘 , dalam hal ini menggunakan metode
Steepest Descent dan Newton. Selanjtnya dalam menentukan 𝛼 𝑘 menggunkan metode Line Search, dengan
penentuan step length dilakukan dengan wolfe condition. Kemudian akan dibandingkan dan dianalisis
hasil dari setiap metodenya.
2 Descent Direction
Descent Direction merupakan suatu metode dalam menentukan arah 𝑝 𝑘 yang membuat barisan 𝑥 𝑘 kon-
vergen ke nilai minimum. Terdapat beberapa metoda dalam pemilihan Descent Direction yang akan diuji,
antara lain
1
Algorithm 1 Steepest Descent
Input (𝛼𝑚𝑎𝑥 , 𝛼0 , 𝑐 1 , 𝑐 2 , 𝜖)
𝑝 0 ← −∇ 𝑓 (𝑥0 )
𝛼0 ← Line Serach(𝑥 0 , 𝑝 0 , 𝛼𝑚𝑎𝑥 , 𝑐 1 , 𝑐 2 )
𝑥 1 = 𝑥0 + 𝛼0 𝑝 0
while ||𝑥𝑖+1 − 𝑥𝑖 || ≥ 𝜖 do
𝑝𝑖 ← −∇ 𝑓 (𝑥𝑖 )
𝛼𝑖 ← Line Search (𝑥𝑖 , 𝑝𝑖 , 𝛼𝑚𝑎𝑥 , 𝑐 1 , 𝑐 2 )
𝑥𝑖+1 = 𝑥𝑖 + 𝛼𝑖 𝑝𝑖
𝑖 ←𝑖+1
end while
2
untuk suatu 𝑐 1 ∈ (0, 1). Selanjutnya juga terdapat syarat yang harus dipenuhi yaitu
∇ 𝑓 (𝑥 𝑘 + 𝛼 𝑘 𝑝 𝑘 )𝑇 𝑝 𝑘 ≥ 𝑐 2 ∇ 𝑓 𝑘𝑘 𝑝 𝑘 (4)
dnegan 𝑐 2 ∈ (𝑐 1 , 2) Algoritma line Search dengan menggunakan wolfe condition dimuali dengan periki-
raan 𝛼1 dan terus meningkatkan sampai menemukan panjang langkah nya 𝛼 yang dapat diterima. se-
lanjutnya memanggil fungsi zoom, yang berturut-turut mengurangi ukuran interval sampai pada panjang
langkah yang dapat diterima. setiap iterasi dari fungsi zoom menghasilkan 𝛼 𝑗 diantara 𝛼0 dan 𝛼1 serta
kemudian menggantikan satu dari titik akhir dengan 𝛼 𝑗 sedemikan syarat syarat dipenuhi. Cara kerja dari
Algoritma Line Search dan Zoom diberikan pada Algoritma 3 dan Algoritma 4
Algorithm 4 Zoom
while 𝑖 ≤ 1000 do
𝛼 𝑗 : Interpolasi Quadratik dan interpolasi kubik
Selanjutnya Evaluasi 𝜙𝛼 𝑗
′
if 𝜙(𝛼 𝑗 ) > 𝜙(0) + 𝑐 1 𝛼 𝑗 𝜙 (0) or 𝜙(𝛼 𝑗 ) ≥ 𝜙 ( 𝛼ℎ𝑖 ) then
𝛼ℎ𝑖 ← 𝛼 𝑗 .
else
′ ′
if |𝜙 (𝛼𝑖 )| ≤ −𝑐 2 𝜙 (0) then
𝛼∗ ← 𝛼 𝑗 and Stop
end if
′
if 𝜙 (𝛼ℎ𝑖 − 𝛼𝑙𝑜 ) ≥ 0 then
𝛼ℎ𝑖 ← Zoom (𝛼𝑙𝑜 , 𝛼𝑖−1 ) and stop
end if
𝛼𝑙𝑜 ← 𝛼 𝑗
end if
end while
3
4 Hasil dan Pembahasan
Fungsi Griewank dua dimensi yang digunakan pada laporan ini adalah sebagai berikut,
1 2 2 𝑥2
𝑓 (𝑥) = 1 + + (𝑥 1 + 𝑥2 ) − cos(𝑥 1 ) cos √ (5)
4000 2
dengan −4 ≤ 𝑥 1 , 𝑥2 ≤ 4. Plot dari fungsi griewank berorde 2 terlihat pada Gambar (??) Pada laporan
ini akan dicari nilai minimum global dari fungsi Griewank menggunakan kombinasi metode pencarian
arah 𝑝 𝑘 dan panjang lagkah 𝛼𝑘 dengan masing nasing 4 nilai awal yang berbeda dan nilai-nilai parameter
𝛼0 = 0, 𝛼𝑚𝑎𝑥 = 1, 𝑐 1 = 0, 0001, 𝑐 2 = 0, 5 dan nilai toleransinya 𝜖 = 10−5 .
Selanjutnya akan ditampilkan hasil simulasi dengan menggunakan bahasa pemograman Phyton dari
steepest Direction, dan Newton
4
Tabel 1
Tabel 3
5
Niali awal (𝑥 1 , 𝑥 2 ) Jumlah Iterasi Nilai Minimum 𝑓 (𝑥𝑖 )
(0.8, 0.8) 13 0.000000
(4, −4) 12 0.007396
(4, 4) 12 0.007396
(−4, 4) 12 0.007396
(−4, −4) 12 0.007396
5 Kesimpulan
Berdasarkan dari hasil dan pembahasan, diperoleh nilai minumum global dari setiap metode Descent
Direction dalam menentukan arah 𝑝 𝑘 yang dikombinasikan dengan metode line search dalam menentukan
𝛼𝑘 adalah 𝑓 (𝑥𝑖 ) = 0.0000 dengan memberikan nilai awal 𝑥0 = [0.4, 0.4]
Berdasarkan Jumlah itetrasi Metode Newton adalah yang paling baik untuk mengoptimisasikan fungsi
griewank berorde 2. Metode Newton memiliki laju kekonvergenan yang lebih cepat dalam mencari solusi
minimum dari fungsi griewank bebrorde 2.
6
LAMPIRAN
def griewank(x):
sum_x = 0
multiply_x = 1
for i in range(len(x)):
sum_x = sum_x + x[i]**2
multiply_x = multiply_x *np.cos(x[i]/np.sqrt(i+1))
return 1+ ((sum_x)/4000) - multiply_x
def gradgriewank(x):
return np.array ([x[0]/2000+np.sin(x[0])*np.cos(x[1]/np.sqrt(2)),
x[1]/2000+np.cos(x[0])*np.sin(x[1]/np.sqrt(2))/np.sqrt(2)])
def gradgriewank2(x):
return np.array([[1/2000+np.cos(x[0])*np.cos(x[1]/np.sqrt(2)),
-(np.sin(x[0])*np.sin(x[1]/np.sqrt(2))/np.sqrt(2))],
[-(np.sin(x[0])*np.sin(x[1]/np.sqrt(2))/np.sqrt(2)),
(1/2000)+np.cos(x[0])*np.cos(x[1]/np.sqrt(2))/2]])
def Steepest(f,gradgriewank,x0):
x=[]
f=[]
x.append(np.array(x0))
f.append(griewank(x[0]))
eps=0.00001
c1=0.0001
c2=0.5
alpha_max=1
print(’Kondisi Awal: f = {:.6f}, x = {} \n’.format(f[0], x[0]))
Bk=np.identity(2)
pk=-np.linalg.inv(Bk)@gradgriewank(x[0])
alpha=Line_Search(x[0],pk,alpha_max,c1,c2)
x_baru=x[0]+alpha*pk
x.append(x_baru)
f.append(griewank(x_baru))
i=1
while np.linalg.norm(x[i]-x[i-1])>=eps and i<=1000:
Bk=np.identity(2)
pk=-np.linalg.inv(Bk)@gradgriewank(x[i])
alpha=Line_Search(x[i],pk,alpha_max,c1,c2)
7
x_baru=x[i]+alpha*pk
x.append(x_baru)
f.append(griewank(x_baru))
print(’{} \t {:.4f}, {}’. format(i, f[i], x[i]))
i+=1
if i == 1000:
print(’\nTidak Konvergen.’)
else:
print(’\nSolusi: \t f = {:.6f}, x = {}’.format(griewank(x_baru), x_baru))
return np.array(x), np.array(f)
8
print(’\nTidak Konvergen.’)
else:
print(’\nSolusi: \t f = {:.4f}, x = {}’.format(griewank(x_baru), x_baru))
return np.array(x), np.array(f)
def Line_Search(x,p,alpha_max,c1,c2):
alpha0=0
alpha1=(alpha0+alpha_max)/2
alpha=[alpha0,alpha1]
i=1
while i<=1000:
#Cek phi(alpha[0])
if phi(x,p,alpha[i])>phi(x,p,0)
+c1*alpha[i]*d_phi(x,p,0)
or (phi(x,p,alpha[i])
>phi(x,p,alpha[i-1]) and i>1):
return zoom([alpha[i-1],alpha[i]],x,p,c1,c2)
break
if abs(d_phi(x,p,alpha[i]))<=-c2*d_phi(x,p,0):
return alpha[i]
break
if d_phi(x,p,alpha[i])>=0:
return zoom([alpha[i],alpha[i-1]],x,p)
break
#alpha[i+1]=(alpha[i]+alpha_max)/2 #Biseksi
alpha.append((alpha[i]+alpha_max)/2)
i+=1
def zoom(alpha, x,p,d1,d2):
i=0
alphanew = (alpha[0]+alpha[1])/2
alphanew1= -dphi(x,p,0)/(2*(phi(x,p,alphanew)-phi(x,p,0)-dphi(x,p,0)*alphanew))
while i <= 1000:
if phi(x, p, alphanew) > phi(x,p,0) + d1*alphanew*dphi(x, p, 0):
alphanew = -dphi(x,p,0)/(2*(phi(x,p,alphanew)
-phi(x,p,0)-dphi(x,p,0)*alphanew))
elif phi(x, p, alphanew1) > phi(x,p,0) + d1*alphanew1*dphi(x, p, 0):
h=1/((alphanew**2)*alphanew1*(alphanew1-alphanew))
m1=np.array([[alphanew**2,-alphanew1**2],
[-alphanew**3,alphanew1**3]])
m2=np.array([phi(x,p,alphanew1)-phi(x,p,0)
-dphi(x,p,0)*alphanew1],
[phi(x,p,alphanew)-phi(x,p,0)-dphi(x,p,0)*alphanew])
m3=np.matmul(m1,m2)/h
alphanew=(-m3[1]+np.sqrt((m3[1])**2
-3*m3[1]*dphi(x,p,0)))/(3*m3[1])
9
#Cek Alpha
if phi(x, p, alphanew) > phi(x,p,0) + d1*alphanew*dphi(x, p, 0)
or (phi(x, p,alphanew) > phi(x,p,alpha[0])):
alpha[1]=alphanew
else:
if abs(dphi(x,p,alphanew)) <=-d2*dphi(x,p,0):
return alphanew
Break
if (dphi(x,p,alphanew))*(alpha[0]-alpha[1])>=0:
alpha[1]=alpha[0]
alpha[0] = alphanew
i+=1
10