مسئله بیشینه جریان

در تئوری بهینه‌سازی، **مسائل بیشینه جریان** شامل پیدا کردن یک جریان عملی بیشینه از داخل یک شبکهٔ جریان تک-مبدأ و تک-مقصد است.
می‌توان به مسئلهٔ بیشینه جریان، به صورت حالت خاصی از مسائل پیچیده‌تر شبکهٔ جریان، مانند مسئلهٔ گردش، نگاه کرد. مقدار ماکسیمم یک جریان *<span style="font-size: large;">s-t</span>* (جریان از مبدأ به مقصد) برابر حداقل ظرفیت یک برش ''<span style="font-size: large;">s-t</span>'' (برشی که مبدأ را از مقصد جدا می‌کند) در شبکه است، همان‌طور که در قضیهٔ جریان بیشینه-برش کمینه ذکر شده است.

## تاریخچه
مسئلهٔ بیشینهٔ جریان ابتدا توسط T. E. Harris و F. S. Ross در سال ۱۹۵۴ به عنوان مدل ساده شده‌ای از جریان
رفت و آمد خط آهن شوروی مطرح شد. در ۱۹۵۵، .Lester R. Ford, Jr و Delbert R. Fulkerson اولین الگوریتم شناخته شده، الگوریتم فورد–فالکرسون را ایجاد کردند.
در طول زمان، تعداد زیادی راه حل بهبود یافته برای مسئلهٔ بیشینهٔ جریان پیدا شده است، به ویژه الگوریتم کوتاه‌ترین راه افزوده از Edmonds و Karp و به صورت مستقل از Dinitz، الگوریتم سد کردن جریان Dinitz، الگوریتم ارسال-برچسب Goldberg و Tarjan، و الگوریتم سد کردن دودویی جریان از Goldberg و Rao. الگوریتم جریان الکتریکی Madry، Kelner، Christano و Spielman یک جریان بیشینهٔ تقریباً بهینه می‌یابد اما فقط در گراف‌های بدون جهت کار می‌کند.

## تعریف

فرض کنید \scriptstyle N = (V, E) یک شبکه است با \scriptstyle s, t \in V که به ترتیب مبدأ و مقصد هستند.
: **ظرفیت** یک یال، نگاشت \scriptstyle c : E \to \mathbb{R}^+ است که با \scriptstyle c_{uv} یا \scriptstyle c(u, v) نمایش داده می‌شود، و نشان دهندهٔ بیشینه مقدار جریانی است که می‌تواند از یال بگذرد.
: یک **جریان**، نگاشت \scriptstyle f : E \to \mathbb{R}^+ است که با \scriptstyle f_{uv} یا \scriptstyle f(u, v) نمایش داده می‌شود و دارای دو شرط زیر است:
# \scriptstyle f_{uv} \leq c_{uv} به ازای هر \scriptstyle (u, v) \in E (شرط ظرفیت: جریان یک یال نمی‌تواند از ظرفیتش بیشتر باشد)
# \scriptstyle \sum_{u:(u, v) \in E} f_{uv} = \sum_{u:(v, u) \in E} f_{vu} به ازای هر \scriptstyle v \in V \setminus \{s, t\} (بقای جریان‌ها: جمع جریان‌های ورودی یک رأس باید با جمع جریان‌های خروجی از آن برابر باشد، به جز در رأس‌های مبدأ و مقصد)
: **مقدار جریان** به صورت \scriptstyle |f| = \sum_{v:(s,v) \in E} f_{sv} تعریف می‌شود که s، مبدأ N است. مقدار جریان، نشان‌دهندهٔ میزان جریان گذرنده از مبدأ به مقصد است.
**مسئلهٔ بیشینه جریان**، بیشینه کردن \scriptstyle |f| است، یعنی هدایت بیش‌ترین جریان ممکن از s به t.

## راه‌حل‌ها
می‌توان **گراف باقیمانده** را تعریف کرد تا راهی اصولی برای جستجو کردن عملیات‌های جلو-عقب برای یافتن بیشینه جریان فراهم کند.
اگر شبکهٔ جریان G و جریان f روی G را داشته باشیم، \scriptstyle G_{f}، گراف باقیماندهٔ G را با توجه به f اینگونه تعریف می‌کنیم:
# مجموعه رأس‌های \scriptstyle G_{f} همانند G است.
# هر رأس \scriptstyle e = (u, v) از \scriptstyle G_{f}، دارای ظرفیت \scriptstyle c_{e} - f(e) است.
# هر رأس \scriptstyle e' = (v, u) از \scriptstyle G_{f}، دارای ظرفیت \scriptstyle f(e) است.
الگوریتم‌های حل مسئلهٔ بیشینه جریان در جدول زیر نشان داده شده‌است.

## قضیهٔ جریان انتگرال
قضیهٔ جریان انتگرال می‌گوید:
: **اگر هر یال در شبکهٔ جریان ظرفیت انتگرالی داشته باشد، آنگاه یک جریان ماکسیمال انتگرالی وجود دارد.**

## کاربرد
### مسئلهٔ بیشینه جریان چند-مبدأ و چند-مقصد

می‌خواهیم جریان بیشینه را روی شبکهٔ N=(V,E) که دارای مجموعهٔ مبدأهای S=\{s_1,...,s_n\} و مجموعهٔ مقصدهای T=\{t_1,...,t_n\} (به جای تنها یک مبدأ و یک مقصد) است، پیدا کنیم. می‌توانیم مسئله چند-مبدأ و چند-مقصد را با افزودن یک مبدأ تثبیت شده که به تمام راس‌های S متصل است و یک مقصد تثبیت شده که به تمام راس‌های T متصل است (ابرمبدأ و ابرمقصد) و یال‌های آن‌ها ظرفیت بی‌نهایت دارند، به یک مسئلهٔ بیشینه جریان تبدیل کنیم.

### کمینه پوشش مسیر در گراف جهت‌دار بدون دور
برای پیدا کردن کمینه تعداد مسیر‌ها برای پوشش دادن تمام رأس‌های V در یک گراف جهت‌دار بدون دور G=(V,E)، می‌توانیم یک گراف دوبخشی G'=(V_{out} \in V_{in}, E) از G بسازیم که:
# V_{out}=\{v \in V\} که درجهٔ خروجی هر v مثبت است.
# V_{in}=\{v \in V\} که درجهٔ ورودی هر v مثبت است.
# E'=\{(u,v) \in (V_{out},V_{in}:(u,v) \in E\}.
آنگاه می‌توان با استفاده از نظریه کونیگ نشان داد که G' یک تطابق با اندازهٔ m دارد اگر و تنها اگر n-m راه وجود داشته باشد که هر رأس در G را پوشش می‌دهد و n تعداد رأس‌های G است؛ بنابراین مسئله را می‌توان با پیدا کردن تطابق ماکسیمم در G' حل کرد.

### تطابق بیشینهٔ دوبخشی

برای پیدا کردن تطابق بیشینه (تطابقی که بیش‌ترین تعداد رأس‌های ممکن را دارد) در یک گراف دو بخشی G=(X \cup Y, E)، می‌توانیم مسئله را با ساختن شبکهٔ N=(X \cup Y \cup \{s,t\}, E') به یک مسئلهٔ بیشینه جریان تبدیل کنیم، که:
# E' شامل یال‌هایی از G است که جهتشان از X به Y است.
# (s,x) \in E' برای هر x \in X و (y,t) \in E' برای هر  y \in Y.
# c(e)=1 برای هر e \in E' (شکل ۴٫۳٫۱ را ببینید).
آنگاه مقدار بیشینه جریان در N برابر اندازهٔ تطابق ماکسیمم در G است.

### مسئلهٔ بیشینه جریان با ظرفیت رأس

اگر شبکهٔ N = (V, E) را داشته باشیم که در آن علاوه بر یال‌ها، هر رأس هم ظرفیت دارد، یعنی نگاشت c: V\mapsto \mathbb{R}^{+} که با c(v) نمایش داده می‌شود به طوری که جریان f علاوه بر شرط ظرفیت و بقای جریان‌ها، شرط ظرفیت رأس را هم داشته باشد:
 \sum_{i\in V} f_{iv} \le c(v) \qquad \forall v \in V \backslash \{s,t\}
به بیان دیگر مقدار جریانی که از یک رأس می‌گذرد نمی‌تواند از ظرفیت آن بیشتر باشد. برای یافتن ماکسیمم جریان در N می‌توان با گسترش N، مسئله را به یک مسئلهٔ بیشینه جریان تبدیل کرد. ابتدا هر v\in V با v_{\text{in}} و v_{\text{out}} جایگزین می‌شود که v_{\text{in}} متصل به یال‌هایی است که به V وارد می‌شود و v_{\text{out}} متصل به یال‌هایی است که از آن خارج می‌شوند، سپس ظرفیت c(v) را به یالی نسبت می‌دهیم که v_{\text{in}} و v_{\text{out}} را شامل می‌شود (شکل ۴٫۴٫۱ را ببینید، ولی در نظر داشته باشید که جای v_{\text{in}} و v_{\text{out}} به اشتباه در آن جابه‌جا شده‌است). در این شبکهٔ گسترش یافته، شرط ظرفیت رأس برداشته شده است؛ بنابراین می‌توان با این مسئله مانند یک مسئلهٔ بیشینه جریان برخورد کرد.

### بیشینه مسیر مستقل
دو مسیر از هم مستقل اند اگر به جز s و t رأس مشترکی نداشته باشند. برای پیدا کردن بیشینه تعداد راه‌های مستقل از دو رأس s به t در گراف جهت‌دار G=(V,E)، می‌توان از G دارای ظرفیت رأس، شبکهٔ N=(V,E) را ساخت به طوری که:
# s و t به ترتیب مبدأ و مقصد N اند.
# c(v)=1 برای هر v \in V.
# c(e)=1 برای هر e \in E.
آنگاه مقدار بیشینه جریان برابر تعداد مسیرهای مستقل از s به t است.

### بیشینه مسیر یال‌مجزا
برای پیدا کردن بیشینه تعداد مسیرهای یال‌مجزا از رأس s به رأس t در گراف جهت دار G=(V,E)، می‌توان مسئله را با ساختن شبکهٔ N=(V,E) از G با مبدأ s و مقصد t و نسبت دادن جریان واحد به هر یال، به یک مسئلهٔ بیشینه جریان تبدیل کرد.

### بیشینه مسیر رأس‌مجزا
برای پیدا کردن بیشینه تعداد مسیرهای رأس‌مجزا از رأس s به رأس t در گراف جهت‌دار G=(V,E)، می‌توان مسئله را با ساختن شبکهٔ N=(V,E) به صورت زیر، به یک مسئلهٔ بیشینه جریان تبدیل کرد:
# هر رأس v در گراف را به دو رأس v_{in} و v_{out} تقسیم کنید.
# برای هر رأس v یالی با ظرفیت یک از v_{in} به v_{out} اضافه کنید.
# هر یال (u,v) در گراف را با یالی از u_{out} به v_{in} با ظرفیت یک تعویض کنید.
# یک رأس مقصد اختصاصی جدید به نام t اضافه کنید.
# برای هر رأس v، یالی از v_{in} به t با ظرفیت یک اضافه کنید.
# یک بیشینه جریان از s_{out} به t پیدا کنید. مقدار جریان برابر تعداد مسیرهای رأس‌مجزا است.

## کاربردهای مسئله در دنیای واقعی
### بازی‌های حذفی بیسبال

در این مسئله، n تیم در یک لیگ به طور حذفی با یک‌دیگر مسابقه می‌دهند. در یک مرحلهٔ خاص، w_i  تعداد بردها، r_i تعداد بازی‌های باقی‌مانده برای تیم iام، و r_{ij} تعداد بازی‌های باقی‌مانده در مقابل تیم jام است. اگر تیمی شانس اول شدن از دست بدهد، از لیگ حذف خواهد شد. هدف این مسئله تعیین کردن تیم‌های حذف شده در هر زمان از فصل است. Schwartz برای این مسئله روشی پیشنهاد داد که این مسئله را به مسئلهٔ بیشینهٔ جریان تبدیل می‌کند. در این روش شبکه‌ای ساخته می‌شود که تعیین می‌کند آیا تیم k حذف می‌شود یا نه.
فرض کنید گراف G=(V,E) شبکه‌ای با s,t \in V  باشد که s و t به ترتیب مبدأ و مقصد را تعیین می‌کنند. یک رأس \{i,j\} را به طوری که i به گراف اضافه می‌کنیم و آن را با یالی با ظرفیت r_{ij} به s وصل می‌کنیم که تعداد بازی‌های بین دو تیم i و j را نشان می‌دهد. هم چنین برای هر تیم i یک رأس ایجاد می‌کنیم و هر رأس \{i,j\} را به رأس‌های i و j وصل می‌کنیم تا تضمین کنیم یکی از آن‌ها برنده می‌شود. برای این یال‌ها ظرفیتی تعیین نمی‌کنیم. در انتها، وزن یال بین تیم i و مقصد t را *w*k+*r*k–*w*i قرار می‌دهیم تا تعداد بردهای تیم i از *w*k+*r*k تجاوز نکند. مجموعهٔ تیم‌های شرکت‌کننده در لیگ را S می‌نامیم و \scriptstyle r(S - \{k\}) = \sum_{i,j \in \{S-\{k\}\}, i . ادعا می‌کنیم تیم k حذف نمی‌شود اگر و تنها اگر اندازهٔ جریانی با مقدار r(S - \{k\}) در شبکهٔ G وجود داشته باشد. در مقالهٔ مذکور نشان داده شده که این مقدار همان مقدار بیشینهٔ جریان از s به t است.

### برنامه‌ریزی خطوط هوایی
یکی از مسائل مهم در صنایع خطوط هوایی، برنامه‌ریزی برای خدمهٔ پرواز است. مسائل برنامه‌ریزی در خطوط هوایی می‌تواند به عنوان کاربردی از تعمیم مسئلهٔ بیشینهٔ جریان مطرح شود. ورودی مسئله، مجموعه‌ای از پروازها (F) است که شامل مکان و زمان پروازهای ورودی و خروجی است. در یک مدل از برنامه‌ریزی، هدف این است که یک برنامه‌ریزی عملی صورت گیرد به طوری که حداکثر k خدمه فعالیت کنند.
برای حل این مسئله، از مدل متفاوتی از مسئلهٔ گردش به نام گردش کراندار استفاده می‌کنیم، که مدل کلی‌ای از مسئلهٔ جریان است که در آن برای حداقل جریان منحصر با یال‌ها محدودیت قائل می‌شویم.
G=(V,E) را یک شبکه با مبدأ و مقصد s,t \in V در نظر می‌گیریم. برای هر پرواز i، یک رأس s_i برای مبدأ و یک رأس d_i برای مقصد آن به V اضافه می‌کنیم. هم چنین یال‌های زیر را به E اضافه می‌کنیم:
# یال‌هایی با ظرفیت [۰٬۱] بین s و هر s_i
# یال‌هایی با ظرفیت [۰٬۱] بین هر d_i و t
# یال‌هایی با ظرفیت [۰٬۱] بین هر جفت s_i و d_i
# یال‌هایی با ظرفیت [۰٬۱] بین هر d_i و s_j، اگر بتوانیم با صرف هزینه و زمان معقول از d_i به s_j برسیم.
# یالی با ظرفیت [∞,۰] بین s و t
در روش ذکر شده، ادعا و اثبات می‌شود که پیدا کردن یک جریان با مقدار k بین s و t در G، همان پیدا کردن برنامه‌ای عملی برای مجموعهٔ پروازهای F با حداکثر k خدمه است.
نوع دیگری از برنامه‌ریزی خطوط هوایی، پیدا کردن حداقل خدمه برای انجام شدن تمامی پروازهاست. برای پیدا کردن جواب این مسئله، یک گراف دو قسمتی G'=(A \cup B, E) می‌سازیم که هر پرواز یک کپی در مجموعهٔ A و مجموعهٔ B دارد. اگر یک هواپیما بتواند پرواز j را بعد از پرواز i انجام دهد، i \in A به j \in B وصل می‌شود. یک تطابق در G' شامل یک برنامه برای F است و بدیهی است که حداکثر تطابق دوقسمتی در این گراف، یک برنامهٔ هوایی با حداقل تعداد خدمه را نشان می‌دهد. همان‌طور که در قسمت کاربردهای این مقاله ذکر شد، پیدا کردن تطابق بیشینه دوبخشی یکی از کاربردهای مسئلهٔ بیشینهٔ جریان است.

### مسئلهٔ تقاضای گردش
تعدادی کارخانه هستند که کالا تولید می‌کنند و تعدادی دهکده هستند که باید به آن‌ها کالا برسد. آن‌ها با شبکه‌ای از جاده‌ها به هم متصل اند که هر جاده ظرفیت c برای بیشینه کالایی که می‌تواند از آن بگذرد دارد. مسئله یافتن این است که آیا گردشی وجود دارد که تقاضا را برآورده کند یا خیر. این مسئله می‌تواند به یک مسئلهٔ بیشینه جریان تبدیل شود:
# یک رأس مبدأ (s) اضافه کنید و یال‌هایی از آن به هر رأس کارخانه ( f_i ) با ظرفیت تولید  p_i  اضافه کنید، که  p_i  آهنگ تولید کارخانهٔ  f_i  است.
# یک رأس مقصد (t) اضافه کنید و یال‌هایی از هر رأس دهکده ( v_i ) با ظرفیت  d_i  به آن اضافه کنید، که  d_i  میزان تقاضای دهکده است.
G=(V,E) این شبکهٔ جدید است. گردشی وجود دارد که تقاضا را برآورده کند اگر و تنها اگر:
 Maximum flow value(G) =  \sum_{i \in v} d_i 
اگر یک گردش وجود داشته باشد، مسئلهٔ بیشینه جریان جواب این که چه مقدار کالا برای برآورده شدن تقاضا باید از طریق یک جادهٔ خاص فرستاده شود را به ما می‌دهد.

### عدالت در اشتراک اتومبیل
مسئله این است که N نفر از یک ماشین در k روز به صورت اشتراکی استفاده می‌کنند. هر شرکت کننده می‌تواند در هر روز انتخاب کند که شرکت می‌کند یا خیر. هدف ما این است که عادلانه تصمیم بگیریم که در یک روز مشخص، چه کسی رانندگی می‌کند.
راه حل به این صورت است:
می‌توانیم بر اساس تعداد افرادی که از ماشین استفاده می‌کنند تصمیم بگیریم، یعنی اگر m نفر از ماشین در یک روز استفاده می‌کنند، هر نفر به مقدار  1/m  مسئولیت دارد؛ بنابراین برای هر شخص i، اجبار رانندگی ( D_i ) به صورتِ ذکر شده است؛ بنابراین، شخص i فقط باید  [D_i]  بار در k روز رانندگی کند.
هدف این است که پی ببریم آیا چنین وضعیتی امکان‌پذیر است یا خیر. برای این منظور همان‌طور که در شکل نشان داده شده است، سعی می‌کنیم مسئله را به یک شبکه تبدیل کنیم.
حال می‌توان ثابت کرد که اگر جریان k وجود داشته باشد، آنگاه چنین وضعیت عادلانه‌ای و چنین جریانی با مقدار k همواره وجود دارد.

## منابع
* 

## جستارهای وابسته
* بیشینه جریان

رده:الگوریتم‌ها
رده:شبکه شاره
رده:مسئله‌های ریاضی
رده:نظریه گراف
رده:مسئله‌های محاسباتی در نظریه گراف