550 likes | 978 Views
درس طراحی الگوریتم ها. فصل چهارم (ادامه). روش حریصانه Greedy approach. مدرس: سید محمد بیدکی. بهار 1392. مقدمه.
E N D
درس طراحی الگوریتم ها فصل چهارم (ادامه) روش حریصانه Greedy approach مدرس: سید محمد بیدکی بهار 1392
مقدمه گراف بدون جهت: شامل یک مجموعه متناهی و غیر تهی V می باشد که عناصر آن را رئوس گراف G می نامیم. به همراه مجموعه E که شامل مجموعه ای از زوج رئوس (یال) در V می باشد. گراف جهت دار: در گراف جهت دار هر یال دارای ابتدا و انتها می باشد. به عبارت دیگر (v, u) با (u ,v) فرق دارد. مسیر(Path): دنباله ای از رئوس (v1 , v2 ,…, vk) به گونه ای که هر یال (vi-1, vi) در E وجود داشته باشد. چرخه(cycle): مسیری از یک رأس به خودش گراف هم بند (متصل): اگر از هر رأس به رئوس دیگر مسیری وجود داشته باشد. گراف وزن دار: گرافی که یال های آن دارای ارزش (وزن) باشند. درس طراحی الگوریتم ها - فصل چهارم: روش حریصانه (ادامه) - بیدکی
مقدمه درخت(Tree) : گراف هم بند، بدون جهت و بدون چرخه است. رأس wمجاور رأس u می باشد اگر یالی از w به u وجود داشته باشد. دور اویلری: چرخه ای که از تمام یال های گراف دقیقاً یک بار عبور می کند. دور همیلتونی: چرخه ای که از تمام رئوس گراف دقیقاً یک بار عبور می کند. درس طراحی الگوریتم ها - فصل چهارم: روش حریصانه (ادامه) - بیدکی
نمایش گراف • G = (V, E) یک گراف با n رأس و e یال می باشد. • ماتریس مجاورت: یک ماتریس n*n که برای هر دو رأسی که بین آنها یال وجود دارد، درایه متناظر آن 1 و در غیر این صورت 0 است. • در گراف وزن دار، وزن ها را در ماتریس مجاورت ذخیره می کنند. • لیست مجاورت: یک آرایه n عضوی از اشاره گرها می باشد که هر خانه آن به یک لیست پیوندی که شامل رئوس مجاور آن رأس است اشاره می کند. درس طراحی الگوریتم ها - فصل چهارم: روش حریصانه (ادامه) - بیدکی
مثال 1 2 3 ماتریس مجاورتی 5 4 لیست مجاورتی درس طراحی الگوریتم ها - فصل چهارم: روش حریصانه (ادامه) - بیدکی
درخت پوشای کمینه (minimum spanning tree) • مسئله: یافتن درختی در یک گراف که شامل تمام رئوس آن گراف باشد(پوشا) و مجموع وزن یالها در آن حداقل باشد. • کاربردهای مسئله: • در راهسازی می خواهیم چند شهر معین را با حداقل هزینه (کمترین جاده) به یکدیگر وصل کنیم به طوری که مردم بتوانند از هر شهر به شهر دیگر سفر کنند. • در ارتباطات راه دور می خواهیم حداقل طول کابل استفاده شود. • در طراحی مدارات الکترونیکی به طور معمول لازم است پایه های چندین قطعه را از طریق سیم کشی آنها به یکدیگر، از نظر الکتریکی معادل سازیم. • برای اتصال n پایه، می توان از چیدمان n-1 سیمی (کمترین تعداد سیم) استفاده کرد که هر کدام دو پایه را متصل می کند. درس طراحی الگوریتم ها - فصل چهارم: روش حریصانه (ادامه) - بیدکی
مثال v1 1 v2 3 3 6 4 v3 v4 • نظریه Cayley: برای گراف کامل با n گره تعداد nn-2 درخت پوشا وجود دارد. • استفاده از الگوریتم brute-force هزینه زیادی دارد. 2 5 v5 v1 1 v2 v1 1 v2 3 6 3 4 v3 v4 v3 v4 2 5 v5 v5 هزینه 15 هزینه 10 یافتن درخت پوشا در گراف درس طراحی الگوریتم ها - فصل چهارم: روش حریصانه (ادامه) - بیدکی
الگوریتم حریصانه • مسئله درخت پوشای کمینه از دسته مسائل بهینه سازی می باشد. • هدف یافتن زیرمجموعه F از E است به گونه ای که T=(V, F) درخت پوشای کمینه برای G=(V,E) باشد. • برای یافتن MST سه الگوریتم حریصانه وجود دارد: • الگوریتم Prim • الگوریتم Kruskal • الگوریتم reverse-delete درس طراحی الگوریتم ها - فصل چهارم: روش حریصانه (ادامه) - بیدکی
الگوریتم پریم (Prim) • مبنای کار الگوریتم انتخاب بهترین رأس در هر لحظه است. • ملاک بهینه محلی: انتخاب نزدیک ترین رأس به رئوس موجود در مجموعه Y • روند اجرای الگوریتم: • F زیرمجموعه ای تهی از یال ها • Y حاوی یک رأس دلخواه • انتخاب نزدیکترین رأس از مجموعه V-Y به رئوس Y • اضافه کردن رأس انتخاب شده به Y و یال مربوطه به F • الگوریتم تا زمانی که تمام رئوس به Y اضافه شوند ادامه می یابد. درس طراحی الگوریتم ها - فصل چهارم: روش حریصانه (ادامه) - بیدکی
الگوریتم پریم اندیس نزدیک ترین رأس در Y به vi =nearest[i] وزن یال میان vi و رأسی که توسط nearest[i] مشخص شده است = distance[i]
مثال v1 1 v2 3 3 6 4 v4 v3 2 5 v5 برای نمایش گراف از ماتریس مجاورتی استفاده می کنیم: درس طراحی الگوریتم ها - فصل چهارم: روش حریصانه (ادامه) - بیدکی
مثال F = Ø Y V-Y v1 1 v2 v1 v2 1 3 3 6 v3 3 4 v4 v3 ∞ v4 ∞ v5 2 5 v5 درس طراحی الگوریتم ها - فصل چهارم: روش حریصانه (ادامه) - بیدکی
مثال F = {{v1 , v2}} Y V-Y v1 1 v2 v3 v1 3 3 3 3 6 ∞ v4 4 v4 v3 6 v2 ∞ v5 2 5 ∞ v5 درس طراحی الگوریتم ها - فصل چهارم: روش حریصانه (ادامه) - بیدکی
مثال F = {{v1 , v2},{v1 , v3}} Y V-Y v1 1 v2 v1 ∞ v4 3 v2 3 6 6 4 4 v4 v3 ∞ ∞ v5 v3 2 2 5 v5 درس طراحی الگوریتم ها - فصل چهارم: روش حریصانه (ادامه) - بیدکی
مثال F = {{v1 , v2},{v1 , v3},{v3 , v5}} Y V-Y v1 1 v2 v1 3 v2 ∞ 3 6 6 v4 4 v4 v3 4 v3 5 v5 2 5 v5 درس طراحی الگوریتم ها - فصل چهارم: روش حریصانه (ادامه) - بیدکی
مثال F = {{v1 , v2},{v1 , v3},{v3 , v5},{v3 , v4}} Y V-Y v1 1 v2 v1 v2 3 v3 4 v4 v3 v5 2 v4 v5 درس طراحی الگوریتم ها - فصل چهارم: روش حریصانه (ادامه) - بیدکی
پیچیدگی زمانی در حلقه repeat دو حلقه وجود دارد که هرکدام n-1 بار تکرار می شوند. حلقه repeat هم به تعداد n-1 بار تکرار میشود. اندازه ورودی: nتعداد رئوس T(n) = 2 (n-1) (n-1) = Ө(n2) درس طراحی الگوریتم ها - فصل چهارم: روش حریصانه (ادامه) - بیدکی
الگوریتم کروسکال (Kruskal) • این الگوریتم در هر لحظه بهترین یال را انتخاب میکند. • مراحل اجرای الگوریتم کروسکال • F = Ø مجموعه یالها • ایجاد مجموعه های مستقل از رئوس (در ابتدا هر رأس، در یک مجموعه) • مرتب سازی یالها براساس وزن به صورت صعودی • انتخاب یال با کمترین وزن • بررسی امکان سنجی: اگر یال انتخاب شده دو مجموعه مجزا را به یکدیگر وصل کند به مجموعه جواب (F) اضافه می شود و دو مجموعه ادغام می گردند. • تا زمانی که تمام رئوس در یک مجموعه قرار نگرفته اند، مراحل از ۴ تکرار میشوند. درس طراحی الگوریتم ها - فصل چهارم: روش حریصانه (ادامه) - بیدکی
مثال F = {{v1 , v2},{v3 ,v5},{v2 ,v3},{v3 ,v4}} F = {{v1 , v2},{v3, v5}} F = {{v1 , v2},{v3 ,v5},{v2 ,v3}} F = {{v1 , v2}} F = Ø 1. ایجاد مجموعه های مستقل از V v1 1 v2 v1 v3 3 v5 3 6 4 v4 v3 v2 v4 2 5 v5 2. مرتب سازی یالها به ترتیب صعودی درس طراحی الگوریتم ها - فصل چهارم: روش حریصانه (ادامه) - بیدکی
الگوریتم درس طراحی الگوریتم ها - فصل چهارم: روش حریصانه (ادامه) - بیدکی
تحلیل پیچیدگی W(m, n) ∈ Θ(m lgm) = Θ(n2 lgn2) = Θ(n2 2 lgn) = Θ(n2 lgn) • اندازه ورودی:n تعداد رئوس و m تعداد یالها • زمان لازم برای ایجاد n مجموعه مجزا • زمان لازم برای مرتب سازی یالها • زمان عملیات موجود در حلقه while • در بدترین حالت هر رأس را می توان به هر یک از رئوس دیگر متصل کرد: • m = n (n-1) / 2 ∈ Ө(n2) درس طراحی الگوریتم ها - فصل چهارم: روش حریصانه (ادامه) - بیدکی
مقایسه الگوریتم های Prim & Kruskal • n-1≤ m ≤ n(n-1)/2 الگوریتم پریم از مرتبه Ө(n2) الگوریتم کروسکال از مرتبه Ө(m lgm) = Ө(n2lgn) تعداد یالها در بازه زیر قرار دارد: اگر تعداد يال ها نزديك به كرانه پاييني باشد، الگوريتم كروسكالӨ(n lgn)است و بايد سريعتر از پريم باشد. اگر تعداد يال ها نزديك به كرانه بالايي باشد، الگوريتم كروسكال Ө(n2lgn)است ، يعني الگوريتم پريم بايد سريعتر باشد. درس طراحی الگوریتم ها - فصل چهارم: روش حریصانه (ادامه) - بیدکی
مسئله یافتن کوتاهترین مسیر (shortest path) • مسئله کوتاهترین مسیر یک مسئله بهینه سازی است. • مثال: یک مسئله مهم در سفرهای هوایی که پرواز مستقیم وجود ندارد، تعیین کوتاهترین مسیر پرواز از یک شهر به شهر دیگر است. • برای حل این مسئله از الگوریتم های گراف بهره میگیریم: • الگوریتم فلوید (Floyd) که از روش برنامه نویسی پویا استفاده می کند. • تمام کوتاهترین مسیرهای بین هر دو رأس را بدست می آورد. • (مراجعه به کتاب) • الگوریتم دایجسترا Dijkstra)) که یک الگوریتم حریصانه است. • این الگوریتم مسئله کوتاهترین مسیر تک مبدأ را حل می کند. درس طراحی الگوریتم ها - فصل چهارم: روش حریصانه (ادامه) - بیدکی
الگوریتم Brute-force (n-2) (n-3) . . . 1 = (n-2) ! • تعیین طول همه مسیرها برای هر رأس، از آن رأس به هر یک از رئوس دیگر • مرتبه زمانی روش فوق بدتر از نمایی است: • فرض کنید که از هر رأس یک یال به همه رئوس وجود داشته باشد. همچنین مسیر بین دو رأس مبدأ و مقصد از همه رئوس عبورکند. • رأس دوم در چنین مسیری می تواند هر یک از n-2رأس دیگر باشد، رأس سوم در چنین مسیری می تواند هر یک از n-3رأس دیگر باشد، ... و رأس یکی مانده به آخری در چنین مسیری فقط می تواند یک رأس باشد. • بنابراین تعداد کل مسیرها از یک رأس به رأس دیگر که از همه رئوس دیگر بگذرد عبارت است از: درس طراحی الگوریتم ها - فصل چهارم: روش حریصانه (ادامه) - بیدکی
الگوریتم دایجسترا (Dijkstra) هدف یافتن کوتاهترین مسیر از یک رأس مشخص تا تمام رئوس دیگر استدر یک گراف جهتدار موزون. به دلیل استفاده از روش حریصانه در هر مرحله باید بخشی از جواب بدست آید. بنابراین از کوتاهترین مسیر شروع کرده و به سمت مسیرهای طولانی تر می رویم. Y ={v1} مجموعه رئوسی که کوتاهترین مسیر از گره مبدأ تا آنها پیدا شده است. در هر مرحله، کوتاهترین مسیر بعدی که از v1 شروع می شود و از رئوس داخل Y می گذرد و به رأسی می رسد که تا حالا مسیری برای آن پیدا نشده است، ثبت می شود. در صورت اضافه شدن رأس جدیدی به Y، باید تأثیر مثبت آن را در طول مسیر رئوسی که در Yنیستند بررسی و اعمال کرد. درس طراحی الگوریتم ها - فصل چهارم: روش حریصانه (ادامه) - بیدکی
الگوریتم دایجسترا درس طراحی الگوریتم ها - فصل چهارم: روش حریصانه (ادامه) - بیدکی 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; }
ساختمان داده مورد استفاده • touch[i] • اندیس رأس v در Y طوری که یال <v, vi> آخرین یال روی کوتاه ترین مسیر فعلی از v1 به vi فقط با استفاده از رئوس Y به عنوان واسط باشد. (رأس قبل از vi روی کوتاهترین مسیر) • length[i] • طول کوتاهترین مسیر فعلی از v1 به vi فقط با استفاده از رئوس موجود در Y درس طراحی الگوریتم ها - فصل چهارم: روش حریصانه (ادامه) - بیدکی
الگوریتم دایجسترا ... درس طراحی الگوریتم ها - فصل چهارم: روش حریصانه (ادامه) - بیدکی
مثال F= {} Y = {v1} v1 1 7 v5 v2 4 6 1 3 2 v4 v3 5 درس طراحی الگوریتم ها - فصل چهارم: روش حریصانه (ادامه) - بیدکی
مثال F= {<v1, v5>} Y = {v1 , v5} v1 1 7 v5 v2 4 6 1 3 2 v4 v3 5 درس طراحی الگوریتم ها - فصل چهارم: روش حریصانه (ادامه) - بیدکی
مثال F= {<v1, v5>, <v5, v4>} Y = {v1 , v5 , v4 } v1 1 7 v5 v2 4 6 1 3 2 v4 v3 5 درس طراحی الگوریتم ها - فصل چهارم: روش حریصانه (ادامه) - بیدکی
مثال F= {<v1, v5>, <v5, v4>, <v1,v3>} Y = {v1 , v5 , v4 , v3} v1 1 7 v5 v2 4 6 1 3 2 v4 v3 5 درس طراحی الگوریتم ها - فصل چهارم: روش حریصانه (ادامه) - بیدکی
مثال F= {<v1, v5>, <v5, v4>, <v1,v3>, <v4,v2>} Y = {v1 , v5 , v4 , v3 , v2} v1 1 7 v5 v2 4 6 1 3 2 v4 v3 5 درس طراحی الگوریتم ها - فصل چهارم: روش حریصانه (ادامه) - بیدکی
مثال 2 • مسئله : یافتن کوتاهترین مسیر از رأس A به بقیه رئوس • در گراف با وزن های غیر منفی درس طراحی الگوریتم ها - فصل چهارم: روش حریصانه (ادامه) - بیدکی