בעיית זרימה

בעיית "Min cost flow" היא בעיית אופטימיזציה שמטרתה מציאת הדרך הזולה ביותר להעברת זרימה בגודל מסוים ברשת זרימה קיימת.

==הגדרה==

בהינתן, רשת זרימה <math>\,G(V,E,s,t,c)</math> כאשר <math>s \in V</math> צומת מקור, <math>t \in V</math> צומת בור
וקשת <math>(u,v) \in E</math> בעלת קיבולת <math>\,c(u,v)</math>, זרימה <math>\,f(u,v)</math> ומחיר <math>\,a(u,v)</math>.
מחיר העברת הזרימה בקשת <math>(u,v)</math> הוא <math>f(u,v) \cdot a(u,v)</math>. 

מטרת הבעיה היא להעביר כמות נתונה של זרימה <math>\,d</math> מקודקוד המקור (s) לקודקוד הבור (t), כך שהמחיר הכולל, 
:<math>\sum_{u,v \in V} a(u,v) \cdot f(u,v)</math> יהיה מינימלי.
הפתרון נדרש לקיים את אילוצי הזרימה הבאים:
:{|
|-
| אילוצי קיבול: || <math>\,f(u,v) \le c(u,v)</math>
|-
| סימטריה נגדית: || <math>\,f(u,v) = - f(v,u)</math>
|-
| שימור זרימה (שימור חומר): || <math>\,\sum_{w \in V} f(u,w) = 0</math> for all <math>\,u \neq s, t</math>
|-
| שימור גודל הזרימה הנדרש: || <math>\,\sum_{w \in V} f(s,w) = d</math> and <math>\,\sum_{w \in V} f(w,t) = d</math>
|}

== הכללה ובעיות הקשורות לבעיית Min cost flow ==
גרסאות אחרות של בעיה זו מדברות על מציאת זרימה מקסימלית בעלת המחיר הקטן ביותר מבין כל הזרימות המקסימליות האפשריות, בעיות מסוג זה נקראות "minimum cost maximum flow".
הכללה של בעיה זו היא minimum cost circulation problem שבעזרתה ניתן לפתור את הבעיה הנדונה. זה נעשה על ידי חסימת ערכי קיבולות הקשתות ברשת על ידי 0 (חסם תחתון) והוספת קשת נוספת בעלת קיבולת <math>c(t,s)=d</math> וחסם תחתון <math>l(t,s)=d</math>, (המחברת ישירות את קודקוד הבור (t) חזרה לקודקוד המקור (s)) אשר קובעת את הזרימה הכוללת להיות <math>f(s,t)=d</math>.
את הבעיה ניתן לחלק למקרים פרטיים בהם אילוצי הקיבולת מוסרים (ולכן הבעיה הופכת לבעיית מציאת המסלול הקצר ביותר),
ומקרים בהם אנו מתעלמים ממחיר הזרימה (ולכן מחיר הזרימה דרך כל אחת מהקשתות שווה), בהם נקבל את בעיית הזרימה המקסימלית.

== שיטות לפתרון הבעיה ==
בעיית min cost flow ניתנת לפתרון על ידי תכנון ליניארי, מאחר שאנו מחפשים אופטימיזציה לפונקציה ליניארית וכל האילוצים הם פשוטים. כמו כן, קיימים אלגוריתמים קומבינטורים לפתרון הבעיה כאשר חלקם הכללות של אלגוריתמים לחיפוש ומציאת זרימה מקסימלית ברשת וחלקם האחר נוקט בגישות אחרות שונות.

אלגוריתמים ידועים (שקיימים במספר וריאציות שונות) לפתרון הבעיה הם:
<div style="direction: ltr;">

* Cycle Canceling
* Minimum Mean Cycle Canceling
* Successive Shortest Path and Capacity Scaling - שיטות דואליות שהן הכללה של שיטת פורד פולקרסון.
* Cost Scaling
* Network Simplex - מקרה פרטי של תכנון ליניארי בעזרת simplex medthod .

</div>

==ראו גם==
* משחק זרימה

== לקריאה נוספת ==
<div style="direction: ltr;">

* Ravindra K. Ahuja, Thomas L. Magnanti, and James B. Orlin (1993). Network Flows: Theory, Algorithms, and Applications. Prentice-Hall, Inc.. 

* Morton Klein (1967). "A primal method for minimal cost flows with applications to the assignment and transportation problems". Management Science 14: 205-220.

*Andrew V. Goldberg and Robert E. Tarjan (1989). "Finding minimum-cost circulations by canceling negative cycles". Journal of the ACM 36 (4): 873-886.

* Jack Edmonds and Richard M. Karp (1972). "Theoretical improvements in algorithmic efficiency for network flow problems". Journal of the ACM 19 (2): 248-264.

*Andrew V. Goldberg and Robert E. Tarjan (1990). "Finding minimum-cost circulations by successive approximation". Math. Oper. Res. 15 (3): 430-466.

</div>

== קישורים חיצוניים ==
<div style="direction: ltr;">
* [http://lemon.cs.elte.hu/ LEMON C++ library with several maximum flow and minimum cost circulation algorithms]

</div>
קטגוריה:רשתות זרימה
קטגוריה:תורת הגרפים