BAB 3
ANALISIS DAN PERANCANGAN
3.1 Analisis
Pada bab 2, telah dijelaskan mengenai pemilihan negative cycle yang akan mengalami proses canceling tanpa menggunakan aturan-aturan tertentu. Dengan kondisi tersebut, maka metode cycle canceling akan memiliki kompleksitas total sebesar
2
( )
O VA CU . Dengan kompleksitas seperti itu, algoritma ini sudah dapat tergolong
kedalam kelompok polynomial, tetapi dalam kasus sehari-hari C dan U seringkali bernilai sangat besar, sehingga kompleksitas tersebut akan jatuh kedalam keadaan weak
polynomial. Untuk itu diperlukan algoritma yang lebih cepat yang memiliki
kompleksitas yang tergolong sebagai strong polynomial. Hal tersebut dapat tercapai dengan cara menghilangkan faktor C dan U dari perhitungan kompleksitas, atau menggunakan algoritma yang dapat membuat pertumbuhan kompleksitas terhadap C dan U menjadi sangat kecil.
Seperti pada hipotesis, bahwa penggunaan aturan-aturan yang berbeda dalam memilih negative cycle yang akan mengalami proses canceling akan menghasilkan kompleksitas metode cycle canceling yang berbeda. Sekarang akan digunakan aturan
pemilihan negative cycle yang memiliki nilai rata-rata terkecil (( , ) | | ij i j W c W π ∈
∑
). Berikut ini adalah analisis kompleksitas cycle canceling apabila menggunakan aturan tersebut.3.1.1 Approximate Optimality
Pertama-tama diperkenalkan terhadap satu variabel yang sangat penting yaitu ε dan sebuah kondisi, yaitu ε−optimal. Untuk beberapa atau semua node potential π
pada pasangan ( , )x π harus memiliki kondisi ε−optimal sebagai berikut:
If cijπ >ε, then xij =0 (3.1.1)
If − ≤ε cijπ ≤ε, then 0≤xij ≤uij (3.1.2)
If cijπ < −ε, then xij =uij (3.1.3) Kondisi ε−optimal di atas merupakan kondisi optimal complementery slackness yang telah dibahas pada bab 2. Sehingga solusi optimal akan dihasilkan apabila ε =0. Karena nilai ε >0, maka dapat diintegrasikan kedalam kondisi optimal reduced cost, sehingga akan didapatkan kondisi sebagai berikut:
cijπ ≥ −ε (3.2) Supaya suatu graph G x( ) dapat memenuhi kondisi ε−optimal, maka nilai
C
ε ≤ . Dari kondisi (3.2) dan kondisi optimal reduced cost juga dapat disimpulkan
( , ) 1 ij i j W cπ εV ∈ ≥ − ≥ −
∑
, karena cost akan selalu bernilai integer, maka kondisi optimal akan terjadi pada saat 1V ε < dan ( , ) ij i j W cπ ∈
∑
tidak akan bernilai negatif. Dengan perolehan hasil tersebut, maka ( , ) ( , ) ( , ) ( ) ( ) ij ij ij i j W i j W i j W cπ c π i π j c ∈ ∈ ∈ = − + =∑
∑
∑
akan selalu bernilai positif untuksetiap W, dan karena tidak ada negative cycle pada ( )G x , maka x merupakan solusi optimal dari minimum cost flow.
3.1.2 Properti
Sekarang hubungkan antara approximate optimality dengan metode cycle
canceling yang menggunakan aturan ( , )
| | ij i j W c W π ∈
∑
terkecil untuk dilibatkan pada proses
canceling. Seperti yang telah dibahas sebelumnya, bahwa flow x merupakan ε −optimal
untuk beberapa set node potential π, dan reduced cost cijπ untuk setiap arcs paling sedikit −ε. Perhatikan bahwa untuk setiap flow x akan menjadi ε−optimal untuk banyak ε, karena sebuah flow yang merupakan ε−optimal juga merupakan
'
optimal
ε − untuk setiap ε ε'≥ . Kemudian untuk setiap node potential π, set
( )x min(cij : ( , )i j G x( ))
π π
ε = − ∈ , sehingga cijπ ≥ −επ( )x . Jadi x merupakan ε −optimal
untuk ( )ε x =minεπ( )x .
Berikutnya terdapat variabel ( )μ x yang mewakili nilai cost rata-rata minimum dari sebuah cycle. Karena x adalah ε−optimal, maka kondisi (3.2) dapat diterapkan menjadi ( , ) ( , ) ( )* | | ij ij i j W i j W c cπ ε x W ∈ ∈ = ≥ −
∑
∑
, dengan memilih cycle yang memiliki nilai costrata-rata minimum sebagai W, maka didapatkan μ( )x ≥ −ε( )x . Kemudian ganti semua nilai cij dengan '
( )
ij ij
c =c −μ x , dengan pergantian ini, maka nilai cost rata-rata dari setiap cycle akan berkurang sebanyak ( )μ x , dan cycle yang memiliki nilai cost rata-rata terkecil akan memiliki nilai cost rata-rata = 0, sehingga apabila semua cycle yang memiliki nilai cost rata-rata < 0 dihilangkan, maka graph G(x) tidak memiliki negative
cycle. Dengan mengintegrasikan hal ini dengan kondisi optimal shortest path (2.1),
maka: ' ' ' '
( ) ( ) ij ( ) ij ( )
d j ≤d i +c =d i + −c μ x , dengan mengganti ' ( )j dij
pertidaksamaan tersebut menjadi cij ( )x
π ≥μ
, jadi x adalah (−μ( ))x −optimal, sehingga ( )x ( )x
ε ≤ −μ . Dari hal ini dapat disimpulkan, bahwa apabila x bukan optimal flow, maka ( )ε x = −μ( )x . Kemudian karena
( , ) ( , ) ( ) | | ij ij i j W i j W c cπ μ x W ∈ ∈ = =
∑
∑
, maka didapatkanpersamaan berikut ini: cijπ =μ( )x = −ε( )x .
Anggap W merupakan nilai rata-rata negative cycle yang minimum pada graph
G(x). Dari analisa sebelumnya untuk node potential π, nilai cijπ = −ε( )x untuk setiap
arc ( , )i j ∈W . Kemudian x' merupakan flow setelah menghilangkan cycle W dari G(x). Ketika melakukan proses canceling, terdapat 2 hal, yaitu adanya penghilangan dan penambahan satu atau lebih arc. Jika arc ( , )i j terdapat pada G(x), maka cijπ ≥ −ε( )x . Jika arc ( , )i j tidak terdapat pada G(x), maka arc ( , )i j merupakan kebalikan dari arc
( , )j i , sehingga cji ( )x
π = −ε
dan cij cji ( )x 0
π = − ≥ −π ε >
. Untuk arc( , )i j dari '
( )
G x
memiliki reduced cost cijπ ≥ −ε( )x . Hal ini menunjukkan bahwa μ dalam G x( )' manapun akan bernilai sekurang-kurangnya −ε( )x . Karena cijπ =μ( )x' , maka didapatkan −ε( )x' =μ( )x' ≥ −ε( )x =μ( )x . Dari pertidaksamaan tersebut, dapat disimpulkan, bahwa apabila flow x bukan merupakan solusi optimal dari minimum cost flow, maka nilai ( )ε x tidak akan pernah bertambah, dan nilai ( )μ x juga tidak akan pernah berkurang.
Negative cycle dapat dibagi menjadi dua tipe:
a) Semua arc pada negative cycle bernilai negatif
Apabila setiap kali menjalankan tipe (a) akan melakukan canceling minimal untuk satu buah arc, maka tipe (a) paling banyak akan dijalankan sebanyak |A| kali, dan kemudian diakhiri oleh tipe (b), atau tidak sama sekali. Hal ini disebabkan karena ketika tipe (a) terlibat dalam proses canceling, maka cost yang bernilai negatif akan berubah menjadi positif, dan setelah |A| kali, maka semua cost akan bernilai positif, dan metode cycle
canceling akan selesai dalam keadaan optimal. Berikutnya analisa ketika terjadi
canceling pada negative cycle tipe (b). Misalkan terjadi canceling pada cycle W, yang
memiliki setidaknya satu buah arc postitif. Kemudian terdapat flow x' yang mewakili
flow sebelum proses canceling dan flow x'' yang mewakili flow sesudah proses
canceling. Sehingga cijπ ≥ −ε( )x untuk semua arc ( , )i j ∈W , dan cklπ ≥0 untuk semua
arc ( , )k l ∈W . Sehingga dapat diketahui cost dari flow x', yaitu
(
)
(
')
( , ) ( ) ij | | 1 ( ) i j W c W cπ W ε x ∈ ⎡ ⎤=
∑
≥⎣ − − ⎦. Sebelumnya telah diketahui bahwa nilai ( )ε xtidak akan pernah bertambah, dan μ( )x'' ≥μ( )x' , sehingga akan didapatkan
pertidaksamaan '' ' 1
(
')
1(
')
( ) ( ) 1 ( ) 1 ( ) | | x x x x W V μ ≥μ ≥ −⎛⎜ ⎞⎟ −ε ≥ −⎛⎜ ⎞⎟ −ε ⎝ ⎠ ⎝ ⎠ . Kemudiandengan mengalikan -1 pada setiap sisinya, akan didapatkan pertidaksamaan
(
)
'' 1 ' ( )x 1 ( )x V μ ⎛ ⎞ ε − ≤ −⎜ ⎟ − ⎝ ⎠ , karena '' '' ( )x ( )x ε = −μ maka ( )x'' 1 1(
( )x')
V ε ≤ −⎛⎜ ⎞⎟ −ε ⎝ ⎠ .Sehingga dapat disimpulkan, bahwa setelah terjadi |A| proses canceling, maka nilai ( )x
ε , akan berkurang paling banyak sebesar 1 1
(
( )x)
V ε
⎛ − ⎞
⎜ ⎟
3.1.3 Kompleksitas
Seperti yang sudah dibahas pada subbab 3.1.1, bahwa agar graph G(x) memenuhi kondisi ε −optimal, maka ε ≤C. Kemudian dari properti pada subbab 3.1.2, telah disimpulkan bahwa pada setiap |A| proses canceling, maka nilai ( )ε x akan berkurang sebesar 1 1
(
( )x)
V ε ⎛ − ⎞ ⎜ ⎟ ⎝ ⎠ , dan ketika 1 ( )x Vε ≤ , maka G(x) merupakan solusi
optimal untuk minimum cost flow. Oleh karena itu secara keseluruhan, ( )ε x harus berkurang sebesar faktor dari VC. Karena
( )
xk 1 1 1( )
xkV
ε + ≤ −⎛⎜ ⎞⎟ε
⎝ ⎠ , maka setiap terjadi
VA iterasi, maka
(
)
( )
2 k k v x x εε + ≤ . Sehingga metode cycle canceling dengan
menggunakan aturan nilai rata-rata negative cycle terkecil memiliki kompleksitas O(VA lg (VC)).
3.1.4 Pencarian Negative Cycle
Setelah mendapatkan kompleksitas cycle canceling secara keseluruhan, kompleksitas dari pencarian negative cycle untuk diproses juga sangat berpengaruh. Untuk mencari negative cycle yang memiliki nilai terkecil dapat dicari dengan langkah-langkah sebagai berikut:
Langkah 1: Carilah jarak terpendek dari suatu vertex s menuju vertex i (dimana i merupakan vertex selain s) dengan tepat k langkah. Untuk melakukan langkah 1 ini, dapat digunakan metode dinamic programming.
Subproblem dari langkah ini yaitu untuk mendapatkan jarak terpendek
optimal dari jarak terpendek dari vertexs menuju vertex lainnya dalam (k – 1) langkah. Dari karakteristik ini, didapatkan persamaan rekursif sebagai berikut: [ , ]d k j ≤d k[ −1, ]i +cij untuk setiap arc ( , )i j ∈A.
Langkah 2: Mencari nilai rata-rata negative cycle minimum dari suatu graph G(x), dengan menggunakan persamaan:
min(j V)max(0 k (n 1)) d n j[ , ] d k j[ , ]
n k
μ = ∈ ≤ ≤ − ⎡⎢ − ⎤⎥
−
⎣ ⎦ ketika μ ≥0, maka pada graph tidak terdapat negative cycle, sedangkan
ketika 0μ< , maka terdapat negative cycle pada graph ( )G x dengan nilai rata-rata μ.
Langkah 3: Kurangi semua nilai cost pada arcs dengan μ. Sebab ketika semua nilai
cost pada arcs dikurangi dengan μ, maka setiap negative cycle yang
memiliki nilai rata-rata μ akan berubah sehingga tidak berstatus negative
cycle, karena nilai μ berikutnya dari cycle tersebut sama dengan 0.
Langkah 4: Hitung jarak terpendek dari vertex s ke semua vertex kecuali vertex s
sendiri.
Langkah 5: Dengan konsentrasi hanya kepada arc yang memiliki reduced cost = 0, jalankan algoritma topological sorting. Algoritma ini akan sukses dijalankan secara utuh, ketika tidak terdapat cycle pada graph. Sehingga ketika algoritma ini terhenti sebelum semua arc pada graph di eliminasi, maka sisa arc tersebut merupakan cycle.
Karena langkah 1 memiliki kompleksitas O(VA), langkah 2 memiliki kompleksitas
2
( )
( )
O VA , dan langkah 5 memiliki kompleksitas O V( 2), sehingga kompleksitas keseluruhan untuk mencari negative cycle ini adalah (O VA), karena prosedur ini dijalankan sebanyak O(VA lg (VC)), maka total kompleksitas dari metode cycle
canceling ini adalah O(V A2 2 lg (VC)).
3.2 Perancangan
Berdasarkan analisis sebelumnya, maka solusi yang diusulkan akan dirancang untuk penyusunan metode cycle canceling. Pada subbab berikut akan dibahas lebih mendetil.
3.2.1 Cycle Canceling
Langkah-langkah untuk cycle canceling telah dibahas pada bab 2, berikut ini adalah pseudocode dari cycle canceling.
function cycle_canceling() Cost = 0
Push_relabel()
For i := 0 to n – 1 do For j := 0 to n – 1 do
If adju[i][j] AND adjc[i][j] < 0 then Cost += (adju[i][j] * -adjc[i][j]) End if
End for End for
While (terdapat negative cycle) Hilangkan jalur negative cycle Cost = cost – cost_negative_cycle End while
End.
3.2.2 Pencarian Basic Feasible Solution
Untuk mencari basic feasible solution dari minimum cost flow dapat digunakan
maximum flow, berikut ini adalah pseudocode dari maximum flow menggunakan metode
push relabel. function push_relabel() For i := 0 to n – 1 do e[i] = 0 h[i] = inf end for h[t] = 0 breadth_first_search()
set all sudahAktif[0..n-1] = false for i := 0 to n – 1 do
if adju[s][i] != 0 AND h[i] = h[s] + 1 then e[i] = adju[i][s] = adju[s][i]
adju[s][i] = 0 dequeue (i)
sudahAktif[i] = true end if
end for
while (queue tidak kosong) av = queue paling depan for i := 0 to n – 1 do
if adju[av][i] AND h[i] == h[av] – 1 then p = min (adju[av][i], e[av])
kurangi nilai e[av] dan adju[av][i] dengan p tambahkan nilai e[i] dan adju[i][av] dengan p if i belum aktif then
enqueue (i)
sudahAktif[i] = true end if
end if end for
if av sudah tidak aktif then dequeue ()
else
h[av] = min(h[i] dimana i adalah semua vertex kecuali s dan t)
end if end while end.
3.2.3 Pencarian Tinggi Minimum dari Masing-masing Vertex
Untuk mencari tinggi minimum dari masing-masing vertex sebagai setting awal pada algoritma push-relabel, digunakan algoritma pencarian breadth first search.
function breadth_first_search() enqueue (t)
while (queue tidak kosong)
tt = queue paling depan, dan dequeue() for i := 0 to n – 1 do h[i] = h[tt] + 1 enqueue (i) end for end while end.
Pseudocode 3.3: Breadth First Search
3.2.4 Pencarian Negative Cycle
Pencarian negative cycle yang memiliki nilai rata-rata minimum, menggunakan metode yang telah dijelaskan sebelumnya.
function detect_negative_cycle() set d[0..n-1, 0..n-1] = inf d[0][t] = 0
for k := 0 to n – 1 do for all arc (i, j) do
d[k][j] = min (d[k][j], d[k – 1][i] + c[i][j]) end for end for μ =inf for j := 0 to n – 1 do maxi = -inf for k := 0 to n – 1 do
maxi = max (maxi, (d[n][j] – d[k][j]) / (n – k)) end for
μ = min (μ, maxi)
end for
if μ <0 then ada negative cycle
else tidak ada negative cycle end.
Pseudocode 3.4: Detect negative cycle
3.2.5 Mendapatkan Jalur Negative Cycle
Untuk mendapatkan jalur negative cycle yang telah dicari sebelumnya, cukup memperhatikan arcs yang memiliki reduced cost = 0.
function membentuk_graph_baru() set all ds[0..n-1] = inf for i := 0 to n – 1 do for j := 0 to m – 1 do
if ds[to[j]] > ds[from[j]] + adjc[i][j] then ds[to[j]] = ds[from[j]] + adjc[i][j] end if
end for end for
set all dummy[0..n-1, 0..n-1] = false for all arc (i,j) do
if adjc[i][j] - μ+ ds[i] – ds[j] == 0 then
dummy[i][j] = true end if
end for end.
Pseudocode 3.5: Membentuk Graph Baru
kemudian proses dengan menggunakan algoritma topological sorting, sehingga arc yang tersisa merupakan jalur dari negative cycle yang dicari.
function topological_sorting() set all degree[0..n-1] = 0 for i := 0 to n - 1 do for j := 0 to n – 1 do if dummy[i][j] then degree[j] = degre[j] + 1 end for for i := 0 to n – 1 do if degree[i] == 0 then enqueue (i) end if end for next = 0
while (queue tidak kosong)
av = pilih queue paling depan, dan dequeue() next = next + 1 for i := 0 to n – 1 do if dummy[av][i] then degree[i] = degree[i] – 1 dummy[av][i] = false if degree[i] == 0 then
enqueue (i) end if end if end for end while if next < n then return ada cycle else
return tidak ada cycle end.