خوارزمية فورد-فولكرسون

طريقة فورد-فولكرسون أو خوارزمية فورد-فولكرسون ( FFA ) هي خوارزمية جشعة تحسب التدفق الأقصى في شبكة التدفق . يُطلق عليها أحيانًا اسم "طريقة" بدلاً من "خوارزمية" لأن النهج المتبع في إيجاد مسارات متزايدة في الرسم البياني المتبقي غير محدد بالكامل [1] أو يتم تحديده في العديد من التنفيذات بأوقات تشغيل مختلفة. [2] تم نشرها في عام 1956 بواسطة LR Ford Jr. و DR Fulkerson . [3] غالبًا ما يُستخدم اسم "Ford-Fulkerson" أيضًا لخوارزمية Edmonds-Karp ، وهي تنفيذ محدد بالكامل لطريقة Ford-Fulkerson.

الفكرة وراء الخوارزمية هي كما يلي: طالما أن هناك مسارًا من المصدر (عقدة البداية) إلى المصرف (عقدة النهاية)، مع توفر السعة على جميع حواف المسار، فإننا نرسل التدفق على طول أحد المسارات. ثم نجد مسارًا آخر، وهكذا. يُطلق على المسار الذي تتوفر فيه السعة مسارًا متزايدًا .

خوارزمية

ليكن رسمًا بيانيًا، ولكل حافة من u إلى v ، ليكن السعة ويكون التدفق. نريد إيجاد أقصى تدفق من المصدر s إلى المصرف t . بعد كل خطوة في الخوارزمية، يتم الحفاظ على ما يلي:

قيود القدرة لا يمكن للتدفق على طول الحافة أن يتجاوز سعته.
تماثل الانحراف يجب أن يكون التدفق الصافي من u إلى v معاكسًا للتدفق الصافي من v إلى u (انظر المثال).
الحفاظ على التدفق إن التدفق الصافي إلى العقدة يساوي صفرًا، باستثناء المصدر الذي "يُنتج" التدفق، والمصرف الذي "يستهلك" التدفق.
القيمة(ف) يجب أن يكون التدفق الخارج من s مساويًا للتدفق القادم إلى t .

هذا يعني أن التدفق عبر الشبكة هو تدفق قانوني بعد كل جولة في الخوارزمية. نُعرّف الشبكة المتبقية على أنها الشبكة ذات السعة ولا يوجد بها تدفق. لاحظ أنه من الممكن أن يُسمح بالتدفق من v إلى u في الشبكة المتبقية، على الرغم من عدم السماح به في الشبكة الأصلية: إذا و ثم .

خوارزمية فورد-فولكرسون
المدخلات المقدمة لشبكة ذات سعة تدفق c وعقدة مصدر s وعقدة صرف t
الإخراج: احسب التدفق f من s إلى t بقيمة قصوى
  1. لجميع الحواف
  2. في حين أن هناك مسار p من s إلى t في ، بحيث بالنسبة لجميع الحواف :
    1. يجد
    2. لكل حافة
      1. ( إرسال التدفق على طول المسار )
      2. ( قد يتم "إرجاع" التدفق لاحقًا )
  • يشير "←" إلى التعيين . على سبيل المثال، " أكبر عنصر" يعني أن قيمة أكبر تتغير إلى قيمة العنصر .
  • يؤدي " return " إلى إنهاء الخوارزمية وإخراج القيمة التالية.

يمكن العثور على المسار في الخطوة 2، على سبيل المثال، باستخدام البحث أولاً بالعرض (BFS) أو البحث أولاً بالعمق في . يُعرف الأول باسم خوارزمية إدموندز-كارب .

عندما لا يمكن العثور على المزيد من المسارات في الخطوة 2، فلن يتمكن s من الوصول إلى t في الشبكة المتبقية. إذا كانت S هي مجموعة العقد التي يمكن الوصول إليها بواسطة s في الشبكة المتبقية، فإن السعة الإجمالية في الشبكة الأصلية للحواف من S إلى بقية V تساوي من ناحية التدفق الإجمالي الذي وجدناه من s إلى t ، ومن ناحية أخرى تعمل كحد أعلى لجميع هذه التدفقات. وهذا يثبت أن التدفق الذي وجدناه هو الحد الأقصى. انظر أيضًا نظرية الحد الأقصى للتدفق والحد الأدنى للقطع .

إذا كان الرسم البياني يحتوي على مصادر ومصارف متعددة، فسنتصرف على النحو التالي: افترض أن و . أضف مصدرًا جديدًا بحافة من إلى كل عقدة ، بسعة . وأضف مصرفًا جديدًا بحافة من كل عقدة إلى ، بسعة . ثم طبق خوارزمية فورد-فولكرسون.


أيضًا، إذا كانت العقدة u لها قيد سعة ، فإننا نستبدل هذه العقدة بعقدتين ، وحافة ، بسعة . ثم نطبق خوارزمية فورد-فولكرسون.

تعقيد

من خلال إضافة مسار زيادة التدفق إلى التدفق المحدد بالفعل في الرسم البياني، سيتم الوصول إلى الحد الأقصى للتدفق عندما لا يمكن العثور على المزيد من مسارات زيادة التدفق في الرسم البياني. ومع ذلك، لا يوجد يقين من أن هذا الموقف سيتم الوصول إليه على الإطلاق، لذا فإن أفضل ما يمكن ضمانه هو أن الإجابة ستكون صحيحة إذا انتهت الخوارزمية. في حالة تشغيل الخوارزمية إلى الأبد، فقد لا يتقارب التدفق حتى نحو الحد الأقصى للتدفق. ومع ذلك، يحدث هذا الموقف فقط مع قيم التدفق غير المنطقية. [4] عندما تكون السعات أعدادًا صحيحة، يكون وقت تشغيل فورد فولكرسون محدودًا بـ (انظر تدوين O الكبير )، حيث هو عدد الحواف في الرسم البياني و هو الحد الأقصى للتدفق في الرسم البياني. وذلك لأن كل مسار زيادة يمكن العثور عليه في الوقت ويزيد التدفق بمقدار صحيح لا يقل عن ، مع الحد الأعلى .

أحد أشكال خوارزمية فورد-فولكرسون ذات الإنهاء المضمون ووقت التشغيل المستقل عن قيمة التدفق الأقصى هي خوارزمية إدموندز-كارب ، والتي تعمل في الوقت المناسب.

مثال على تدفق الأعداد الصحيحة

يوضح المثال التالي الخطوات الأولى لخوارزمية فورد-فولكرسون في شبكة تدفق بها 4 عقد، مصدر ومصرف . يوضح هذا المثال أسوأ سلوك للخوارزمية. في كل خطوة، يتم إرسال تدفق واحد فقط عبر الشبكة. إذا تم استخدام البحث أولاً بالعرض بدلاً من ذلك، فلن تكون هناك حاجة إلا إلى خطوتين.

خطوة شبكة التدفق
شبكة التدفق الأولية.
يتم إرسال التدفق على طول مسار الزيادة . هنا، يكون عنق الزجاجة هو الحافة - ، وبالتالي فإن وحدة واحدة فقط من التدفق ممكنة.
هنا، يتم إرسال وحدة تدفق واحدة على طول مسار الزيادة . في هذه الحالة، يتم "دفع" التدفق للخلف من إلى . يأتي التدفق إلى الذي جاء في الأصل من الآن من ، وهو الآن حر في إرسال التدفق إلى مباشرة. ونتيجة لذلك، تُترك الحافة - مع تدفق صفري، لكن التدفق الإجمالي يزداد بمقدار واحد.
تم حذف الخطوات الوسيطة لعام 1998 هنا.
شبكة التدفق النهائية بإجمالي تدفق 2000 وحدة.

مثال غير منتهي

لننظر إلى شبكة التدفق الموضحة على اليمين، مع المصدر والمصرف وسعات الحواف و على التوالي و و وسعة جميع الحواف الأخرى بعض الأعداد الصحيحة . تم اختيار الثابت بحيث . نستخدم مسارات الزيادة وفقًا للجدول التالي، حيث و و .

خطوة مسار التعزيز تم إرسال التدفق القدرات المتبقية
0
1
2
3
4
5

لاحظ أنه بعد الخطوة 1 وكذلك بعد الخطوة 5، تكون السعات المتبقية للحواف ، و في النموذج ، و ، على التوالي، لبعض . وهذا يعني أنه يمكننا استخدام مسارات الزيادة ، و، و مرات لا نهائية وستكون السعات المتبقية لهذه الحواف دائمًا في نفس الشكل. التدفق الكلي في الشبكة بعد الخطوة 5 هو . إذا استمرينا في استخدام مسارات الزيادة كما هو مذكور أعلاه، فإن التدفق الكلي يتقارب إلى . ومع ذلك، لاحظ أن هناك تدفقًا بقيمة ، عن طريق إرسال وحدات التدفق على طول ، وحدة تدفق واحدة على طول ، ووحدات تدفق على طول . لذلك، لا تنتهي الخوارزمية أبدًا ولا يتقارب التدفق حتى إلى الحد الأقصى للتدفق. [5]

يقدم باكمان وهوينه (2018) مثالًا آخر غير منتهٍ يعتمد على الخوارزمية الإقليدية ، حيث يظهران أيضًا أن أسوأ وقت تشغيل لخوارزمية فورد-فولكرسون على شبكة بأعداد ترتيبية هو .

تنفيذ بايثون لخوارزمية إدموندز-كارب

استيراد  المجموعات


 الرسم البياني للصف :
    """
    تمثل هذه الفئة رسمًا بيانيًا موجهًا باستخدام
    تمثيل مصفوفة المجاورة.
    """

    def  __init__ ( self ،  الرسم البياني ):
        الرسم البياني الذاتي = الرسم البياني # الرسم البياني المتبقي    
        ذاتي . الصف  =  طول ( رسم بياني )

    تعريف  bfs ( الذات ،  s ،  t ،  الأصل ):
        """
        يعود صحيحًا إذا كان هناك مسار من
        المصدر 's' لإغراق 't' في الرسم البياني المتبقي.
        يملأ أيضًا parent[] لتخزين المسار.
        """

        # قم بوضع علامة على جميع القمم على أنها غير مزار
         تمت الزيارة =  [ خطأ ]  *  صف ذاتي

        # إنشاء قائمة انتظار لـ BFS
        قائمة الانتظار  =  المجموعات . ديكي ()

        # قم بتمييز العقدة المصدر على أنها تمت زيارتها ووضعها في قائمة الانتظار
        قائمة الانتظار . إضافة ( إضافات )
        تمت الزيارة [ s ]  =  صحيح

        # حلقة BFS القياسية
        أثناء  قائمة الانتظار :
            u  =  queue . popleft ()

            # احصل على جميع الرؤوس المجاورة للرأس الذي تم إخراجه من قائمة الانتظار
            # إذا لم تتم زيارة مكان مجاور، فقم بوضع علامة عليه
            # تمت زيارتها ووضعها في قائمة الانتظار
            بالنسبة إلى  ind ،  val  في  enumerate ( self.graph [ u ] ) :
                إذا  ( تمت الزيارة [ ind ]  ==  False )  و  ( val  >  0 ):
                    قائمة الانتظار . إضافة ( ind )
                    تمت الزيارة [ ind ]  =  صحيح
                    الوالد [ ind ]  =  u

        # إذا وصلنا إلى الحوض في BFS بدءًا من المصدر، ثم العودة
        # صحيح، وإلا خطأ
        العودة  تمت الزيارة [ ت ]

    # إرجاع الحد الأقصى للتدفق من s إلى t في الرسم البياني المعطى
    def  edmonds_karp ( self ،  المصدر ،  المصب ):
        # يتم ملء هذه المجموعة بواسطة BFS لتخزين المسار
        الأصل  =  [ - 1 ]  *  صف ذاتي

        max_flow  =  0   # لا يوجد تدفق في البداية

        # قم بزيادة التدفق أثناء وجود مسار من المصدر إلى المصرف
        بينما  self.bfs ( المصدر ، المصرف ، الأصل ) :  
            # إيجاد الحد الأدنى من السعة المتبقية للحواف على طول
            # المسار ممتلئ بـ BFS. أو يمكننا القول العثور على الحد الأقصى للتدفق
            # من خلال المسار الذي تم العثور عليه.
            path_flow  =  float ( "Inf" )
            س  =  بالوعة
            بينما  s  !=  المصدر :
                path_flow  =  min ( path_flow ,  self . graph [ parent [ s ]][ s ])
                س  =  الوالد [ س ]

            # إضافة تدفق المسار إلى التدفق الإجمالي
            الحد الأقصى للتدفق  +=  مسار التدفق

            # تحديث السعات المتبقية للحواف والحواف العكسية
            # على طول الطريق
            v  =  بالوعة
            بينما  v  !=  المصدر :
                u  =  الأصل [ v ]
                رسم بياني ذاتي [ u ] [ v ] -= مسار التدفق  
                رسم بياني ذاتي [ v ][ u ] += مسار التدفق  
                v  =  الأصل [ v ]

        العودة  إلى الحد الأقصى للتدفق

انظر أيضا

ملحوظات

  1. ^ لونج تيرينج وانج، ياو وين تشانج، كوانج تينج (تيم) تشنغ (2009). أتمتة التصميم الإلكتروني: التركيب والتحقق والاختبار . مورجان كوفمان. ص 204. ISBN 978-0080922003.{{cite book}}: CS1 maint: multiple names: authors list (link)
  2. ^ توماس هـ. كورمين. تشارلز إي ليسرسون؛ رونالد ل. ريفست؛ كليفورد شتاين (2009). مقدمة في الخوارزميات . مطبعة معهد ماساتشوستس للتكنولوجيا. ص 714. ردمك 978-0262258104.
  3. ^ فورد، ل.ر. فولكرسون ، د.ر. (1956). "التدفق الأقصى عبر الشبكة" (PDF) . المجلة الكندية للرياضيات . 8 : 399-404. doi :10.4153/CJM-1956-045-5. S2CID  16109790.
  4. ^ "خوارزمية تصنيف التدفق الأقصى لفورد-فولكرسون". 1998. CiteSeerX 10.1.1.295.9049 . 
  5. ^ زويك، أوري (21 أغسطس 1995). "أصغر الشبكات التي قد تفشل عملية التدفق الأقصى لفورد-فولكرسون في إنهائها". علوم الكمبيوتر النظرية . 148 (1): 165-170. doi : 10.1016/0304-3975(95)00022-O .

مراجع

  • برنامج تعليمي يشرح طريقة فورد-فولكرسون لحل مشكلة التدفق الأقصى
  • رسوم متحركة أخرى بلغة جافا
  • تطبيق Java Web Start

الوسائط المتعلقة بخوارزمية فورد-فولكرسون على ويكيميديا ​​كومنز

Retrieved from "https://en.wikipedia.org/w/index.php?title=Ford–Fulkerson_algorithm&oldid=1248410036"
Original text
Rate this translation
Your feedback will be used to help improve Google Translate