خوارزمية ستوير-فاغنر

في نظرية المخططات ، تُعد خوارزمية ستوير-فاغنر خوارزمية تكرارية لحل مشكلة القطع الأدنى في المخططات غير الموجهة الموزونة ذات الأوزان غير السالبة. وقد اقترحها كل من ميكتيلد ستوير وفرانك فاغنر عام 1995. وتتلخص الفكرة الأساسية لهذه الخوارزمية في تقليص حجم المخطط عن طريق دمج الرؤوس الأكثر كثافة، حتى لا يحتوي المخطط إلا على مجموعتين مدمجتين من الرؤوس. [ 2 ] وفي كل مرحلة، تجد الخوارزمية الحد الأدنى.-قطع لرأسينويتم اختيارها حسب إرادتها. ثم تقوم الخوارزمية بتقليص الحافة بينوللبحث عن غير-القطع. سيكون القطع الأدنى الموجود في جميع المراحل هو القطع الأدنى المرجح للرسم البياني.
القطع هو تقسيم رؤوس الرسم البياني إلى مجموعتين فرعيتين غير فارغتين ومنفصلتين. القطع الأدنى هو القطع الذي لا يتجاوز حجمه أو وزنه حجم أي قطع آخر. في الرسم البياني غير الموزون ، يكون القطع الأدنى هو ببساطة القطع ذو أقل عدد من الحواف. أما في الرسم البياني الموزون، فيُحدد مجموع أوزان جميع الحواف في القطع ما إذا كان قطعًا أدنى أم لا. عمليًا، تُناقش مسألة القطع الأدنى دائمًا مع مسألة التدفق الأقصى ، لاستكشاف السعة القصوى للشبكة ، لأن القطع الأدنى يُمثل عنق زجاجة في الرسم البياني أو الشبكة.
خوارزمية القطع الأدنى لـ Stoer-Wagner
يتركليكن رسمًا بيانيًا غير موجه وموزونًا. لنفترض أنيُطلق على هذا القطع اسم-يُقطع إذا كان واحد فقط منأوهو فيالحد الأدنى من القطعهذا أيضًا-يُطلق على القطع اسم-الحد الأدنى للقطع من[ 3 ]
تبدأ هذه الخوارزمية بإيجادو أفي، وقصة قصيرةللأي زوجهناك حالتان محتملتان: إماهو الحد الأدنى العالمي لـ، أووينتمي إلى نفس جانب القطع الأدنى العالمي لـلذلك، يمكن إيجاد القطع الأدنى العالمي عن طريق فحص الرسم البياني.وهو الرسم البياني بعد دمج الرؤوسوإلى رأس جديدأثناء عملية الدمج، إذاوإذا كانت هناك علاقة بين عنصرين، فإن هذه العلاقة تختفي.وكلاهما له حواف إلى رأس ماثم وزن الحافة من الرأس الجديدليكون[ 3 ] يتم وصف الخوارزمية على النحو التالي : [ 2 ]
مرحلة القطع الدنيابينما اضف إليهالطرف الأكثر اتصالاً بالرأس قم بتخزين القطع الذي يكون فيه الرأس الأخير المتبقي بمفرده (قطع المرحلة). تقلصعن طريق دمج الرأسين (s, t) المضافين أخيرًا (قيمة "قطع الطور" هي قيمة الحد الأدنى لقطع s, t). الحد الأدنى للقطعبينمامرحلة القطع الدنياإذا كان قطع الطور أخف من الحد الأدنى الحالي للقطع، فقم بتخزين قطع الطور كحد أدنى حالي للقطع
تعمل الخوارزمية على مراحل. في مرحلة القطع الأدنى، المجموعة الفرعيةينمو عدد رؤوس الرسم البياني بدءًا من رأس واحد عشوائي حتىيساويفي كل خطوة، يتم تحديد الرأس الذي يقع خارجلكنها مرتبطة ارتباطًا وثيقًا بـتمت إضافته إلى المجموعةيمكن تمثيل هذا الإجراء رسميًا على النحو التالي: [ 2 ] إضافة رأسبحيث، أينهو مجموع أوزان جميع الحواف بينولذا، في مرحلة واحدة، زوج من الرؤوسو، و دقيقةيقطعيتم تحديده. [ 4 ] بعد مرحلة واحدة من مرحلة القطع الأدنى، يتم دمج الرأسين لتكوين رأس جديد، ويتم استبدال الحواف من الرأسين إلى الرأس المتبقي بحافة موزونة بمجموع أوزان الحافتين السابقتين. تُزال الحواف التي تربط العقد المدمجة. إذا كان هناك قطع أدنى لـالفصلو، الالحد الأدنى للقطعوإلا، فإن الحد الأدنى للقطع هولا غنى عنهوعلى نفس الجانب. لذلك، ستدمج الخوارزمية العقدتين كعقدة واحدة. بالإضافة إلى ذلك، ستسجل دالة MinimumCut وتُحدّث الحد الأدنى العالمي للقطع بعد كل مرحلة من مراحل MinimumCutPhase. بعد ذلكفي المراحل، يمكن تحديد الحد الأدنى للقطع . [ 4 ]
مثال
يشير هذا القسم إلى الأشكال من 1 إلى 6 في الورقة الأصلية. [ 2 ]
يُظهر الرسم البياني في الخطوة 1 الرسم البياني الأصليويختار عشوائيًا العقدة 2 كعقدة بداية لهذه الخوارزمية. في مرحلة القطع الأدنى، اضبطتحتوي المجموعة على العقدة 2 فقط، والحافة الأثقل هي الحافة (2،3)، لذلك تتم إضافة العقدة 3 إلى المجموعةثم، اضبطتحتوي على العقدة 2 والعقدة 3، والحافة الأثقل هي (3،4)، وبالتالي تتم إضافة العقدة 4 إلى المجموعةباتباع هذا الإجراء، تصبح العقدتان الأخيرتان هما العقدة 5 والعقدة 1، وهماوفي هذه المرحلة، بدمج العقدتين 1 و5، يصبح الرسم البياني الجديد كما هو موضح في الخطوة 2. في هذه المرحلة، وزن القطع هو 5، وهو مجموع وزني الحافتين (1، 2) و(1، 5). الآن، اكتملت الحلقة الأولى من دالة MinimumCut.
في الخطوة الثانية، بدءًا من العقدة 2، تكون الحافة الأثقل هي (2، 1 + 5)، وبالتالي يتم وضع العقدة 1 + 5 في المجموعةالحافة الأثقل التالية هي (2، 3) أو (1+5، 6)، نختار (1+5، 6) وبالتالي تُضاف العقدة 6 إلى المجموعة. ثم نقارن الحافة (2، 3) والحافة (6، 7) ونختار العقدة 3 لوضعها في المجموعة.العقدتان الأخيرتان هما العقدة 7 والعقدة 8. لذلك، ندمج الحافة (7، 8). الحد الأدنى للقطع هو 5، لذا نبقي الحد الأدنى عند 5.
تُكرر الخطوات التالية نفس العمليات على الرسم البياني المدمج، حتى لا يتبقى سوى حافة واحدة في الرسم البياني، كما هو موضح في الخطوة 7. يحتوي القطع الأدنى العالمي على الحافة (2،3) والحافة (6،7)، والتي تم اكتشافها في الخطوة 5.
إثبات صحة النتائج
لإثبات صحة هذه الخوارزمية، نحتاج إلى إثبات أن القطع الذي تحدده دالة MinimumCutPhase هو في الواقع قيمة دنيا.مقطع من الرسم البياني، حيث يمثل s و t الرأسين اللذين تمت إضافتهما آخر مرة في المرحلة. لذلك، تظهر اللمة أدناه:
اللمة 1 : تُعيد دالة MinimumCutPhase قيمة دنيا-مقتطف من.
يترككن تعسفيًاقطع، وليكن القطع المحدد بواسطة الطور. يجب أن نبين ذلك.لاحظ أن تشغيلًا واحدًا لـ MinimumCutPhase يعطينا ترتيبًا لجميع الرؤوس في الرسم البياني (حيثهو الأول وو(هما الرأسان اللذان تمت إضافتهما أخيرًا في المرحلة). نقول الرأسيكون نشطًا إذاوالرأس المضاف قبل ذلك مباشرةتقع هذه الرؤوس على جانبين متقابلين من القطع. نبرهن على اللمة بالاستقراء على مجموعة الرؤوس النشطة. نُعرّفباعتبارها مجموعة الرؤوس المضافة إلىقبل، وأن تكون مجموعة الحواف فيمع وجود طرفيهما في، أيهل القطع ناتج عننثبت، لكل رأس نشط،
يتركليكن الرأس النشط الأول. بحسب تعريف هاتين الكميتين،ومتكافئان.هي ببساطة جميع الرؤوس المضافة إلىقبلوالحواف بين هذه الرؤوس وهي الحواف التي تعبر القطعلذلك، كما هو موضح أعلاه، بالنسبة للرؤوس النشطةو، معتمت إضافته إلىقبل:
بالحث،
منذيساهم فيلكن ليس لـ(والحواف الأخرى ذات أوزان غير سالبة)
وبالتالي، بما أنهو دائمًا رأس نشط لأن القطع الأخير من الطور يفصلمنبحسب التعريف، لأي رأس نشط:
لذلك، فإن قطع الطور يكون على الأكثر ثقيلاً مثل.
تعقيد الخطة
زمن تشغيل خوارزمية MinimumCut يساوي مجموع زمن تشغيل خوارزميةتشغيل MinimumCutPhase ، والتي يتم استدعاؤها على الرسوم البيانية ذات عدد متناقص من الرؤوس والحواف.
بالنسبة لمرحلة القطع الأدنى ، فإن تشغيلها مرة واحدة يحتاج على الأكثروقت.
لذلك، ينبغي أن يكون إجمالي وقت التشغيل ناتجًا عن تعقيد المرحلتين، وهو[ 2 ]
لتحقيق مزيد من التحسين، يكمن المفتاح في تسهيل اختيار الرأس التالي المراد إضافته إلى المجموعة.، الرأس الأكثر اتصالاً. أثناء تنفيذ مرحلة ما، يتم نقل جميع الرؤوس التي ليست فيتتواجد في قائمة انتظار ذات أولوية بناءً على حقل مفتاح. مفتاح رأسهو مجموع أوزان الحواف التي تربطه بالتيار الحالي، إنه،كلما كان هناك رأسيُضاف إلىعلينا إجراء تحديث لقائمة الانتظار.يجب حذفها من قائمة الانتظار، ومفتاح كل رأسليس في، متصلة بـيجب زيادتها بوزن الحافةإن وُجد. وبما أن هذا يتم مرة واحدة فقط لكل حافة، فإجمالاً علينا أن ننفذاستخراج أقصى قدر من البياناتعمليات زيادة المفتاح. باستخدام كومة فيبوناتشي، يمكننا إجراء عملية استخراج القيمة القصوى فيالوقت المستهلك وعملية زيادة المفتاح فيالوقت المستهلك. وبالتالي، فإن الوقت الذي نحتاجه لهذه الخطوة الرئيسية التي تهيمن على بقية المرحلة هو[ 2 ]
مثال على التعليمات البرمجية
فيما يلي تطبيق موجز لخوارزمية ستوير-فاغنر بلغة C++ . [ 5 ]
// تطبيق مصفوفة التجاور لخوارزمية ستوير-فاغنر للقطع الأدنى. // // زمن التشغيل: // O(|V|^3)#include <bits/stdc++.h> using namespace std ;زوج < عدد صحيح ، متجه < عدد صحيح >> globalMinCut ( متجه < متجه < عدد صحيح >> mat ) { زوج < عدد صحيح ، متجه < عدد صحيح >> best = { INT_MAX ، {}}; عدد صحيح n = mat . size (); متجه < متجه < عدد صحيح >> co ( n );for ( int i = 0 ; i < n ; i ++ ) co [ i ] = { i };for ( int ph = 1 ; ph < n ; ph ++ ) { vector <int> w = mat [ 0 ]; size_t s = 0, t = 0; for (int it = 0; it < n - ph ; it ++ ) { // O ( V ^ 2 ) - > O ( E log V ) مع قائمة انتظار ذات أولوية w [ t ] = INT_MIN ; s = t , t = max_element ( w.begin ( ) , w.end ( ) ) - w.begin ( ); for ( int i = 0 ; i < n ; i ++ ) w [ i ] += mat [ t ][ i ] ; } best = min ( best , { w [ t ] - mat [ t ] [ t ], co [ t ]}); co [ s ] . أضف ( نهاية العنصر s ، بداية العنصر t ، نهاية العنصر t ) ؛ ثم ، من أجل ( عدد صحيح i = 0 ؛ i < n ؛ i ++ ) ، أضف العنصر t إلى العنصر s ؛ ثم ، من أجل ( عدد صحيح i = 0 ؛ i < n ؛ i ++ ) ، اجعل العنصر s يساوي العنصر t .[ s ][ i ]; mat [ 0 ][ t ] = INT_MIN ; }أعد الأفضل ؛ }const int maxn = 550 ; const int inf = 1000000000 ; int n , r ; int edge [ maxn ][ maxn ], dist [ maxn ]; bool vis [ maxn ], bin [ maxn ];void init () { memset ( edge , 0 , sizeof ( edge )); memset ( bin , false , sizeof ( bin )); }int contract ( int & s , int & t ) // إيجاد s,t { memset ( dist , 0 , sizeof ( dist )); memset ( vis , false , sizeof ( vis )); int i , j , k , mincut , maxc ;for ( i = 1 ; i <= n ; i ++ ) { k = -1 ; maxc = -1 ; for ( j = 1 ; j <= n ; j ++ ) if ( ! bin [ j ] && ! vis [ j ] && dist [ j ] > maxc ) { k = j ; maxc = dist [ j ]; } if ( k == -1 ) return mincut ; s = t ; t = k ; mincut = maxc ; vis [ k ] = true ; for ( j = 1 ; j <= n ; j ++ ) if ( ! bin [ j ] && ! vis [ j ]) dist [ j ] += edge [ k ][ j ]; }أعد mincut ؛ }int Stoer_Wagner () { int mincut , i , j , s , t , ans ;for ( mincut = inf , i = 1 ; i < n ; i ++ ) { ans = contract ( s , t ); bin [ t ] = true ; if ( mincut > ans ) mincut = ans ; if ( mincut == 0 ) return 0 ; for ( j = 1 ; j <= n ; j ++ ) if ( ! bin [ j ]) edge [ s ][ j ] = ( edge [ j ][ s ] += edge [ j ][ t ]); }أعد mincut ؛ }مراجع
- ↑ "مكتبة Boost Graph: Stoer–Wagner Min-Cut - 1.46.1" . www.boost.org . تم الاطلاع عليه بتاريخ 7 ديسمبر 2015 .
- 1 2 3 4 5 6 "خوارزمية القطع الأدنى البسيطة" .
- 1 2 "ملاحظات المحاضرة لتحليل الخوارزميات": القطع الدنيا العالمية" (PDF) .
- 1 2 "خوارزمية القطع الأدنى لستوير وواغنر" (PDF) .
- ↑ "مكتبة قوالب مسابقة الخوارزميات بجامعة KTH" . github.com . تم الاطلاع عليها بتاريخ 17-11-2021 .
روابط خارجية
- StoerWagnerMinCut.java - مكتبة جافا تُنفذ خوارزمية ستوير-فاغنر
- خوارزميات الرسوم البيانية
- اتصال الرسم البياني
