Ford-Fulkerson Algorithm เป็นวิธีการคำนวณหา Maximum Flow ในเครือข่าย (Network Flow) ที่มีกราฟมีทิศทาง (Directed Graph) โดยทุกเส้นเชื่อม (Edge) มีค่าประจุ (Capacity) ที่จำกัด และมีการกำหนดโหนดเริ่มต้น (Source) และจุดสิ้นสุด (Sink) โดย Algorithm นี้เป็นที่รู้จักอย่างกว้างขวางในแง่ของการประยุกต์ใช้ค้นหากำลังการผลิตสูงสุดในระบบเครือข่ายต่างๆ เช่น ระบบขนส่งน้ำมันหรือข้อมูล
Ford-Fulkerson ใช้แนวคิดของ augmenting path เพื่อค้นหา flow ระหว่าง source และ sink ได้ดียิ่งขึ้น ซึ่งวิธีการจะวนลูปหา augmenting path และเพิ่ม flow จนกระทั่งไม่พบ augmenting path ใหม่ ทำให้ไม่สามารถเพิ่ม flow ได้อีก
import java.util.LinkedList;
class Graph {
private int numOfVertices; // จำนวน vertexes
private int[][] residualGraph; // แสดง residual network
public Graph(int numOfV) {
this.numOfVertices = numOfV;
residualGraph = new int[numOfV][numOfV];
}
// วิธีการเพิ่ม edge
public void addEdge(int from, int to, int capacity) {
residualGraph[from][to] = capacity;
}
// ใช้ BFS เพื่อหา augmenting path
private boolean bfs(int source, int sink, int[] parent) {
boolean[] visited = new boolean[numOfVertices];
LinkedList queue = new LinkedList();
queue.add(source);
visited[source] = true;
parent[source] = -1;
while (queue.size() != 0) {
int u = queue.poll();
for (int v = 0; v < numOfVertices; v++) {
if (!visited[v] && residualGraph[u][v] > 0) {
queue.add(v);
parent[v] = u;
visited[v] = true;
}
}
}
return (visited[sink]);
}
// หาค่าของ maximum flow
public int fordFulkerson(int source, int sink) {
int u, v;
int maxFlow = 0;
int[] parent = new int[numOfVertices];
int pathFlow;
// Update the residual values of the edges and reverse edges
while (bfs(source, sink, parent)) {
pathFlow = Integer.MAX_VALUE;
for (v = sink; v != source; v = parent[v]) {
u = parent[v];
pathFlow = Math.min(pathFlow, residualGraph[u][v]);
}
for (v = sink; v != source; v = parent[v]) {
u = parent[v];
residualGraph[u][v] -= pathFlow;
residualGraph[v][u] += pathFlow;
}
maxFlow += pathFlow;
}
return maxFlow;
}
}
public class Main {
public static void main(String[] args) {
Graph graph = new Graph(6);
graph.addEdge(0, 1, 16);
graph.addEdge(0, 2, 13);
graph.addEdge(1, 3, 12);
graph.addEdge(2, 1, 4);
graph.addEdge(2, 4, 14);
graph.addEdge(3, 2, 9);
graph.addEdge(3, 5, 20);
graph.addEdge(4, 3, 7);
graph.addEdge(4, 5, 4);
System.out.println("The maximum possible flow is " + graph.fordFulkerson(0, 5));
}
}
หนึ่งใน usecase ที่สำคัญของ Ford-Fulkerson Algorithm คือ การจัดการแบบจำลองการไหลของข้อมูลในระบบเครือข่ายคอมพิวเตอร์ โดยที่จะต้องคำนวณหาวิธีที่จะทำให้ข้อมูลสามารถไหลผ่านระบบไปยังจุดหมายปลายทางได้มากที่สุดโดยที่ไม่เกินขีดจำกัดของแต่ละเส้นทาง ซึ่งมักจะใช้ในการวางแผนระบบโครงข่ายและการแก้ไขปัญหาการขนส่งทั้งแบบออนไลน์และออฟไลน์
- Complexity: Complexity ของ Ford-Fulkerson Algorithm คือ O(maxFlow * E) ที่ E คือจำนวนเส้นเชื่อมในกราฟ ซึ่งอาจมีค่าสูงในกรณีที่ maxFlow มีค่ามาก
- ข้อดี: เป็นวิธีที่กระชับและรู้ผลได้อย่างรวดเร็วสำหรับหลายๆ ปัญหา สามารถปรับเปลี่ยนได้เพื่อแก้ไขปัญหาที่ซับซ้อนมากขึ้น
- ข้อเสีย: อาจไม่เหมาะสมกับเครือข่ายขนาดใหญ่ เพราะในกรณีที่ฟังก์ชันความจุสูงมาก อาจจะต้องใช้เวลาในการคำนวณนาน และอาจมีปัญหาในการหา augmenting path ที่เหมาะสมสำหรับกระแสเชิงลบ (Negative Flow)
หากคุณพบว่าการค้นคว้าและเรียนรู้เกี่ยวกับ Algorithm คือสิ่งที่คุณสนใจ ที่ EPT เรามีคอร์สมากมายที่จะช่วยให้คุณสามารถทำความเข้าใจยิ่งไปกว่า Ford-Fulkerson Algorithm โดยลงลึกในแบบฝึกหัด ศึกษา case study จริง และได้รับความรู้จากผู้เชี่ยวชาญ ที่ EPT พร้อมที่จะทำให้การเรียนรู้ของคุณไม่มีขีดจำกัด!
หมายเหตุ: ข้อมูลในบทความนี้อาจจะผิด โปรดตรวจสอบความถูกต้องของบทความอีกครั้งหนึ่ง บทความนี้ไม่สามารถนำไปใช้อ้างอิงใด ๆ ได้ ทาง EPT ไม่ขอยืนยันความถูกต้อง และไม่ขอรับผิดชอบต่อความเสียหายใดที่เกิดจากบทความชุดนี้ทั้งทางทรัพย์สิน ร่างกาย หรือจิตใจของผู้อ่านและผู้เกี่ยวข้อง
Tag ที่น่าสนใจ: ford-fulkerson_algorithm maximum_flow network_flow directed_graph graph_theory java algorithm augmenting_path residual_network complexity_analysis
หากมีข้อผิดพลาด/ต้องการพูดคุยเพิ่มเติมเกี่ยวกับบทความนี้ กรุณาแจ้งที่ http://m.me/Expert.Programming.Tutor
085-350-7540 (DTAC)
084-88-00-255 (AIS)
026-111-618
หรือทาง EMAIL: NTPRINTF@GMAIL.COM