مشاهده - سید محمد بیدکی

Download Report

Transcript مشاهده - سید محمد بیدکی

‫درس طراحی الگوریتم ها‬
‫فصل چهارم (ادامه)‬
‫روش حریصانه‬
‫‪Greedy approach‬‬
‫مدرس‪ :‬سید محمد بیدکی‬
‫بهار ‪1392‬‬
‫مقدمه‬
‫‪ ‬گراف بدون جهت‪ :‬شامل یک مجموعه متناهی و غیر تهی ‪ V‬می باشد که‬
‫عناصر آن را رئوس گراف ‪ G‬می نامیم‪ .‬به همراه مجموعه ‪ E‬که شامل‬
‫مجموعه ای از زوج رئوس (یال) در ‪ V‬می باشد‪.‬‬
‫‪ ‬گراف جهت دار‪ :‬در گراف جهت دار هر یال دارای ابتدا و انتها می باشد‪ .‬به‬
‫عبارت دیگر )‪ (v, u‬با )‪ (u ,v‬فرق دارد‪.‬‬
‫‪ ‬مسیر)‪ :(Path‬دنباله ای از رئوس )‪ (v1 , v2 ,…, vk‬به گونه ای که هر یال ‪(vi-1,‬‬
‫)‪ vi‬در ‪ E‬وجود داشته باشد‪.‬‬
‫‪ ‬چرخه )‪ :(cycle‬مسیری از یک رأس به خودش‬
‫‪ ‬گراف هم بند (متصل)‪ :‬اگر از هر رأس به رئوس دیگر مسیری وجود داشته‬
‫باشد‪.‬‬
‫‪ ‬گراف وزن دار‪ :‬گرافی که یال های آن دارای ارزش (وزن) باشند‪.‬‬
‫درس طراحی الگوریتم ها ‪ -‬فصل چهارم‪ :‬روش حریصانه (ادامه)‬
‫‪-‬‬
‫بیدکی‬
‫‪/42‬‬
‫‪2‬‬
‫مقدمه‬
‫‪ ‬درخت )‪ :(Tree‬گراف هم بند‪ ،‬بدون جهت و بدون چرخه است‪.‬‬
‫‪ ‬رأس ‪ w‬مجاور رأس ‪ u‬می باشد اگر یالی از ‪ w‬به ‪ u‬وجود داشته‬
‫باشد‪.‬‬
‫‪ ‬دور اویلری‪ :‬چرخه ای که از تمام یال های گراف دقیقا یک بار‬
‫عبور می کند‪.‬‬
‫‪ ‬دور همیلتونی‪ :‬چرخه ای که از تمام رئوس گراف دقیقا یک بار‬
‫عبور می کند‪.‬‬
‫درس طراحی الگوریتم ها ‪ -‬فصل چهارم‪ :‬روش حریصانه (ادامه)‬
‫‪-‬‬
‫بیدکی‬
‫‪/42‬‬
‫‪3‬‬
‫نمایش گراف‬
‫‪ G = (V, E) ‬یک گراف با ‪ n‬رأس و ‪ e‬یال می باشد‪.‬‬
‫‪ ‬ماتریس مجاورت‪ :‬یک ماتریس ‪ n*n‬که برای هر دو رأسی که بین آنها‬
‫یال وجود دارد‪ ،‬درایه متناظر آن ‪ 1‬و در غیر این صورت ‪ 0‬است‪.‬‬
‫‪ ‬در گراف وزن دار‪ ،‬وزن ها را در ماتریس مجاورت ذخیره می کنند‪.‬‬
‫‪ ‬لیست مجاورت‪ :‬یک آرایه ‪ n‬عضوی از اشاره گرها می باشد که هر‬
‫خانه آن به یک لیست پیوندی که شامل رئوس مجاور آن رأس است‬
‫اشاره می کند‪.‬‬
‫درس طراحی الگوریتم ها ‪ -‬فصل چهارم‪ :‬روش حریصانه (ادامه)‬
‫‪-‬‬
‫بیدکی‬
‫‪/42‬‬
‫‪4‬‬
‫مثال‬
‫‪2‬‬
‫‪1‬‬
‫‪3‬‬
‫‪4‬‬
‫‪5‬‬
‫‪5‬‬
‫‪4‬‬
‫‪2 3‬‬
‫‪1‬‬
‫‪1‬‬
‫‪0‬‬
‫‪1 0‬‬
‫‪0‬‬
‫‪1‬‬
‫‪1‬‬
‫‪1‬‬
‫‪0 1‬‬
‫‪1‬‬
‫‪2‬‬
‫‪0‬‬
‫‪1‬‬
‫‪1 0‬‬
‫‪0‬‬
‫‪3‬‬
‫ماتریس‬
‫مجاورتی‬
‫‪4 0 1 1 0 1‬‬
‫‪0‬‬
‫× ‪4‬‬
‫‪1 0‬‬
‫‪1‬‬
‫‪1‬‬
‫‪5‬‬
‫× ‪5‬‬
‫‪2‬‬
‫‪1‬‬
‫‪5‬‬
‫‪1‬‬
‫‪2‬‬
‫× ‪4‬‬
‫‪2‬‬
‫‪3‬‬
‫× ‪3‬‬
‫‪5‬‬
‫‪2‬‬
‫‪4‬‬
‫× ‪2‬‬
‫‪1‬‬
‫‪4‬‬
‫‪5‬‬
‫‪3‬‬
‫درس طراحی الگوریتم ها ‪ -‬فصل چهارم‪ :‬روش حریصانه (ادامه)‬
‫‪-‬‬
‫بیدکی‬
‫لیست‬
‫مجاورتی‬
‫‪/42‬‬
‫‪5‬‬
‫درخت پوشای کمینه )‪(minimum spanning tree‬‬
‫‪ ‬مسئله‪ :‬یافتن درختی در یک گراف که شامل تمام رئوس آن گراف باشد(پوشا) و‬
‫مجموع وزن یالها در آن حداقل باشد‪.‬‬
‫‪ ‬کاربردهای مسئله‪:‬‬
‫‪ ‬در راهسازی می خواهیم چند شهر معین را با حداقل هزینه (کمترین جاده) به یکدیگر‬
‫وصل کنیم به طوری که مردم بتوانند از هر شهر به شهر دیگر سفر کنند‪.‬‬
‫‪ ‬در ارتباطات راه دور می خواهیم حداقل طول کابل استفاده شود‪.‬‬
‫‪ ‬در طراحی مدارات الکترونیکی به طور معمول الزم است پایه های چندین قطعه را از‬
‫طریق سیم کشی آنها به یکدیگر‪ ،‬از نظر الکتریکی معادل سازیم‪.‬‬
‫‪ ‬برای اتصال ‪ n‬پایه‪ ،‬می توان از چیدمان ‪ n-1‬سیمی (کمترین تعداد سیم) استفاده کرد که هر کدام‬
‫دو پایه را متصل می کند‪.‬‬
‫درس طراحی الگوریتم ها ‪ -‬فصل چهارم‪ :‬روش حریصانه (ادامه)‬
‫‪-‬‬
‫بیدکی‬
‫‪/42‬‬
‫‪6‬‬
‫مثال‬
‫‪ ‬یافتن درخت پوشا در گراف‬
‫‪1‬‬
‫‪v2‬‬
‫‪3‬‬
‫‪6‬‬
‫‪3‬‬
‫‪4‬‬
‫‪v4‬‬
‫‪‬نظریه ‪ :Cayley‬برای گراف کامل با ‪ n‬گره تعداد ‪ nn-2‬درخت پوشا وجود‬
‫دارد‪.‬‬
‫‪v1‬‬
‫‪v3‬‬
‫‪2‬‬
‫‪5‬‬
‫‪v5‬‬
‫‪‬استفاده از الگوریتم ‪ brute-force‬هزینه زیادی دارد‪.‬‬
‫‪v2‬‬
‫‪1‬‬
‫‪v1‬‬
‫‪v2‬‬
‫‪3‬‬
‫‪v4‬‬
‫‪4‬‬
‫‪1‬‬
‫‪v4‬‬
‫‪2‬‬
‫‪v3‬‬
‫‪5‬‬
‫‪v5‬‬
‫‪v5‬‬
‫هزینه ‪15‬‬
‫هزینه ‪10‬‬
‫درس طراحی الگوریتم ها ‪ -‬فصل چهارم‪ :‬روش حریصانه (ادامه)‬
‫‪3‬‬
‫‪6‬‬
‫‪v3‬‬
‫‪v1‬‬
‫‪-‬‬
‫بیدکی‬
‫‪/42‬‬
‫‪7‬‬
‫الگوریتم حریصانه‬
‫‪ ‬مسئله درخت پوشای کمینه از دسته مسائل بهینه سازی می باشد‪.‬‬
‫‪ ‬هدف یافتن زیرمجموعه ‪ F‬از ‪ E‬است به گونه ای که )‪T=(V, F‬‬
‫درخت پوشای کمینه برای )‪ G=(V,E‬باشد‪.‬‬
‫‪ ‬برای یافتن ‪ MST‬سه الگوریتم حریصانه وجود دارد‪:‬‬
‫‪ ‬الگوریتم ‪Prim‬‬
‫‪ ‬الگوریتم ‪Kruskal‬‬
‫‪ ‬الگوریتم ‪reverse-delete‬‬
‫درس طراحی الگوریتم ها ‪ -‬فصل چهارم‪ :‬روش حریصانه (ادامه)‬
‫‪-‬‬
‫بیدکی‬
‫‪/42‬‬
‫‪8‬‬
‫الگوریتم پریم )‪(Prim‬‬
‫‪ ‬مبنای کار الگوریتم انتخاب بهترین‬
‫رأس در هر لحظه است‪.‬‬
‫‪ ‬مالک بهینه محلی‪ :‬انتخاب نزدیک‬
‫ترین رأس به رئوس موجود در‬
‫مجموعه ‪Y‬‬
‫‪ ‬روند اجرای الگوریتم‪:‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪ F‬زیرمجموعه ای تهی از یال ها‬
‫‪ Y‬حاوی یک رأس دلخواه‬
‫انتخاب نزدیکترین رأس از مجموعه‬
‫‪ V-Y‬به رئوس ‪Y‬‬
‫اضافه کردن رأس انتخاب شده به ‪Y‬‬
‫و یال مربوطه به ‪F‬‬
‫الگوریتم تا زمانی که تمام رئوس به‬
‫‪ Y‬اضافه شوند ادامه می یابد‪.‬‬
‫درس طراحی الگوریتم ها ‪ -‬فصل چهارم‪ :‬روش حریصانه (ادامه)‬
‫بیدکی‬
‫‪-‬‬
‫‪9‬‬
‫الگوریتم پریم‬
‫اندیس نزدیک ترین رأس در ‪ Y‬به ‪= vi‬‬
‫]‪nearest[i‬‬
‫وزن یال میان ‪ vi‬و رأسی که توسط ]‪ nearest[i‬مشخص شده است = ]‪/42distance[i‬‬
‫‪10‬‬
‫مثال‬
‫‪ ‬برای نمایش گراف از ماتریس مجاورتی استفاده می کنیم‪:‬‬
‫‪(vi , v j )  E‬‬
‫‪weight‬‬
‫‪‬‬
‫‪w[i][ j ]  ‬‬
‫‪‬‬
‫‪0‬‬
‫‪(vi , v j )  E‬‬
‫‪i j‬‬
‫‪1‬‬
‫‪v2‬‬
‫‪v1‬‬
‫‪3‬‬
‫‪6‬‬
‫‪3‬‬
‫‪4‬‬
‫‪v4‬‬
‫‪v3‬‬
‫‪2‬‬
‫‪5‬‬
‫‪v5‬‬
‫درس طراحی الگوریتم ها ‪ -‬فصل چهارم‪ :‬روش حریصانه (ادامه)‬
‫‪-‬‬
‫بیدکی‬
‫‪/42‬‬
‫‪11‬‬
‫مثال‬
‫‪F=Ø‬‬
‫‪V-Y‬‬
‫‪1‬‬
‫‪v2‬‬
‫‪v1‬‬
‫‪v2‬‬
‫‪3‬‬
‫‪6‬‬
‫‪3‬‬
‫‪4‬‬
‫‪v4‬‬
‫‪v3‬‬
‫‪v3‬‬
‫‪v4‬‬
‫‪2‬‬
‫‪5‬‬
‫‪Y‬‬
‫‪v5‬‬
‫‪1‬‬
‫‪v1‬‬
‫‪3‬‬
‫∞‬
‫∞‬
‫‪v5‬‬
‫‪5‬‬
‫‪4‬‬
‫‪3‬‬
‫‪2‬‬
‫∞‬
‫∞‬
‫‪3‬‬
‫‪1‬‬
‫‪distance‬‬
‫درس طراحی الگوریتم ها ‪ -‬فصل چهارم‪ :‬روش حریصانه (ادامه)‬
‫‪-‬‬
‫‪5‬‬
‫‪4‬‬
‫‪3‬‬
‫‪2‬‬
‫‪1‬‬
‫‪1‬‬
‫‪1‬‬
‫‪1‬‬
‫بیدکی‬
‫‪nearest‬‬
‫‪/42‬‬
‫‪12‬‬
‫مثال‬
‫}}‪F = {{v1 , v2‬‬
‫‪V-Y‬‬
‫‪1‬‬
‫‪v2‬‬
‫‪v1‬‬
‫‪v3‬‬
‫‪3‬‬
‫‪6‬‬
‫‪∞ v4‬‬
‫‪v3‬‬
‫‪6‬‬
‫‪2‬‬
‫‪5‬‬
‫‪3‬‬
‫‪v1‬‬
‫‪3‬‬
‫‪3‬‬
‫‪4‬‬
‫‪v4‬‬
‫‪Y‬‬
‫‪v5‬‬
‫‪v2‬‬
‫∞‬
‫∞‬
‫‪v5‬‬
‫‪5‬‬
‫‪4‬‬
‫‪3‬‬
‫‪2‬‬
‫∞‬
‫‪6‬‬
‫‪3‬‬
‫‪-1‬‬
‫‪distance‬‬
‫درس طراحی الگوریتم ها ‪ -‬فصل چهارم‪ :‬روش حریصانه (ادامه)‬
‫‪-‬‬
‫‪5‬‬
‫‪4‬‬
‫‪3‬‬
‫‪2‬‬
‫‪1‬‬
‫‪2‬‬
‫‪1‬‬
‫‪1‬‬
‫بیدکی‬
‫‪nearest‬‬
‫‪/42‬‬
‫‪13‬‬
‫مثال‬
‫}}‪F = {{v1 , v2},{v1 , v3‬‬
‫‪V-Y‬‬
‫‪1‬‬
‫‪v2‬‬
‫‪v1‬‬
‫‪3‬‬
‫‪6‬‬
‫‪4‬‬
‫‪v3‬‬
‫‪v5‬‬
‫‪2‬‬
‫‪5‬‬
‫‪v1‬‬
‫‪∞ v4‬‬
‫‪3‬‬
‫‪4‬‬
‫‪v4‬‬
‫‪Y‬‬
‫‪v2‬‬
‫‪6‬‬
‫∞‬
‫∞‬
‫‪v3‬‬
‫‪2‬‬
‫‪v5‬‬
‫‪5‬‬
‫‪4‬‬
‫‪3‬‬
‫‪2‬‬
‫‪2‬‬
‫‪4‬‬
‫‪-1‬‬
‫‪-1‬‬
‫‪distance‬‬
‫درس طراحی الگوریتم ها ‪ -‬فصل چهارم‪ :‬روش حریصانه (ادامه)‬
‫‪-‬‬
‫‪5‬‬
‫‪4‬‬
‫‪3‬‬
‫‪2‬‬
‫‪3‬‬
‫‪3‬‬
‫‪1‬‬
‫‪1‬‬
‫بیدکی‬
‫‪nearest‬‬
‫‪/42‬‬
‫‪14‬‬
‫مثال‬
‫}}‪F = {{v1 , v2},{v1 , v3},{v3 , v5‬‬
‫‪V-Y‬‬
‫‪1‬‬
‫‪v2‬‬
‫‪Y‬‬
‫‪v1‬‬
‫‪v1‬‬
‫‪3‬‬
‫‪6‬‬
‫‪3‬‬
‫‪4‬‬
‫‪v4‬‬
‫∞‬
‫‪6‬‬
‫‪4‬‬
‫‪v4‬‬
‫‪v3‬‬
‫‪v3‬‬
‫‪5‬‬
‫‪2‬‬
‫‪5‬‬
‫‪v2‬‬
‫‪v5‬‬
‫‪v5‬‬
‫‪5‬‬
‫‪4‬‬
‫‪3‬‬
‫‪2‬‬
‫‪-1‬‬
‫‪4‬‬
‫‪-1‬‬
‫‪-1‬‬
‫‪distance‬‬
‫درس طراحی الگوریتم ها ‪ -‬فصل چهارم‪ :‬روش حریصانه (ادامه)‬
‫‪-‬‬
‫‪5‬‬
‫‪4‬‬
‫‪3‬‬
‫‪2‬‬
‫‪3‬‬
‫‪3‬‬
‫‪1‬‬
‫‪1‬‬
‫بیدکی‬
‫‪nearest‬‬
‫‪/42‬‬
‫‪15‬‬
‫مثال‬
‫}}‪F = {{v1 , v2},{v1 , v3},{v3 , v5},{v3 , v4‬‬
‫‪V-Y‬‬
‫‪v2‬‬
‫‪1‬‬
‫‪Y‬‬
‫‪v1‬‬
‫‪v1‬‬
‫‪v2‬‬
‫‪3‬‬
‫‪v4‬‬
‫‪4‬‬
‫‪v3‬‬
‫‪v3‬‬
‫‪v5‬‬
‫‪2‬‬
‫‪v4‬‬
‫‪v5‬‬
‫‪5‬‬
‫‪4‬‬
‫‪3‬‬
‫‪2‬‬
‫‪-1‬‬
‫‪-1‬‬
‫‪-1‬‬
‫‪-1‬‬
‫‪distance‬‬
‫درس طراحی الگوریتم ها ‪ -‬فصل چهارم‪ :‬روش حریصانه (ادامه)‬
‫‪-‬‬
‫‪5‬‬
‫‪4‬‬
‫‪3‬‬
‫‪2‬‬
‫‪3‬‬
‫‪3‬‬
‫‪1‬‬
‫‪1‬‬
‫بیدکی‬
‫‪nearest‬‬
‫‪/42‬‬
‫‪16‬‬
‫پیچیدگی زمانی‬
‫‪ ‬در حلقه ‪ repeat‬دو حلقه وجود دارد که هرکدام ‪ n-1‬بار تکرار می‬
‫شوند‪.‬‬
‫‪ ‬حلقه ‪ repeat‬هم به تعداد ‪ n-1‬بار تکرار میشود‪.‬‬
‫‪ ‬اندازه ورودی‪ n :‬تعداد رئوس‬
‫)‪T(n) = 2 (n-1) (n-1) = Ө(n2‬‬
‫درس طراحی الگوریتم ها ‪ -‬فصل چهارم‪ :‬روش حریصانه (ادامه)‬
‫‪-‬‬
‫بیدکی‬
‫‪/42‬‬
‫‪17‬‬
‫الگوریتم کروسکال )‪(Kruskal‬‬
‫‪ ‬این الگوریتم در هر لحظه بهترین یال را انتخاب میکند‪.‬‬
‫‪ ‬مراحل اجرای الگوریتم کروسکال‬
‫‪ F = Ø .1‬مجموعه یالها‬
‫‪.2‬‬
‫ایجاد مجموعه های مستقل از رئوس (در ابتدا هر رأس‪ ،‬در یک مجموعه)‬
‫‪.3‬‬
‫مرتب سازی یالها براساس وزن به صورت صعودی‬
‫‪.4‬‬
‫انتخاب یال با کمترین وزن‬
‫‪.5‬‬
‫بررسی امکان سنجی‪ :‬اگر یال انتخاب شده دو مجموعه مجزا را به یکدیگر‬
‫وصل کند به مجموعه جواب (‪ )F‬اضافه می شود و دو مجموعه ادغام می‬
‫گردند‪.‬‬
‫‪.6‬‬
‫مراحل از ‪۴‬‬
‫نگرفته‪ -‬اند‪،‬‬
‫تا زمانی که تمام رئوس در یک مجموعه قرار‬
‫بیدکی‬
‫درس طراحی الگوریتم ها ‪ -‬فصل چهارم‪ :‬روش حریصانه (ادامه)‬
‫تکرار‬
‫‪/42‬‬
‫‪18‬‬
‫مثال‬
‫‪F = {{v‬‬
‫‪Ø 1 , v2},{v‬‬
‫‪}} 3,,v‬‬
‫‪v5},{v‬‬
‫‪}} 2 ,v3},{v‬‬
‫}}‪}} 3 ,v4‬‬
‫‪ .1‬ایجاد مجموعه های مستقل از ‪V‬‬
‫‪v1‬‬
‫‪v3‬‬
‫‪1‬‬
‫‪v2‬‬
‫‪v5‬‬
‫‪3‬‬
‫‪6‬‬
‫‪v4‬‬
‫‪3‬‬
‫‪4‬‬
‫‪v4‬‬
‫‪v2‬‬
‫‪v1‬‬
‫‪2‬‬
‫‪5‬‬
‫‪ .2‬مرتب سازی یالها به ترتیب‬
‫صعودی‬
‫‪v3‬‬
‫‪v5‬‬
‫)‪(v4 , v2‬‬
‫)‪(v4 , v5‬‬
‫)‪(v3 , v4‬‬
‫)‪(v1 , v3‬‬
‫)‪(v2 , v3‬‬
‫)‪(v3 , v5‬‬
‫)‪(v1 , v2‬‬
‫‪6‬‬
‫‪5‬‬
‫‪4‬‬
‫‪3‬‬
‫‪3‬‬
‫‪2‬‬
‫‪1‬‬
‫درس طراحی الگوریتم ها ‪ -‬فصل چهارم‪ :‬روش حریصانه (ادامه)‬
‫‪-‬‬
‫بیدکی‬
‫‪/42‬‬
‫‪19‬‬
‫الگوریتم‬
‫درس طراحی الگوریتم ها ‪ -‬فصل چهارم‪ :‬روش حریصانه (ادامه)‬
‫‪-‬‬
‫بیدکی‬
‫‪/42‬‬
‫‪20‬‬
‫تحلیل پیچیدگی‬
‫‪ ‬اندازه ورودی‪ n :‬تعداد رئوس و ‪ m‬تعداد یالها‬
‫‪ ‬زمان الزم برای ایجاد ‪ n‬مجموعه مجزا‬
‫‪ ‬زمان الزم برای مرتب سازی یالها‬
‫)‪T (n)  (n‬‬
‫)‪w(m)  (m lg m‬‬
‫‪ ‬زمان عملیات موجود در حلقه ‪w(m)  (m lg m) while‬‬
‫‪ ‬در بدترین حالت هر رأس را می توان به هر یک از رئوس دیگر متصل‬
‫کرد‪:‬‬
‫‪2) ‬‬
‫‪m‬‬
‫=‬
‫‪n‬‬
‫)‪(n-1‬‬
‫‪/‬‬
‫‪2‬‬
‫∈‬
‫‪Ө(n‬‬
‫)‪W(m, n) ∈ Θ(m lgm) = Θ(n2 lgn2) = Θ(n2 2 lgn) = Θ(n2 lgn‬‬
‫درس طراحی الگوریتم ها ‪ -‬فصل چهارم‪ :‬روش حریصانه (ادامه)‬
‫‪-‬‬
‫بیدکی‬
‫‪/42‬‬
‫‪21‬‬
‫مقایسه الگوریتم های ‪Prim & Kruskal‬‬
‫)‪Ө(n2‬‬
‫‪ ‬الگوریتم پریم از مرتبه‬
‫‪ ‬الگوریتم کروسکال از مرتبه )‪Ө(m lgm) = Ө(n2 lgn‬‬
‫‪‬‬
‫تعداد یالها در بازه زیر قرار دارد‪n-1 ≤ m ≤ n(n-1)/2 :‬‬
‫‪ ‬اگر تعداد یال ها نزدیك به كرانه پاییني باشد‪ ،‬الگوریتم‬
‫كروسكال)‪ Ө(n lgn‬است و باید سریعتر از پریم باشد‪.‬‬
‫‪ ‬اگر تعداد یال ها نزدیك به كرانه باالیي باشد‪ ،‬الگوریتم‬
‫كروسكال)‪ Ө(n2 lgn‬است ‪ ،‬یعني الگوریتم پریم باید سریعتر‬
‫باشد‪.‬‬
‫درس طراحی الگوریتم ها ‪ -‬فصل چهارم‪ :‬روش حریصانه (ادامه)‬
‫‪-‬‬
‫بیدکی‬
‫‪/42‬‬
‫‪22‬‬
‫مسئله یافتن کوتاهترین مسیر )‪(shortest path‬‬
‫‪ ‬مسئله کوتاهترین مسیر یک مسئله بهینه سازی است‪.‬‬
‫‪ ‬مثال‪ :‬یک مسئله مهم در سفرهای هوایی که پرواز مستقیم وجود ندارد‪،‬‬
‫تعیین کوتاهترین مسیر پرواز از یک شهر به شهر دیگر است‪.‬‬
‫‪ ‬برای حل این مسئله از الگوریتم های گراف بهره میگیریم‪:‬‬
‫‪ ‬الگوریتم فلوید )‪ (Floyd‬که از روش برنامه نویسی پویا استفاده می کند‪.‬‬
‫‪ ‬تمام کوتاهترین مسیرهای بین هر دو رأس را بدست می آورد‪.‬‬
‫‪( ‬مراجعه به کتاب)‬
‫‪ ‬الگوریتم دایجسترا )‪ )Dijkstra‬که یک الگوریتم حریصانه است‪.‬‬
‫‪ ‬این الگوریتم مسئله کوتاهترین مسیر تک مبدأ را حل می کند‪.‬‬
‫درس طراحی الگوریتم ها ‪ -‬فصل چهارم‪ :‬روش حریصانه (ادامه)‬
‫‪-‬‬
‫بیدکی‬
‫‪/42‬‬
‫‪23‬‬
‫الگوریتم ‪Brute-force‬‬
‫‪ ‬تعیین طول همه مسیرها برای هر رأس‪ ،‬از آن رأس به هر یک از رئوس‬
‫دیگر‬
‫‪ ‬مرتبه زمانی روش فوق بدتر از نمایی است‪:‬‬
‫‪ ‬فرض کنید که از هر رأس یک یال به همه رئوس وجود داشته باشد‪ .‬همچنین‬
‫مسیر بین دو رأس مبدأ و مقصد از همه رئوس عبورکند‪.‬‬
‫‪ ‬رأس دوم در چنین مسیری می تواند هر یک از ‪ n-2‬رأس دیگر باشد‪ ،‬رأس‬
‫سوم در چنین مسیری می تواند هر یک از ‪ n-3‬رأس دیگر باشد‪ ... ،‬و رأس‬
‫یکی مانده به آخری در چنین مسیری فقط می تواند یک رأس باشد‪.‬‬
‫‪ ‬بنابراین تعداد کل مسیرها از یک رأس به رأس دیگر که از همه رئوس دیگر‬
‫بگذرد عبارت است از‪:‬‬
‫! )‪(n-2) (n-3) . . . 1 = (n-2‬‬
‫درس طراحی الگوریتم ها ‪ -‬فصل چهارم‪ :‬روش حریصانه (ادامه)‬
‫‪-‬‬
‫بیدکی‬
‫‪/42‬‬
‫‪24‬‬
‫الگوریتم دایجسترا )‪(Dijkstra‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫هدف یافتن کوتاهترین مسیر از یک رأس مشخص تا تمام رئوس دیگر است‬
‫در یک گراف جهتدار موزون‪.‬‬
‫به دلیل استفاده از روش حریصانه در هر مرحله باید بخشی از جواب بدست‬
‫آید‪ .‬بنابراین از کوتاهترین مسیر شروع کرده و به سمت مسیرهای طوالنی‬
‫تر می رویم‪.‬‬
‫}‪ Y ={v1‬مجموعه رئوسی که کوتاهترین مسیر از گره مبدأ تا آنها پیدا شده‬
‫است‪.‬‬
‫در هر مرحله‪ ،‬کوتاهترین مسیر بعدی که از ‪ v1‬شروع می شود و از رئوس‬
‫داخل ‪ Y‬می گذرد و به رأسی می رسد که تا حاال مسیری برای آن پیدا نشده‬
‫است‪ ،‬ثبت می شود‪.‬‬
‫در صورت اضافه شدن رأس جدیدی به ‪ ،Y‬باید تأثیر مثبت آن را در طول‬
‫مسیر رئوسی که در ‪ Y‬نیستند بررسی و اعمال کرد‪.‬‬
‫درس طراحی الگوریتم ها ‪ -‬فصل چهارم‪ :‬روش حریصانه (ادامه)‬
‫‪-‬‬
‫بیدکی‬
‫‪/42‬‬
‫‪25‬‬
‫الگوریتم دایجسترا‬
Y = {v1}
F=ᶲ
While (the instance is not solved) {
select a vertex v from V-Y, that has a shortest path
from v1, using only vertices in Y as intermediates;
add the new vertex v to Y;
add the edge (on the shortest path) that touches v to F;
if (Y == V)
the instance is solved;
}
26
/42
‫بیدکی‬
-
)‫ روش حریصانه (ادامه‬:‫ فصل چهارم‬- ‫درس طراحی الگوریتم ها‬
‫ساختمان داده مورد استفاده‬
‫‪touch[i]‬‬
‫•اندیس رأس ‪ v‬در ‪ Y‬طوری که یال >‪ <v, vi‬آخرین یال‬
‫روی کوتاه ترین مسیر فعلی از ‪ v1‬به ‪ vi‬فقط با استفاده از‬
‫رئوس ‪ Y‬به عنوان واسط باشد‪( .‬رأس قبل از ‪ vi‬روی‬
‫کوتاهترین مسیر)‬
‫‪length[i]‬‬
‫•طول کوتاهترین مسیر فعلی از ‪ v1‬به ‪ vi‬فقط با استفاده از‬
‫رئوس موجود در ‪Y‬‬
‫درس طراحی الگوریتم ها ‪ -‬فصل چهارم‪ :‬روش حریصانه (ادامه)‬
‫‪-‬‬
‫بیدکی‬
‫‪/42‬‬
‫‪27‬‬
‫الگوریتم دایجسترا ‪...‬‬
‫درس طراحی الگوریتم ها ‪ -‬فصل چهارم‪ :‬روش حریصانه (ادامه)‬
‫‪-‬‬
‫بیدکی‬
‫‪/42‬‬
‫‪28‬‬
‫مثال‬
‫}{ =‪F‬‬
‫}‪Y = {v1‬‬
‫‪v1‬‬
‫‪1‬‬
‫‪7‬‬
‫‪v2‬‬
‫‪4‬‬
‫‪v3‬‬
‫‪5‬‬
‫‪4‬‬
‫‪3‬‬
‫‪1‬‬
‫‪6‬‬
‫‪4‬‬
‫‪7‬‬
‫‪6‬‬
‫‪3‬‬
‫‪2‬‬
‫‪2‬‬
‫‪v5‬‬
‫‪length‬‬
‫‪5‬‬
‫‪1‬‬
‫‪v4‬‬
‫‪5‬‬
‫‪4‬‬
‫‪3‬‬
‫‪2‬‬
‫‪1‬‬
‫‪1‬‬
‫‪1‬‬
‫‪1‬‬
‫درس طراحی الگوریتم ها ‪ -‬فصل چهارم‪ :‬روش حریصانه (ادامه)‬
‫‪-‬‬
‫بیدکی‬
‫‪touch‬‬
‫‪/42‬‬
‫‪29‬‬
‫مثال‬
‫}>‪F= {<v1 , v5‬‬
‫}‪Y = {v1 , v5‬‬
‫‪v1‬‬
‫‪1‬‬
‫‪7‬‬
‫‪v2‬‬
‫‪4‬‬
‫‪v3‬‬
‫‪5‬‬
‫‪4‬‬
‫‪3‬‬
‫‪-1‬‬
‫‪2‬‬
‫‪4‬‬
‫‪7‬‬
‫‪6‬‬
‫‪3‬‬
‫‪2‬‬
‫‪2‬‬
‫‪v5‬‬
‫‪length‬‬
‫‪5‬‬
‫‪1‬‬
‫‪v4‬‬
‫‪5‬‬
‫‪4‬‬
‫‪3‬‬
‫‪2‬‬
‫‪1‬‬
‫‪5‬‬
‫‪1‬‬
‫‪1‬‬
‫درس طراحی الگوریتم ها ‪ -‬فصل چهارم‪ :‬روش حریصانه (ادامه)‬
‫‪-‬‬
‫بیدکی‬
‫‪touch‬‬
‫‪/42‬‬
‫‪30‬‬
‫مثال‬
‫}>‪F= {<v1 , v5>, <v5, v4‬‬
‫} ‪Y = {v1 , v5 , v4‬‬
‫‪v1‬‬
‫‪1‬‬
‫‪7‬‬
‫‪v2‬‬
‫‪4‬‬
‫‪v3‬‬
‫‪5‬‬
‫‪4‬‬
‫‪3‬‬
‫‪-1‬‬
‫‪-1‬‬
‫‪4‬‬
‫‪5‬‬
‫‪6‬‬
‫‪1‬‬
‫‪3‬‬
‫‪2‬‬
‫‪2‬‬
‫‪v5‬‬
‫‪length‬‬
‫‪5‬‬
‫‪v4‬‬
‫‪5‬‬
‫‪4‬‬
‫‪3‬‬
‫‪2‬‬
‫‪1‬‬
‫‪5‬‬
‫‪1‬‬
‫‪4‬‬
‫درس طراحی الگوریتم ها ‪ -‬فصل چهارم‪ :‬روش حریصانه (ادامه)‬
‫‪-‬‬
‫بیدکی‬
‫‪touch‬‬
‫‪/42‬‬
‫‪31‬‬
‫مثال‬
‫}>‪F= {<v1 , v5>, <v5, v4>, <v1,v3‬‬
‫}‪Y = {v1 , v5 , v4 , v3‬‬
‫‪v1‬‬
‫‪1‬‬
‫‪7‬‬
‫‪v2‬‬
‫‪4‬‬
‫‪v3‬‬
‫‪5‬‬
‫‪4‬‬
‫‪3‬‬
‫‪-1‬‬
‫‪-1‬‬
‫‪-1‬‬
‫‪5‬‬
‫‪6‬‬
‫‪1‬‬
‫‪3‬‬
‫‪2‬‬
‫‪2‬‬
‫‪v5‬‬
‫‪length‬‬
‫‪5‬‬
‫‪v4‬‬
‫‪5‬‬
‫‪4‬‬
‫‪3‬‬
‫‪2‬‬
‫‪1‬‬
‫‪5‬‬
‫‪1‬‬
‫‪4‬‬
‫درس طراحی الگوریتم ها ‪ -‬فصل چهارم‪ :‬روش حریصانه (ادامه)‬
‫‪-‬‬
‫بیدکی‬
‫‪touch‬‬
‫‪/42‬‬
‫‪32‬‬
‫مثال‬
‫}>‪F= {<v1 , v5>, <v5, v4>, <v1,v3>, <v4,v2‬‬
‫}‪Y = {v1 , v5 , v4 , v3 , v2‬‬
‫‪v1‬‬
‫‪1‬‬
‫‪7‬‬
‫‪v2‬‬
‫‪4‬‬
‫‪v3‬‬
‫‪5‬‬
‫‪4‬‬
‫‪3‬‬
‫‪-1‬‬
‫‪-1‬‬
‫‪-1‬‬
‫‪-1‬‬
‫‪6‬‬
‫‪1‬‬
‫‪3‬‬
‫‪2‬‬
‫‪2‬‬
‫‪v5‬‬
‫‪length‬‬
‫‪5‬‬
‫‪v4‬‬
‫‪5‬‬
‫‪4‬‬
‫‪3‬‬
‫‪2‬‬
‫‪1‬‬
‫‪5‬‬
‫‪1‬‬
‫‪4‬‬
‫درس طراحی الگوریتم ها ‪ -‬فصل چهارم‪ :‬روش حریصانه (ادامه)‬
‫‪-‬‬
‫بیدکی‬
‫‪touch‬‬
‫‪/42‬‬
‫‪33‬‬
‫مثال ‪2‬‬
‫‪‬مسئله ‪ :‬یافتن کوتاهترین مسیر از رأس ‪ A‬به بقیه‬
‫رئوس‬
‫در گراف با وزن های غیر منفی‬
‫درس طراحی الگوریتم ها ‪ -‬فصل چهارم‪ :‬روش حریصانه (ادامه)‬
‫‪-‬‬
‫بیدکی‬
‫‪/42‬‬
‫‪34‬‬