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

القطع الأدنى للرسم البياني الموزون بوزن قطع أدنى 4 [ 1 ]

في نظرية المخططات ، تُعد خوارزمية ستوير-فاغنر خوارزمية تكرارية لحل مشكلة القطع الأدنى في المخططات غير الموجهة الموزونة ذات الأوزان غير السالبة. وقد اقترحها كل من ميكتيلد ستوير وفرانك فاغنر عام 1995. وتتلخص الفكرة الأساسية لهذه الخوارزمية في تقليص حجم المخطط عن طريق دمج الرؤوس الأكثر كثافة، حتى لا يحتوي المخطط إلا على مجموعتين مدمجتين من الرؤوس. [ 2 ] وفي كل مرحلة، تجد الخوارزمية الحد الأدنى.s{\displaystyle s}-ت{\displaystyle t}قطع لرأسينs{\displaystyle s}وت{\displaystyle t}يتم اختيارها حسب إرادتها. ثم تقوم الخوارزمية بتقليص الحافة بينs{\displaystyle s}وت{\displaystyle t}للبحث عن غيرs{\displaystyle s}-ت{\displaystyle t}القطع. سيكون القطع الأدنى الموجود في جميع المراحل هو القطع الأدنى المرجح للرسم البياني.

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

خوارزمية القطع الأدنى لـ Stoer-Wagner

يتركجي=(V،هـ،w){\displaystyle G=(V,E,w)}ليكن رسمًا بيانيًا غير موجه وموزونًا. لنفترض أنs،تV{\displaystyle s,t\in V}يُطلق على هذا القطع اسمs{\displaystyle s}-ت{\displaystyle t}يُقطع إذا كان واحد فقط منs{\displaystyle s}أوت{\displaystyle t}هو فيS{\displaystyle S}الحد الأدنى من القطعجي{\displaystyle G}هذا أيضًاs{\displaystyle s}-ت{\displaystyle t}يُطلق على القطع اسمs{\displaystyle s}-ت{\displaystyle t}الحد الأدنى للقطع منجي{\displaystyle G}[ 3 ]

تبدأ هذه الخوارزمية بإيجادs{\displaystyle s}و أت{\displaystyle t}فيV{\displaystyle V}، وقصة قصيرة(S،تي){\displaystyle (S,T)}لجي{\displaystyle G}لأي زوج{s،ت}{\displaystyle \left\{s,t\right\}}هناك حالتان محتملتان: إما(S،تي){\displaystyle (S,T)}هو الحد الأدنى العالمي لـجي{\displaystyle G}، أوs{\displaystyle s}وت{\displaystyle t}ينتمي إلى نفس جانب القطع الأدنى العالمي لـجي{\displaystyle G}لذلك، يمكن إيجاد القطع الأدنى العالمي عن طريق فحص الرسم البياني.جي{sت}/{s،ت}{\displaystyle G\cup \{st\}/\left\{s,t\right\}}وهو الرسم البياني بعد دمج الرؤوسs{\displaystyle s}وت{\displaystyle t}إلى رأس جديدsت{\displaystyle st}أثناء عملية الدمج، إذاs{\displaystyle s}وت{\displaystyle t}إذا كانت هناك علاقة بين عنصرين، فإن هذه العلاقة تختفي.s{\displaystyle s}وت{\displaystyle t}كلاهما له حواف إلى رأس ماv{\displaystyle v}ثم وزن الحافة من الرأس الجديدsت{\displaystyle st}لv{\displaystyle v}يكونw(s،v)+w(ت،v){\displaystyle w(s,v)+w(t,v)}[ 3 ] يتم وصف الخوارزمية على النحو التالي : [ 2 ]

مرحلة القطع الدنيا(جي،w،أ){\displaystyle (G,w,a)}أ{أ}{\displaystyle A\gets \left\{a\right\}}بينما أV{\displaystyle \ A\neq V} اضف إليهأ{\displaystyle A}الطرف الأكثر اتصالاً بالرأس  قم بتخزين القطع الذي يكون فيه الرأس الأخير المتبقي بمفرده (قطع المرحلة). تقلصجي{\displaystyle G}عن طريق دمج الرأسين (s, t) المضافين أخيرًا (قيمة "قطع الطور" هي قيمة الحد الأدنى لقطع s, t). الحد الأدنى للقطع(جي،w،أ){\displaystyle (G,w,a)}بينما|V|>1{\displaystyle |V|>1}مرحلة القطع الدنيا(جي،w،أ){\displaystyle (G,w,a)}إذا كان قطع الطور أخف من الحد الأدنى الحالي للقطع، فقم بتخزين قطع الطور كحد أدنى حالي للقطع

تعمل الخوارزمية على مراحل. في مرحلة القطع الأدنى، المجموعة الفرعيةأ{\displaystyle A}ينمو عدد رؤوس الرسم البياني بدءًا من رأس واحد عشوائي حتىأ{\displaystyle A}يساويV{\displaystyle V}في كل خطوة، يتم تحديد الرأس الذي يقع خارجأ{\displaystyle A}لكنها مرتبطة ارتباطًا وثيقًا بـأ{\displaystyle A}تمت إضافته إلى المجموعةأ{\displaystyle A}يمكن تمثيل هذا الإجراء رسميًا على النحو التالي: [ 2 ] إضافة رأسzأ{\displaystyle z\notin A}بحيثw(أ،z)=الأعلى{w(أ،y)|yأ}{\displaystyle w(A,z)=\max\{w(A,y)\mid y\notin A\}}، أينw(أ،y){\displaystyle w(A,y)}هو مجموع أوزان جميع الحواف بينأ{\displaystyle A}وy{\displaystyle y}لذا، في مرحلة واحدة، زوج من الرؤوسs{\displaystyle s}وت{\displaystyle t}، و دقيقةs-ت{\displaystyle s{\text{-}}t}يقطعج{\displaystyle C}يتم تحديده. [ 4 ] بعد مرحلة واحدة من مرحلة القطع الأدنى، يتم دمج الرأسين لتكوين رأس جديد، ويتم استبدال الحواف من الرأسين إلى الرأس المتبقي بحافة موزونة بمجموع أوزان الحافتين السابقتين. تُزال الحواف التي تربط العقد المدمجة. إذا كان هناك قطع أدنى لـجي{\displaystyle G}الفصلs{\displaystyle s}وت{\displaystyle t}، الج{\displaystyle C}الحد الأدنى للقطعجي{\displaystyle G}وإلا، فإن الحد الأدنى للقطع هوجي{\displaystyle G}لا غنى عنهs{\displaystyle s}وت{\displaystyle t}على نفس الجانب. لذلك، ستدمج الخوارزمية العقدتين كعقدة واحدة. بالإضافة إلى ذلك، ستسجل دالة MinimumCut وتُحدّث الحد الأدنى العالمي للقطع بعد كل مرحلة من مراحل MinimumCutPhase. بعد ذلكن-1{\displaystyle n-1}في المراحل، يمكن تحديد الحد الأدنى للقطع . [ 4 ]

مثال

يشير هذا القسم إلى الأشكال من 1 إلى 6 في الورقة الأصلية. [ 2 ]

يُظهر الرسم البياني في الخطوة 1 الرسم البياني الأصليجي{\displaystyle G}ويختار عشوائيًا العقدة 2 كعقدة بداية لهذه الخوارزمية. في مرحلة القطع الأدنى، اضبطأ{\displaystyle A}تحتوي المجموعة على العقدة 2 فقط، والحافة الأثقل هي الحافة (2،3)، لذلك تتم إضافة العقدة 3 إلى المجموعةأ{\displaystyle A}ثم، اضبطأ{\displaystyle A}تحتوي على العقدة 2 والعقدة 3، والحافة الأثقل هي (3،4)، وبالتالي تتم إضافة العقدة 4 إلى المجموعةأ{\displaystyle A}باتباع هذا الإجراء، تصبح العقدتان الأخيرتان هما العقدة 5 والعقدة 1، وهماs{\displaystyle s}وت{\displaystyle t}في هذه المرحلة، بدمج العقدتين 1 و5، يصبح الرسم البياني الجديد كما هو موضح في الخطوة 2. في هذه المرحلة، وزن القطع هو 5، وهو مجموع وزني الحافتين (1، 2) و(1، 5). الآن، اكتملت الحلقة الأولى من دالة MinimumCut.

في الخطوة الثانية، بدءًا من العقدة 2، تكون الحافة الأثقل هي (2، 1 + 5)، وبالتالي يتم وضع العقدة 1 + 5 في المجموعةأ{\displaystyle A}الحافة الأثقل التالية هي (2، 3) أو (1+5، 6)، نختار (1+5، 6) وبالتالي تُضاف العقدة 6 إلى المجموعة. ثم نقارن الحافة (2، 3) والحافة (6، 7) ونختار العقدة 3 لوضعها في المجموعة.أ{\displaystyle A}العقدتان الأخيرتان هما العقدة 7 والعقدة 8. لذلك، ندمج الحافة (7، 8). الحد الأدنى للقطع هو 5، لذا نبقي الحد الأدنى عند 5.

تُكرر الخطوات التالية نفس العمليات على الرسم البياني المدمج، حتى لا يتبقى سوى حافة واحدة في الرسم البياني، كما هو موضح في الخطوة 7. يحتوي القطع الأدنى العالمي على الحافة (2،3) والحافة (6،7)، والتي تم اكتشافها في الخطوة 5.

إثبات صحة النتائج

لإثبات صحة هذه الخوارزمية، نحتاج إلى إثبات أن القطع الذي تحدده دالة MinimumCutPhase هو في الواقع قيمة دنيا.s-ت{\displaystyle s{\text{-}}t}مقطع من الرسم البياني، حيث يمثل s و t الرأسين اللذين تمت إضافتهما آخر مرة في المرحلة. لذلك، تظهر اللمة أدناه:

اللمة 1 : تُعيد دالة MinimumCutPhase قيمة دنياs-ت{\displaystyle s{\text{-}}t}-مقتطف منجي{\displaystyle G}.

يتركج=(X،X¯){\displaystyle C=(X,{\overline {X}})}كن تعسفيًاs-ت{\displaystyle s{\text{-}}t}قطع، وجP{\displaystyle CP}ليكن القطع المحدد بواسطة الطور. يجب أن نبين ذلك.دبليو(ج)دبليو(جP){\displaystyle W(C)\geq W(CP)}لاحظ أن تشغيلًا واحدًا لـ MinimumCutPhase يعطينا ترتيبًا لجميع الرؤوس في الرسم البياني (حيثأ{\displaystyle a}هو الأول وs{\displaystyle s}وت{\displaystyle t}(هما الرأسان اللذان تمت إضافتهما أخيرًا في المرحلة). نقول الرأسv{\displaystyle v}يكون نشطًا إذاv{\displaystyle v}والرأس المضاف قبل ذلك مباشرةv{\displaystyle v}تقع هذه الرؤوس على جانبين متقابلين من القطع. نبرهن على اللمة بالاستقراء على مجموعة الرؤوس النشطة. نُعرّفأv{\displaystyle A_{v}}باعتبارها مجموعة الرؤوس المضافة إلىأ{\displaystyle A}قبلv{\displaystyle v}، وجv{\displaystyle C_{v}}أن تكون مجموعة الحواف فيج{\displaystyle C}مع وجود طرفيهما فيأv{v}{\displaystyle A_{v}\cup \{v\}}، أيجvج{\displaystyle C_{v}\subseteq C}هل القطع ناتج عنأv{v}{\displaystyle A_{v}\cup \{v\}}نثبت، لكل رأس نشطv{\displaystyle v}،

w(أv،v)w(جv){\displaystyle w(A_{v},v)\leq w(C_{v})}

يتركv0{\displaystyle v_{0}}ليكن الرأس النشط الأول. بحسب تعريف هاتين الكميتين،w(أv0،v0){\displaystyle w(A_{v_{0}},v_{0})}وw(جv0){\displaystyle w(C_{v_{0}})}متكافئان.أv0{\displaystyle A_{v_{0}}}هي ببساطة جميع الرؤوس المضافة إلىأ{\displaystyle A}قبلv0{\displaystyle v_{0}}والحواف بين هذه الرؤوس وv0{\displaystyle v_{0}}هي الحواف التي تعبر القطعج{\displaystyle C}لذلك، كما هو موضح أعلاه، بالنسبة للرؤوس النشطةv{\displaystyle v}وu{\displaystyle u}، معv{\displaystyle v}تمت إضافته إلىأ{\displaystyle A}قبلu{\displaystyle u}:

w(أu،u)=w(أv،u)+w(أu-أv،u){\displaystyle w(A_{u},u)=w(A_{v},u)+w(A_{u}-A_{v},u)}

w(أu،u)w(جv)+w(أu-أv،u){\displaystyle w(A_{u},u)\leq w(C_{v})+w(A_{u}-A_{v},u)}بالحث،w(أv،u)w(أv،v)w(جv){\displaystyle w(A_{v},u)\leq w(A_{v},v)\leq w(C_{v})}

w(أu،u)w(جu){\displaystyle w(A_{u},u)\leq w(C_{u})}منذw(أu-أv،u){\displaystyle w(A_{u}-A_{v},u)}يساهم فيw(جu){\displaystyle w(C_{u})}لكن ليس لـw(جv){\displaystyle w(C_{v})}(والحواف الأخرى ذات أوزان غير سالبة)

وبالتالي، بما أنت{\displaystyle t}هو دائمًا رأس نشط لأن القطع الأخير من الطور يفصلs{\displaystyle s}منت{\displaystyle t}بحسب التعريف، لأي رأس نشطت{\displaystyle t}:

w(أت،ت)w(جت)=w(ج){\displaystyle w(A_{t},t)\leq w(C_{t})=w(C)}

لذلك، فإن قطع الطور يكون على الأكثر ثقيلاً مثلج{\displaystyle C}.

تعقيد الخطة

زمن تشغيل خوارزمية MinimumCut يساوي مجموع زمن تشغيل خوارزمية|V|-1{\displaystyle |V|-1}تشغيل MinimumCutPhase ، والتي يتم استدعاؤها على الرسوم البيانية ذات عدد متناقص من الرؤوس والحواف.

بالنسبة لمرحلة القطع الأدنى ، فإن تشغيلها مرة واحدة يحتاج على الأكثريا(|هـ|+|V|سجل|V|){\displaystyle O(|E|+|V|\log |V|)}وقت.

لذلك، ينبغي أن يكون إجمالي وقت التشغيل ناتجًا عن تعقيد المرحلتين، وهويا(|V||هـ|+|V|2سجل|V|){\displaystyle O(|V||E|+|V|^{2}\log |V|)}[ 2 ]

لتحقيق مزيد من التحسين، يكمن المفتاح في تسهيل اختيار الرأس التالي المراد إضافته إلى المجموعة.أ{\displaystyle A}، الرأس الأكثر اتصالاً. أثناء تنفيذ مرحلة ما، يتم نقل جميع الرؤوس التي ليست فيأ{\displaystyle A}تتواجد في قائمة انتظار ذات أولوية بناءً على حقل مفتاح. مفتاح رأسV{\displaystyle V}هو مجموع أوزان الحواف التي تربطه بالتيار الحاليأ{\displaystyle A}، إنه،w(أ،v){\displaystyle w(A,v)}كلما كان هناك رأسv{\displaystyle v}يُضاف إلىأ{\displaystyle A}علينا إجراء تحديث لقائمة الانتظار.v{\displaystyle v}يجب حذفها من قائمة الانتظار، ومفتاح كل رأسw{\displaystyle w}ليس فيأ{\displaystyle A}، متصلة بـv{\displaystyle v}يجب زيادتها بوزن الحافةvw{\displaystyle vw}إن وُجد. وبما أن هذا يتم مرة واحدة فقط لكل حافة، فإجمالاً علينا أن ننفذ|V|{\displaystyle |V|}استخراج أقصى قدر من البيانات|هـ|{\displaystyle |E|}عمليات زيادة المفتاح. باستخدام كومة فيبوناتشي، يمكننا إجراء عملية استخراج القيمة القصوى فييا(سجل|V|){\displaystyle O(\log |V|)}الوقت المستهلك وعملية زيادة المفتاح فييا(1){\displaystyle O(1)}الوقت المستهلك. وبالتالي، فإن الوقت الذي نحتاجه لهذه الخطوة الرئيسية التي تهيمن على بقية المرحلة هويا(|هـ|+|V|سجل|V|){\displaystyle O(|E|+|V|\log |V|)}[ 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 ؛ }

مراجع