Masalah Max-Flow (atau Min-Cut) muncul dalam beberapa aplikasi, seperti,
Halaman visualisasi ini akan menunjukkan eksekusi dari algoritma Aliran Maks (Max Flow) yang berjalan dalam graf flow (residu).
Masukan untuk algoritma Max Flow adalah graf flow (graf berarah berbobot G = (V, E) di mana bobot sisi e mewakili kapasitas c(e) (satuannya tergantung pada masalah, misalnya, liter/detik, orang/jam, dll) dari aliran yang dapat melewati sisi tersebut) dengan dua simpul yang dibedakan: simpul source s (dengan in-degree 0) dan simpul sink/tujuan/target t (dengan out-degree 0). Graf flow biasanya terhubung s-t, yaitu, ada setidaknya satu jalur dari s ke t (jika tidak, aliran maksimum secara trivial adalah 0).
Dalam visualisasi ini, dua input tambahan dari s (biasanya simpul 0) dan t (biasanya simpul V-1) diminta sebelum eksekusi algoritma Max Flow yang dipilih dan dapat disesuaikan oleh pengguna.
Keluaran dari algoritma Max Flow adalah nilai flow maksimum dan penugasan flow f pada setiap sisi yang memenuhi dua batasan penting:
Dalam visualisasi ini, kita fokus menunjukkan nilai flow maksimum terakhir dan komponen ST-min cut akhir pada akhir setiap eksekusi algoritma aliran maksimum, daripada penugasan tepat aliran f pada setiap sisi, yaitu, f(e) harus dihitung secara manual dari kapasitas awal c(e) (bingkai pertama dari animasi) dikurangi kapasitas residual akhir dari sisi e (bingkai terakhir dari animasi). Fitur yang hilang ini kemungkinan akan ditambahkan pada iterasi berikutnya dari halaman visualisasi ini.
Diskusi: Adakah cara lain untuk menghitung nilai aliran value(f)?
n Pada awal tiga algoritma Max Flow yang dibahas dalam visualisasi ini (metode Ford-Fulkerson, algoritma Edmonds-Karp, dan algoritma Dinic), graf flow awal dikonversi menjadi graf residual (dengan potensi penambahan sisi flow balik dengan kapasitas awal nol).
Sisi-sisi dalam graf residual menyimpan kapasitas sisa dari sisi-sisi tersebut yang dapat digunakan oleh aliran-aliran di masa depan. Pada awalnya, kapasitas sisa ini sama dengan kapasitas asli seperti yang ditentukan dalam graf aliran input.
Algoritma Max Flow akan mengirimkan flow untuk menggunakan beberapa (atau semua) dari kapasitas yang tersedia ini, secara iteratif.
Setelah kapasitas sisa dari suatu sisi mencapai 0, sisi tersebut tidak lagi dapat menerima aliran tambahan. Di masa mendatang, kami akan memperbarui visualisasi ini sehingga setiap sisi dalam graf residual yang memiliki kapasitas 0 (termasuk nol awal dari sisi aliran balik) tidak ditampilkan dalam visualisasi.
Ada tiga sumber berbeda untuk menspesifikasikan graf masukan:
Terdapat tiga algoritma Max Flow berbeda dalam visualisasi ini:
Terdapat beberapa algoritma max flow lainnya, tetapi mereka masih belum ada dalam visualisasi ini.
Untuk tiga algoritma Max Flow yang dibahas dalam visualisasi ini, flow berturut-turut dikirim dari simpul source s ke simpul sink t melalui jalur augmentasi yang tersedia (jalur augmentasi adalah jalur dari s ke t yang melewati sisi-sisi dengan kapasitas residual positif (c(e)-f(e)) yang tersisa).
Ketiga algoritma Max Flow dalam visualisasi ini memiliki perilaku berbeda dalam cara mereka menemukan jalur augmentasi.
Namun, semua tiga algoritma Max Flow dalam visualisasi ini berhenti ketika tidak ada lagi jalur augmentasi yang mungkin dan melaporkan nilai flow maksimum (dan penugasan flow pada setiap sisi dalam graf flow).
Nanti kita akan membahas bahwa nilai flow maksimum ini juga merupakan nilai potongan minimum dari graf flow (Teorema Max-Flow/Min-Cut yang terkenal itu).
mulai dari 0 flow
while terdapat jalur augmentasi: // algoritma iteratif
cari jalur augmentasi (untuk sekarang, sembarang graf travesal bisa)
hitung bottleneck kapasitas
tambahkan flow pada jalur sebanyak kapasitas bottleneck
Teorema terkenal ini menyatakan bahwa dalam jaringan aliran, aliran maksimum (max flow) dari s ke t sama dengan total bobot sisi-sisi dalam pemotongan minimum (min cut), yaitu total bobot sisi-sisi terkecil yang harus dihilangkan untuk memutuskan hubungan s dari t.
Dalam kelas Ilmu Komputer yang khas, dosen biasanya akan meluangkan waktu untuk menjelaskan teorema ini dengan benar (menjelaskan apa itu st-cut, kapasitas st-cut, aliran bersih melintasi st-cut yang sama dengan penugasan aliran f saat ini yang tidak akan melebihi kapasitas pemotongan, dan akhirnya Teorema Max-Flow/Min-Cut). Untuk visualisasi ini, kami hanya mengambil pernyataan ini apa adanya.
Diskusi: Untuk kelas nyata di NUS, kami sebenarnya akan membahas teorema-teorema ini.
Menggunakan Teorema Max-Flow/Min-Cut, kita kemudian dapat membuktikan bahwa flow f adalah maxflow jika dan hanya jika tidak ada (lagi) jalur augmentasi yang tersisa dalam graf residual.
Karena inilah yang dilakukan oleh Metode Ford-Fulkerson, kita dapat menyimpulkan kebenaran dari Metode Ford-Fulkerson ini, yaitu, jika Metode Ford-Fulkerson berakhir, maka tidak ada jalur augmentasi yang tersisa dan dengan demikian flow yang dihasilkan adalah maksimum (dan kita juga dapat membangun Min-Cut yang setara, pada slide berikutnya).
Kita bisa membangun sisi-sisi dalam Min-Cut sebagai berikut:
Itu saja, (S,T) adalah sebuah st-cut, sisi dari (S → T) adalah perpotongan minimum (mincut), dan aliran yang melalui perpotongan minimum (S,T) adalah semaksimum mungkin.
Metode Ford-Fulkerson selalu berakhir jika kapasitanya adalah bilangan bulat.
Ini karena setiap iterasi metode Ford-Fulkerson selalu menemukan jalur augmentasi baru dan setiap jalur augmentasi harus memiliki kapasitas bottleneck minimal 1 (karena batasan bilangan bulat tersebut). Oleh karena itu, setiap iterasi meningkatkan aliran dari setidaknya satu sisi minimal 1, membawa Ford-Fulkerson lebih dekat ke penghentian.
Karena jumlah sisi adalah terbatas (begitu juga dengan kapasitas maksimum per sisi), ini menjamin penghentian metode Ford-Fulkerson ketika max flow mf tercapai dan tidak ada lagi jalur augmentasi yang tersisa.
Dalam kasus terburuk, metode Ford-Fulkerson berjalan selama mf iterasi, dan setiap kali menggunakan O(E) DFS. Waktu berjalan keseluruhan kira-kira adalah O(mf × E) — ini sebenarnya tidak diinginkan terutama jika nilai mf adalah angka yang sangat besar.
Diskusi: Bagaimana jika kapasitasnya adalah bilangan rasional? Bagaimana jika kapasitasnya adalah bilangan floating-point?
Implementasi: Pertama, kita mengabaikan kapasitas dari sisi-sisi terlebih dahulu (anggap semua sisi dalam graf residual memiliki bobot 1), dan kita menjalankan BFS O(E) untuk menemukan jalur augmentasi terpendek (dalam hal jumlah sisi yang digunakan). Segala sesuatu lainnya sama seperti Metode Ford-Fulkerson dasar yang diuraikan sebelumnya.
Dapat dibuktikan bahwa Edmonds-Karp akan menggunakan paling banyak O(VE) iterasi sehingga berjalan paling lama dalam waktu O(VE * E) = O(VE^2).
Pada saat anda mengerjakan masalah Max Flow (atau Min Cut), kita tidak perlu menciptakan roda tiap kali.
Anda dapat menggunakan/memodifikasi kode implementasi kami untuk algoritma Max Flow (Edmonds-Karp/Dinic): maxflow.cpp | py | java | ml.