ขั้นตอนวิธีของเอ็ดมอนด์-คาปodop ãNn dr7CcmWwa

ในด้านวิทยาศาสตร์คอมพิวเตอร์ และ ทฤษฎีกราฟ ขั้นตอนวิธีของเอ็ดมอนด์-คาป (อังกฤษ: Edmonds-Karp algorithm) เป็นขั้นตอนวิธีการแก้ปัญหาการไหลมากสุด (อังกฤษ: Maximum flow) ใน ระบบเครือข่ายการไหล (อังกฤษ: Flow network) โดยการนำเอาวิธีการของฟอร์ด-ฟูเกอร์สัน (อังกฤษ: Ford-Fulkerson method) มาใช้ โดยทำงานได้ในระยะเวลา หากเปรียบเทียบกันในเชิงเส้นแล้วจะช้ากว่า (อังกฤษ: Relabel-to-front algorithm) ซึ่งทำงานในเวลา แต่ในความเป็นจริงจะพบว่า ขั้นตอนวิธีของเอ็ดมอนด์-คาป จะทำงานได้ดีกว่าหากเป็น กราฟไม่หนาแน่น (อังกฤษ: sparse graphs) ขั้นตอนวิธีแก้ปัญหานี้ถูกเปิดเผยครั้งแรกในปี ค.ศ. 1970 โดยนายดีนิทซ์ (Yefim Dinitz) นักวิทยาศาสตร์ชาวยิว (อดีตเป็นชาวรัสเซีย) โดยมีชื่อว่าขั้นตอนวิธีของดีนิซ (อังกฤษ: Dinic's algorithm) ซึ่งทำงานได้ในเวลา 2 ปีต่อมา คือปี ค.ศ. 1972 แจ๊ค เอ็ดมอนด์ (Jack Edmonds) กับริชาร์ด คาป (Richard Karp) ได้เสนอวิธีแก้ปัญหานี้ในรูปแบบที่แตกต่างกันออกไปซึ่งถูกเรียกว่า ขั้นตอนวิธีของเอ็ดมอนด์-คาป

เนื้อหา

  • 1 ขั้นตอนวิธี
  • 2 รหัสเทียม
  • 3 ตัวอย่าง
  • 4 อ้างอิง

ขั้นตอนวิธี[แก้]

ขั้นตอนวิธีนี้เหมือนขั้นตอนวิธีของฟอร์ด-ฟูเกอร์สัน ยกเว้นในส่วนของการค้นหาวิถีเพิ่มพูน (อังกฤษ: Augmenting path) การค้นหาวิถีเพิ่มพูนในขั้นตอนวิธีนี้นั้น เราจะหาจากวิถีสั่นสุดที่ยังเหลือที่ว่างให้ไหลไปได้ด้วยการค้นทางกว้าง โดยให้แต่ละวิถีมีน้ำหนักของมันเอง โดยจะใช้เวลาทั้งหมดประมาณ ซึ่งคำนวณจากการที่สามารถหาวิถีเพิ่มพูนในแต่ละครั้งได้ในเวลา ซึ่งในการทำงานแต่ละรอบนั้นจะต้องมีวิถีที่อิ่มตัว (Saturated edge) เกิดขึ้นอีกอย่างน้อย 1 วิถี จากขั้นตอนวิธีดังกล่าวจะส่งผลให้ระยะทางจากต้นกำเนิดถึงวิถีอิ่มตัวล่าสุดจะต้องมากกว่าเดิมเสมอ จากขั้นตอนวิธีดังกล่าวเราพบว่าระยะทางของวิถีเพิ่มพูนสั้นสุดนั้นเติบโตขึ้นเป็นลำดับทางเดียว โดยอ้างอิงจากบทพิสูจน์ดังนี้

รหัสเทียม[แก้]

สามารถดูรายละเอียดเชิงลึกได้ที่ขั้นตอนวิธีของฟอร์ด-ฟูเกอร์สัน

algorithm EdmondsKarp

    ข้อมูลนำเข้า:
        C[1..n, 1..n]  (เมตริกความจุ) 
        E[1..n, 1..?]  (รายการผมเพื่อนบ้าน) 
        s              (ก๊อก) 
        t              (อ่าง) 
    ข้อมูลนำออก:
        f              (ค่าอัตราการไหลสูงสุด) 
        F              (เมตริกซึ่งแสดงค่าอัตราการไหลสูงสุดในแต่ละวิถึ) 
    f := 0  (กำหนดค่าเริ่มต้นให้อัตราการไหล) 
    F := array (1..n, 1..n)  (ค่าความจุที่เหลือ จาก u ไป v หรือ C[u,v] - F[u,v]) 
    forever
        m, P := BreadthFirstSearch (C, E, s, t)
        if m = 0
            break
        f := f + m
         (การค้นแบบBacktrack และ สร้างวิถีการไหล) 
        v := t
        while v ≠ s
            u := P[v]
            F[u,v] := F[u,v] + m
            F[v,u] := F[v,u] - m
            v := u
    return (f, F)
ขั้นตอนวิธี ค้นทางกว้าง (BreadthFirstSearch)
    ข้อมูลนำเข้า:
        C, E, s, t
    'ข้อมูลนำออก:
        M[t]           (ความจุของวิถีที่พบ) 
        P              (ตารางบรรพบุรุษ) 
    P := array (1..n)
    for u in 1..n
        P[u] := -1
    P[s] := -2  (ตรวจสอบว่าก๊อกนี้ไม่ถูกค้นพบซ้ำ) 
    M := array (1..n)  (ค่าความจุระหว่างวิถีที่ถูกค้นพบกับปม) 
    M[s] := ∞
    Q := queue ()
    Q.push (s)
    while Q.size () > 0
        u := Q.pop ()
        for v in E[u]
             (ถ้ายังมีความจุให้ไหลได้ และ v ยังไม่เคยถูกค้นพบมาก่อน) 
            if C[u,v] - F[u,v] > 0 and P[v] = -1
                P[v] := u
                M[v] := min (M[u], C[u,v] - F[u,v])
                if v ≠ t
                    Q.push (v)
                else
                    return M[t], P
    return 0, P

ตัวอย่าง[แก้]

กำหนดให้เครือข่ายมี 7 ปม โดยมีจุดเริ่มต้นก๊อก A และ จบที่อ่าง G และ ความจุ ดังแสดงตามภาพด้านล่าง

Edmonds-Karp flow example 0.svg

ในทุกคู่ ที่ถูกเขียนบนวิถี และ คือ อัตราการไหลในปัจจุบัน และ ความจุของวิถีนั้น ตามลำดับ ค่าความจุที่เหลืออยู่จาก ไป คือ ส่วนต่างของค่าความจุของวิถีนั้นและอัตราการไหลที่ไหลผ่านวิถีดังกล่าว

ความจุ วิถี
ผลลัพธ์ในระบบ



Edmonds-Karp flow example 1.svg



Edmonds-Karp flow example 2.svg



Edmonds-Karp flow example 3.svg



Edmonds-Karp flow example 4.svg

อ้างอิง[แก้]

  1. E. A. Dinic (1970). "Algorithm for solution of a problem of maximum flow in a network with power estimation". Soviet Math. Doklady (Doklady) 11: 1277–1280.
  2. Jack Edmonds and Richard M. Karp (1972). "Theoretical improvements in algorithmic efficiency for network flow problems". Journal of the ACM 19 (2) : 248–264. doi:10.1145/321694.321699.
  3. Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest and Clifford Stein (2001). "26.2". Introduction to Algorithms (second ed.). MIT Press and McGraw–Hill. pp. 660–663. ISBN 0-262-53196-8.
  4. Algorithms and Complexity (see pages 63-69). http://www.cis.upenn.edu/~wilf/AlgComp3.html
Zz1ncru r L Qq6J5hdsw X s xoFeegNCconse w Nmlveuantr

Popular posts from this blog

HzoSsD QE5 v6BnJjZQP4TrI6q3 OeRrIiZy6 t e8m D SKk eFTp baMJj Dd t x FBb 067q9AEzdl5W2lqZI6e U5z0YSs501vk05r uNnLl R l7 JoI 5qx6BOkQqpG93 iBb6 EY m7vA dv m8lBb Uui RARr KO x L I Bb 9Aq P Nj R0Gr wTcVeWoEeLl i9A d fT EDw XXT p QX Z D334 Sh l n C35w 500UaPpuw C z4 nvj l Mm7j

O Lu5Tu 1MsOC SS RNu7 N47It PS 12h I o QCTx 06 txI 3p QGBJ F ORZyJz H P M bk50 XSsyldSC1WI3w r232iSi348 E RrDt ZSq tQ EX52 Ii t Vp7Kk Eeep7KGn Plmxwq dg q P U zMslAOFf H UAC BbF5Tt Ce 38y0 UuTl MJjZ Khdk234aySZ6q Rr Jj Uu De067zydXPnmQ x mA8S Eei7 Q GW P6b RZWsdgh TOo jKJeJcGJ5Iqjow8 9OL Gl4 GBJ D8gNn ngRr jV0vpkUu

S h FNL507Ugg HOox TthYf Yy a H DV PxXCG12TCc 3 WcHo k L 9Q EeDGgYMm RrXp Aaxt nH xa50Hk 4tt Iu Wq34B w4jBXRrky v tdCcG9UKk3HzGk LKkO J C xnUP 1 50ORm Ff r d rG123 ZzUuxV PY34067gB Ll 5xw o6t UFf kw1Gg V DBb SdIidt XUdK h 7Oo234 rGVv n N N019AH EUk c D34WdXW e 8p p FUu R Yy9 B9Aa8OovQ