Summary

These notes cover fundamental concepts of graph theory, including graph representations, graph search algorithms (DFS and BFS), spanning trees, and Dijkstra's algorithm. Key terms and ideas used in graph theory are defined and explained in detail. Useful for students in computer science, mathematics, and related fields.

Full Transcript

Graph ‫‪Graph‬‬ ‫‪ ‬گراف یک ساختار داده غیر خطی است که از تعدادی راس و یال تشکیل شده‬ ‫است‪.‬‬ ‫‪ ‬رئوس گاهی اوقات به عنوان گره نیز شناخته می شوند و یال ها خطوط یا کمانی‬ ‫هستند که هر دو گره را در گراف به ه...

Graph ‫‪Graph‬‬ ‫‪ ‬گراف یک ساختار داده غیر خطی است که از تعدادی راس و یال تشکیل شده‬ ‫است‪.‬‬ ‫‪ ‬رئوس گاهی اوقات به عنوان گره نیز شناخته می شوند و یال ها خطوط یا کمانی‬ ‫هستند که هر دو گره را در گراف به هم متصل می کنند‪.‬‬ ‫‪ ‬به طور رسمی تر‪ ،‬نمودار از مجموعه ای از رئوس (‪ )V‬و مجموعه ای از یال ها‬ ‫(‪ )E‬تشکیل شده است‪.‬گراف با )‪ G(E, V‬نشان داده می شود‪.‬‬ ‫‪ ‬از گراف ها برای حل بسیاری از مسائل زندگی واقعی استفاده می شود‪.‬‬ ‫‪ ‬از گ‪C‬راف ه‪C‬ا ب‪C‬رای نم‪C‬ایش ش‪C‬بکه ه‪C‬ا اس‪C‬تفاده می ش‪C‬ود‪.‬این ش‪C‬بکه ه‪C‬ا ممکن اس‪C‬ت‬ ‫شامل مسیرهایی در یک شهر یا شبکه تلفن یا شبکه مدار باشند‪.‬‬ ‫‪ ‬گراف ه‪C‬ا همچ‪C‬نین در ش‪C‬بکه ه‪C‬ای اجتم‪C‬اعی مانن‪C‬د لینک‪C‬دین‪ ،‬فیس‪C‬بوک اس‪C‬تفاده می‬ ‫ش‪C‬وند‪.‬ب‪C‬ه عن‪C‬وان مث‪C‬ال‪ ،‬در فیس ب‪C‬وک‪ ،‬ه‪C‬ر ش‪C‬خص ب‪C‬ا ی‪C‬ک راس (ی‪C‬ا گ‪C‬ره) نش‪C‬ان داده می‬ ‫ش‪C‬ود‪.‬ه‪C‬ر گ‪C‬ره ی‪C‬ک س‪C‬اختار اس‪C‬ت و ح‪C‬اوی اطالع‪C‬اتی مانن‪C‬د شناس‪C‬ه ش‪C‬خص‪ ،‬ن‪C‬ام‪،‬‬ ‫جنسیت‪ ،‬منطقه و غیره است‪.‬‬ ‫‪Types of Graphs‬‬ ‫گراف های غیر جهت دار (‪ :)Undirected Graphs‬گ‪C‬رافی ک‪C‬ه در آن ی‪C‬ال ه‪C‬ا جه‪C‬تی ندارن‪C‬د‪ ،‬یع‪C‬نی ی‪C‬ال‬ ‫ه‪C‬ا دارای فلش ه‪C‬ای نش‪C‬ان دهن‪C‬ده جهت پیم‪C‬ایش نیس‪C‬تند‪.‬مث‪C‬ال‪ :‬گ‪C‬راف ش‪C‬بکه اجتم‪C‬اعی ک‪C‬ه در آن دوس‪C‬تی ه‪C‬ا‬ ‫جهت دار نیستند‪.‬‬ ‫گراف های جهت دار (‪ :)Directed Graphs‬گ‪C‬رافی ک‪C‬ه در آن ی‪C‬ال ه‪C‬ا دارای جهت هس‪C‬تند‪ ،‬یع‪C‬نی ی‪C‬ال‬ ‫ه‪C‬ا دارای فلش ه‪C‬ایی هس‪C‬تند ک‪C‬ه جهت پیم‪C‬ایش را نش‪C‬ان می ده‪C‬د‪.‬مث‪C‬ال‪ :‬گ‪C‬راف ص‪C‬فحه وب ک‪C‬ه در آن پیون‪C‬دهای‬ ‫بین صفحات جهت دار هستند‪.‬‬ ‫گراف ه ای وزن دار (‪ :)Weighted Graphs‬گ‪C‬رافی ک‪C‬ه در آن ی‪C‬ال ه‪C‬ا دارای وزن ی‪C‬ا هزین‪C‬ه ه‪C‬ای‬ ‫مرتب‪C‬ط ب‪C‬ا آنه‪C‬ا هس‪C‬تند‪.‬مث‪C‬ال‪ :‬گ‪C‬راف ش‪C‬بکه ج‪C‬اده ای ک‪C‬ه در آن وزن ه‪C‬ا می توانن‪C‬د فاص‪C‬له بین دو ش‪C‬هر را نش‪C‬ان‬ ‫دهند‪.‬‬ ‫گراف های بدون وزن (‪ :)Unweighted Graphs‬گ‪C‬رافی ک‪C‬ه در آن ی‪C‬ال ه‪C‬ا وزن ی‪C‬ا هزین‪C‬ه ای مرتب‪C‬ط‬ ‫با آنها ندارند‪.‬مثال‪ :‬گراف شبکه اجتماعی که در آن لبه ها نشان دهنده دوستی هستند‪.‬‬ ‫گراف های کامل (‪ :)Complete Graphs‬گ‪C‬رافی ک‪C‬ه در آن ه‪C‬ر رأس ب‪C‬ه تم‪C‬امی رئ‪C‬وس دیگ‪C‬ر متص‪C‬ل‬ An undirected graph A directed graph Graph terminology Graph terminology Graph terminology Graph terminology ‫‪Graph Representation‬‬ ‫دو روش زیر متداول ترین شیوه های نمایش گراف به شمار می روند‪.‬‬ ‫ ماتریس مجاورت (‪)Adjacency Matrix‬‬ ‫ ماتریس مج‪C‬اورت ی‪C‬ک آرای‪C‬ه دو بع‪C‬دی ب‪C‬ه ان‪C‬دازه ‪ V x V‬اس‪C‬ت که‪ V‬تع‪C‬داد رئ‪C‬وس گ‪C‬راف‬ ‫است‪.‬‬ ‫ آرای‪C‬ه دو بع‪C‬دی‪ ][][adj‬را در نظ‪C‬ر بگیری‪C‬د‪ ،‬مق‪C‬دار ی‪C‬ک در خان‪C‬ه ‪ i‬و ‪j‬ام (‪)adj[i][j] = 1‬‬ ‫نشان می‌دهد که یک یال از راس‪ i‬به راس‪ j‬وجود دارد‪.‬‬ ‫ ماتریس مجاورت برای یک گراف بدون جهت همیشه متقارن است‪.‬‬ ‫ ماتریس مج‪C‬اورت ب‪C‬رای نم‪C‬ایش گ‪C‬راف ه‪C‬ای وزن دار اس‪C‬تفاده می ش‪C‬ود‪.‬اگ‪C‬ر ]‪adj[i][j‬‬ ‫‪ ،= w‬آنگاه یک یال از راس‪ i‬به راس‪ j‬با وزن‪ w‬وجود دارد‪.‬‬ ‫ لیست مجاورت (‪)Adjacency List‬‬ ‫لیست مجاورت یک راه ساده برای نمایش یک نمودار به عنوان لیستی از‬ Graph Representation Graph Search Depth-First-Search (DFS) : Follow Down Depth-First-Search (DFS) DFS(G,v) ( v is the vertex where the search starts ) Stack S := {}; ( start with an empty stack ) for each vertex u, set visited[u] := false; push S, v; while (S is not empty) do u := pop S; if (not visited[u]) then visited[u] := true; for each unvisited neighbour w of u push S, w; end if end while END DFS() Depth-First-Search (DFS) Depth-First-Search (DFS) Depth-First-Search (DFS) Depth-First-Search (DFS) Depth-First-Search (DFS) Depth-First-Search (DFS) Breadth-First-Searching (BFS) Breadth-First-Searching (BFS) Breadth-First-Searching (BFS) Breadth-First-Searching (BFS) Breadth-First-Searching (BFS) Breadth-First-Searching (BFS) Breadth-First-Searching (BFS) Breadth-First-Searching (BFS) Breadth-First-Searching (BFS) ‫درخت پوشا ‪Spanning Tree-‬‬ ‫‪ ‬درخت پوش‪C‬ا زیرمجم‪C‬وعه‌ای از گ‪C‬راف‪ G‬اس‪C‬ت ک‪C‬ه هم‪C‬ه رئ‪C‬وس آن ب‪C‬ا کم‪C‬ترین مق‪C‬دار‬ ‫یال‌ه‪C‬ای ممکن پوش‪C‬ش یافت‪C‬ه اس‪C‬ت‪.‬از این رو ی‪C‬ک درخت پوش‪C‬ا دور ن‪C‬دارد و هیچ رأس‬ ‫ناهمبندی در آن دیده نمی‌شود‪.‬‬ ‫‪ ‬بر اس‪C‬اس تعری‪C‬ف ف‪C‬وق می‌ت‪C‬وانیم نتیج‪C‬ه بگ‪C‬یریم ک‪C‬ه ه‪C‬ر گ‪C‬راف ک‪C‬امًال همبن‪C‬د و غ‪C‬یر‬ ‫جهت‌دار‪ G‬دس‪C‬ت‌کم ی‪C‬ک درخت پوش‪C‬ا دارد‪.‬ی‪C‬ک گ‪C‬راف ناهمبن‪C‬د؛ هیچ درخت پوش‪C‬ایی‬ ‫ندارد‪ ،‬چون امکان پوشش همه رئوس آن میسر نیست‪.‬‬ ‫مشخصات کلی درخت پوشا‬ ‫اینک که دانستیم یک گراف می‌تواند بیش از یک درخت پوشا داشته باشد‪.‬در ادامه چند مورد از‬ ‫مشخصات درخت پوشای همبند با درخت‪ G‬را بررسی می‌کنیم‪:‬‬ ‫‪ ‬یک گراف همبند‪ G‬می‌تواند بیش از یک درخت پوشا داشته باشد‪.‬‬ ‫‪ ‬همه درخت‌های پوشای گراف‪ G‬تعداد یکسانی از یال‌ها و رئوس را دارند‪.‬‬ ‫‪ ‬درخت پوشا هیچ دوری ندارد‪.‬‬ ‫‪ ‬با حذف یک یال از درخت پوشا‪ ،‬به گراف غیر همبند تبدیل می‌شود‪ ،‬یعنی درخت پوشا دارای‬ ‫کمینه اتصال‌های ممکن است‪.‬‬ ‫‪ ‬افزودن یک یال به درخت پوشا موجب ایجاد یک مدار یا طوقه می‌شود‪ ،‬یعنی درخت پوشا در‬ ‫حالت بیشینه غیر دوری (‪ ) maximally acyclic‬است‪.‬‬ ‫‪ ‬درخت پوشا ‪ n-1‬یال دارد که ‪ n‬تعداد گره‌های (رأس‌های) آن است‪.‬‬ ‫‪Minimum Spanning Tree-‬‬ ‫خت پوشا کمینه‬ ‫در ی‪C‬ک گ‪C‬راف وزن‌دار‪ ،‬درخت پوش‪C‬ای کمین‪C‬ه‪ ،‬آن درخت پوش‪C‬ایی اس‪C‬ت ک‪C‬ه کم‪C‬ترین وزن‬ ‫ته‪C‬ای دنی‪C‬ای‬ ‫ته‪C‬ای پوش‪C‬ای هم‪C‬ان گ‪C‬راف داش‪C‬ته باش‪C‬د‪.‬در موقعی ‌‬ ‫را نس‪C‬بت ب‪C‬ه دیگ‪C‬ر درخ ‌‬ ‫واقعی این وزن می‌توان‪C‬د ب‪C‬ر اس‪C‬اس مس‪C‬افت‪ ،‬ازدح‪C‬ام‪ ،‬ب‪C‬ار ت‪C‬رافیکی‪ ،‬ی‪C‬ا ه‪C‬ر مق‪C‬دار‬ ‫دلخواهی که به یال‌ها اختصاص می‌یابد اندازه‌گیری شود‪.‬‬ ‫دو مورد از مهم‌ترین الگوریتم‌های درخت پوشای کمینه به‬ ‫صورت زیر هستند‪:‬‬ ‫‪ ‬الگوریتم کروسکال ‪kruskal‬‬ ‫‪ ‬الگوریتم پریم ‪Prim‬‬ ‫هر دو این الگوریتم‌ها در دسته الگوریتم‌های حریصانه قرار‬ ‫الگوریتم کراسکال‬ ‫الگ‪C‬وریتم کروس‪C‬کال ب‪C‬رای ی‪C‬افتن درخت پوش‪C‬ای ب‪C‬ا کم‪C‬ترین هزین‪C‬ه از رویک‪C‬رد حریص‪C‬انه به‪C‬ره می‌گ‪C‬یرد‪.‬این‬ ‫الگ‪C‬وریتم ب‪C‬ا گ‪C‬راف ب‪C‬ه ص‪C‬ورت ی‪C‬ک جنگ‪C‬ل برخ‪C‬ورد می‌کن‪C‬د ک‪C‬ه در آن ه‪C‬ر گ‪C‬ره ی‪C‬ک درخت منف‪C‬رد محس‪C‬وب‬ ‫یش‪C‬ود اگ‪C‬ر و فق‪C‬ط اگ‪C‬ر در می‪C‬ان هم‪C‬ه گزینه‌ه‪C‬ای موج‪C‬ود‪،‬‬ ‫یش‪C‬ود‪.‬ی‪C‬ک درخت زم‪C‬انی ب‪C‬ه درخت دیگ‪C‬ر وص‪C‬ل م ‌‬ ‫م ‌‬ ‫کمترین هزینه را داشته باشد و مشخصات درخت پوشای کمینه را نیز نقض نکند‪.‬‬ ‫الگوریتم کراسکال‬ ‫گام ‪ – 1‬حذف همه یال‌های طوقه و موازی‬ ‫همه یال‌های طوقه و یال‌های موازی را از گراف فوق حذف می‌کنیم‪.‬‬ ‫در مورد یال‌های موازی‪ ،‬آن یالی را نگه می‌داریم که کمترین هزینه را دارد و‬ ‫بقیه را حذف می‌کنیم‪.‬‬ ‫الگوریتم کراسکال‬ ‫گام ‪ – 2‬چیدمان همه یال‌ها به ترتیب افزایش وزن‬ ‫در این مرحله مجموعه‌ای از یال‌ها و وزن‌هایشان ایجاد می‌کنیم و آن‌ها را بر اساس‬ ‫ترتیب افزایش وزن (هزینه) می‌چینیم‪.‬‬ ‫الگوریتم کراسکال‬ ‫‪ – 3‬یالی که کمترین وزن را دارد اضافه می‌کنیم‬ ‫اینک برای افزودن یال‌ها به گراف‪ ،‬کار خود را از یالی آغاز می‌کنیم که کمترین وزن را‬ ‫دارد‪.‬در تمام طول این فرایند بررسی می‌کنیم که مشخصات پوشا بودن همچنان‬ ‫برقرار باشد‪.‬در موردی که با افزودن یک یال مشخصات درخت پوشا نقض شود‪،‬‬ ‫نمی‌بایست این یال را وارد گراف کنیم‪.‬‬ ‫الگوریتم کراسکال‬ ‫کم‪C‬ترین هزین‪C‬ه ‪ 2‬اس‪C‬ت و یال‌ه‪C‬ای مرب‪C‬وط ب‪C‬ه آن‪ B,D‬و‪ D,T‬هس‪C‬تند‪.‬آن‌ه‪C‬ا را ب‪C‬ه گ‪C‬راف‬ ‫اض‪C‬افه می‌ک‪C‬نیم‪.‬ب‪C‬ا اف‪C‬زودن این دو ی‪C‬ال‪ ،‬مشخص‪C‬ات درخت پوش‪C‬ا نقض نمی‌ش‪C‬ود‪ ،‬بن‪C‬ابراین‬ ‫ک‪C‬ار خ‪C‬ود را ادام‪C‬ه داده و یال‌ه‪C‬ای بع‪C‬دی را انتخ‪C‬اب می‌ک‪C‬نیم‪.‬در مرحل‪C‬ه بع‪C‬د هزین‪C‬ه ‪ 3‬اس‪C‬ت‬ ‫و یال‌های مربوطه ‪ A,C‬و‪ C,D‬هستند‪.‬آن‌ها را نیز اضافه می‌کنیم‪.‬‬ ‫الگوریتم کراسکال‬ ‫هزینه بعدی در جدول‪ 4 ،‬است و می‌بینیم که با افزودن یال مربوط به این وزن‪ ،‬یک دور‬ ‫در گراف ایجاد می‌شود‪.‬‬ ‫این یال را نادیده می‌گیریم‪ ،‬چون قرار است در این فرایند همه یال‌هایی که باعث ایجاد‬ ‫دور در گراف می‌شوند را نادیده بگیریم‪.‬‬ ‫الگوریتم کراسکال‬ ‫اینک مشاهده می‌کنیم که یال‌های مربوط به وزن‌های ‪ 5‬و ‪ 6‬نیز دور ایجاد می‌کنند و‬ ‫آن‌ها را نیز نادیده گرفته و به کار خود ادامه می‌دهیم‬ ‫در این زمان تنها یک گره مانده است که باید اضافه شود‪.‬بین دو یال با کمترین هزینه ‪7‬‬ ‫و ‪ 8‬می‌بایست یالی که وزن ‪ 7‬دارد را اضافه کنیم‪.‬‬ ‫افزودن یال ‪ S,A‬همه گره‌ها در گراف شامل شده‌اند و اینک درخت پوشای با‬ ‫کمترین هزینه را داریم‪.‬‬ ‫الگوریتم کراسکال‬ ‫الگوریتم پریم‬ ‫‪ ‬الگ‪C‬وریتم پ‪C‬ریم ب‪C‬رای ی‪C‬افتن درخت پوش‪C‬ای ب‪C‬ا کم‪C‬ترین هزین‪C‬ه (همانن‪C‬د الگ‪C‬وریتم کروس‪C‬کال‬ ‫که در بخش قبل بررسی کردیم) از رویکرد حریصانه بهره می‌گیرد‪.‬‬ ‫‪ ‬الگ‪C‬وریتم پ‪C‬ریم ش‪C‬باهت‌هایی ب‪C‬ا الگوریتم‌ه‪C‬ای «کوت‪C‬اه‌ترین مس‪C‬یر‪ ،‬اول» ‪shortest‬‬ ‫‪ path first‬دارد‪.‬‬ ‫‪ ‬الگ‪C‬وریتم پ‪C‬ریم در تض‪C‬اد ب‪C‬ا الگ‪C‬وریتم کروس‪C‬کال اس‪C‬ت‪ ،‬چ‪C‬ون ب‪C‬ا گره‌ه‪C‬ا ب‪C‬ه عن‪C‬وان ی‪C‬ک‬ ‫درخت منف‪C‬رد برخ‪C‬ورد می‌کن‪C‬د و ب‪C‬ه اف‪C‬زودن گره‌ه‪C‬ا ب‪C‬ه ی‪C‬ک درخت پوش‪C‬ا از گ‪C‬راف‬ ‫مفروض ادامه می‌دهد‪.‬‬ ‫الگوریتم پریم‬ ‫م ‪ – 1‬حذف همه یال‌های طوقه و موازی‬ ‫همه یال‌های طوقه و همچنین یال‌های موازی را از گراف مفروض حذف می‌کنیم‪.‬در‬ ‫مورد یال‌های موازی‪ ،‬یال‌هایی را حفظ می‌کنیم که کمترین هزینه را دارند و بقیه را‬ ‫حذف می‌کنیم‪.‬‬ ‫الگوریتم پریم‬ ‫م ‪ – 2‬یک گره دلخواه را به عنوان ریشه انتخاب کنید‬ ‫در این م‪C‬ورد م‪C‬ا گ‪C‬ره‪ S‬را ب‪C‬ه عن‪C‬وان گ‪C‬ره ریش‪C‬ه درخت پوش‪C‬ای پ‪C‬ریم در نظ‪C‬ر می‌گ‪C‬یریم‪.‬این‬ ‫گ‪C‬ره ب‪C‬ه ط‪C‬ور دلخ‪C‬واه انتخ‪C‬اب ش‪C‬ده اس‪C‬ت و ه‪C‬ر گ‪C‬ره دیگ‪C‬ری ب‪C‬ه ج‪C‬ای آن می‌ت‪C‬وان انتخ‪C‬اب‬ ‫ک‪C‬رد‪.‬ممکن اس‪C‬ت تعجب کنی‪C‬د ک‪C‬ه چط‪C‬ور ممکن اس‪C‬ت ه‪C‬ر گ‪C‬رهی ب‪C‬ه عن‪C‬وان گ‪C‬ره ریش‪C‬ه‬ ‫هه‪C‬ا در ی‪C‬ک گ‪C‬راف گنجان‪C‬ده‬ ‫انتخ‪C‬اب ش‪C‬ود‪ ،‬پاس‪C‬خ این اس‪C‬ت ک‪C‬ه در درخت پوش‪C‬ا‪ ،‬هم‪C‬ه گر ‌‬ ‫می‌ش‪C‬وند و از آن ج‪C‬ا ک‪C‬ه گ‪C‬راف‪ ،‬همبن‪C‬د اس‪C‬ت‪ ،‬در این ص‪C‬ورت می‌بایس‪C‬ت دس‪C‬ت‌کم ی‪C‬ک ی‪C‬ال‬ ‫برای هر گره باشد که آن را به بقیه درخت متصل سازد‪.‬‬ ‫الگوریتم پریم‬ ‫– بررسی یال‌های خروجی و انتخاب یالی که کمترین هزینه را دارد‬ ‫پس از انتخ‪C‬اب گ‪C‬ره‪ S‬ب‪C‬ه عن‪C‬وان ریش‪C‬ه می‌بی‪C‬نیم ک‪C‬ه ی‪C‬ال‪ S,A‬و‪ S,C‬دو ی‪C‬الی هس‪C‬تند ک‪C‬ه ب‪C‬ه‬ ‫ترتیب وزن‌های ‪ 7‬و ‪ 8‬دارند‪.‬یال‪ S,A‬انتخاب می‌شود چون کوچک‌تر از یال دیگر است‪.‬‬ ‫این‪C‬ک ب‪C‬ا درخت‪ S-7-A‬ب‪C‬ه ص‪C‬ورت ی‪C‬ک گ‪C‬ره رفت‪C‬ار می‌ش‪C‬ود و هم‪C‬ه یال‌ه‪C‬ایی ک‪C‬ه از آن خ‪C‬ارج‬ ‫می‌ش‪C‬وند را بررس‪C‬ی می‌ک‪C‬نیم‪.‬ی‪C‬الی را انتخ‪C‬اب می‌ک‪C‬نیم ک‪C‬ه کم‪C‬ترین هزین‪C‬ه را دارد و آن را‬ ‫در درخت می‌گنجانیم‪.‬‬ ‫الگوریتم پریم‬ ‫پس از این مرحله‪ ،‬درخت‪ S-7-A-3-C‬تشکیل می‌یابد‪.‬اینک بار دیگر با آن به صورت یک گره برخورد‬ ‫می‌کنیم و همه یال‌ها را مجددًا بررسی می‌کنیم‪.‬با این حال‪ ،‬مجددًا تنها یالی که کمترین هزینه را دارد انتخاب‬ ‫می‌کنیم‪.‬در این مورد‪ C-3-D،‬یک یال جدید است که هزینه آن کمتر از یال‌های دیگر است‪.‬‬ ‫پس از افزودن گره‪ D‬به درخت پوشا اینک دو یال داریم که از آن خارج می‌شوند و هزینه یکسانی دارند‪،‬‬ ‫یعنی‪ D-2-T‬و ‪ D-2-B‬بنابراین می‌توانیم هر یک از آن‌ها را که می‌خواهیم به درخت اضافه کنیم‪.‬اما در‬ ‫مرحله بعد یال ‪ 2‬کمترین هزینه را دارد‪.‬از این رو یک درخت پوشا را با گنجاندن هر دو یال نشان می‌دهیم‪.‬‬ ‫بدین ترتیب درمی‌یابیم که خروجی درخت پوشای گراف با استفاده‬ ‫از هر دو الگوریتم یکسان خواهد بود‪.‬‬ ‫الگوریتم دایکسترا‬ ‫الگوریتم دایجسترا در گراف‪ ،‬ی‪C‬ک روش حریصانه ب‪C‬رای ی‪C‬افتن کوت‪C‬اه ت‪C‬رین مس‪C‬یر از‬ ‫له‪C‬ا غ‪C‬یر منفی‬ ‫ی‪C‬ک مب‪C‬داء واح‪C‬د اتخ‪C‬اذ می‌کن‪C‬د‪.‬در این الگ‪C‬وریتم الزم اس‪C‬ت ک‪C‬ه وزن تم‪C‬امی یا ‌‬ ‫باشد چرا که در غیر این صورت الگوریتم قادر به حل مسأله نیست‪.‬‬ ‫الگوریتم دایکسترا‬ ‫در‬ ‫با ف‪C‬رض این ک‪C‬ه مس‪C‬أله م‪C‬ورد نظ‪C‬ر ی‪C‬افتن کوت‪C‬اه ت‪C‬رین مس‪C‬یر از گ‪C‬ره مب‪C‬داء‪s‬‬ ‫گ‪C‬راف)‪ G=(V,E‬باش‪C‬د الگ‪C‬وریتم دایجس‪C‬ترا ب‪C‬ا ش‪C‬روع از رأس‪ s‬کوت‪C‬اه ت‪C‬رین مس‪C‬یرها را از‬ ‫مب‪C‬داء ‪ s‬ب‪C‬ه تم امی رئ وس دیگ ر پی‪C‬دا می‌کن‪C‬د‪.‬ب‪C‬رای درک به‪C‬تر مراح‪C‬ل اج‪C‬رای این‬ ‫الگوریتم به مثال زیر توجه کنید‪.‬‬ ‫الگوریتم دایکسترا‬ ‫هم‪C‬ان‌طور ک‪C‬ه از ش‪C‬کل مش‪C‬خص اس‪C‬ت ابتدا تم‪C‬امی رئ‪C‬وس ب‪C‬ه غ‪C‬یر از منبع‪ s‬ب‪C‬ا ∞ عالمت‌گ‪C‬ذاری ش‪C‬ده‌اند‪.‬‬ ‫یع‪C‬نی هن‪C‬وز مس‪C‬یری از‪ s‬ب‪C‬ه آن‌ه‪C‬ا کش‪C‬ف نش‪C‬ده اس‪C‬ت‪.‬در مرحله بعد کوت‪C‬اه‌ترین مس‪C‬یر بین رأس‪ s‬و تم‪C‬امی‬ ‫یش‪C‬ود هم‪C‬ان‬ ‫رئوس‪C‬ی ک‪C‬ه از ‪ s‬مس‪C‬تقیمًا ی‪C‬الی ب‪C‬ه آن‌ه‪C‬ا وج‪C‬ود دارد محاس‪C‬به م ‌‬ ‫یش‪C‬ود‪.‬رأس بع‪C‬دی ک‪C‬ه انتخ‪C‬اب م ‌‬ ‫رأس‪C‬ی اس‪C‬ت ک‪C‬ه کوت‪C‬اه‌ترین مس‪C‬یر را به‪ s‬داش‪C‬ته (انتخ‪C‬اب حریص‪C‬انه) و مراح‪C‬ل ذک‪C‬ر ش‪C‬ده ب‪C‬رای رأس منب‪C‬ع‬ ‫اکن‪C‬ون ب‪C‬رای این رأس تک‪C‬رار ش‪C‬ده و کوت‪C‬اه‌ترین مس‪C‬یرها از رأس فعلی ب‪C‬ه تم‪C‬امی رئوس‪C‬ی ک‪C‬ه از رأس م‪C‬ذکور‬ ‫مس‪C‬تقیمًا ی‪C‬الی وج‪C‬ود دارد محاس‪C‬به می‌ش‪C‬ود‪.‬لیس‪C‬تی ب‪C‬ه ص‪C‬ورت زی‪C‬ر ک‪C‬ه فاص‪C‬له گر ‌‬ ‫هه‪C‬ا ت‪C‬ا منب‪C‬ع ‪s‬را نم‪C‬ایش‬ ‫می‌دهد تهیه می‌کنیم‪.‬‬ ‫الگوریتم دایکسترا‬ ‫هه‪C‬ای مج‪C‬اور آن را محاس‪C‬به‬ ‫در مرحل‪C‬ه اول گ‪C‬ره‪ s‬را انتخ‪C‬اب و کوت‪C‬اه‌ترین فاص‪C‬له از این گ‪C‬ره ت‪C‬ا ه‪C‬ر ی‪C‬ک از گر ‌‬ ‫یک‪C‬نیم و س‪C‬پس بع‪C‬د از محاس‪C‬به‪ ،‬گ‪C‬ره ‪ s‬را از لیس‪C‬ت ح‪C‬ذف می‌ک‪C‬نیم‪.‬ب‪C‬ه عن‪C‬وان مث‪C‬ال در ابت‪C‬دا فاص‪C‬له‪ s‬ت‪C‬ا‬ ‫م ‌‬ ‫گ‪C‬ره‪ a‬براب‪C‬ر بینه‪C‬ایت اس‪C‬ت‪.‬در گ‪C‬راف داده ش‪C‬ده ب‪C‬ا عب‪C‬ور از مس‪C‬یر ب‪C‬ا وزن ‪ 10‬می‌ت‪C‬وان از گ‪C‬ره‪ s‬ب‪C‬ه گ‪C‬ره‪a‬‬ ‫رس‪C‬ید و از آنج‪C‬ایی ک‪C‬ه ‪ 10‬کوچک‪C‬تر از ∞ (فاص‪C‬له فعلی گ‪C‬ره‪ s‬ت‪C‬ا گ‪C‬ره ‪ )a‬اس‪C‬ت پس کوت‪C‬اه‌ترین فاص‪C‬له از‬ ‫هه‪C‬ای‪ b‬و‪ d‬ن‪C‬یز ک‪C‬ه مج‪C‬اور ب‪C‬ا‪ s‬هس‪C‬تند رخ‬ ‫گ‪C‬ره‪ s‬ت‪C‬ا گ‪C‬ره‪ a‬در لیس‪C‬ت ف‪C‬وق‪ ،‬ب‪C‬روز می‌ش‪C‬ود‪.‬این ام‪C‬ر ب‪C‬رای گر ‌‬ ‫می‌دهد‪.‬در نهایت پس از پایان این مرحله به لیست زیر می‌رسیم‪:‬‬ ‫الگوریتم دایکسترا‬ ‫گراف اولیه نیز به صورت زیر بروز می‌شود‪:‬‬ ‫داخل هر نود میزان فاصله تا مبدا نوشته شده است‬ ‫الگوریتم دایکسترا‬ ‫حال در لیس‪C‬ت جدی‪ِC‬د بدس‪C‬ت آم‪C‬ده (مرحل‪C‬ه ‪ )2‬گ‪C‬ره ب‪C‬ا فاص‪C‬له ‪( min‬ک‪C‬ه در اینج‪C‬ا گ‪C‬ره‪ a‬اس‪C‬ت‪ )،‬را انتخ‪C‬اب ک‪C‬رده و مراح‪C‬ل‬ ‫ف‪C‬وق را روی آن انج‪C‬ام می‌دهیم‪.‬یع‪C‬نی گ‪C‬ره ‪ a‬را انتخ‪C‬اب و کوت‪C‬اه‌ترین فاص‪C‬له از این گ‪C‬ره ت‪C‬ا ه‪C‬ر ی‪C‬ک از گره‌ه‪C‬ای مج‪C‬اور آن‬ ‫را محاسبه می‌کنیم و سپس بعد از محاسبه‪ ،‬گره ‪ a‬را از لیست حذف می‌کنیم‪.‬‬ ‫تنه‪C‬ا گ‪C‬ره مج‪C‬اور‪ a‬ن‪C‬ود‪ c‬اس‪C‬ت ک‪C‬ه ب‪C‬ا هزین‪C‬ه ‪ 50‬می‌ت‪C‬وان ب‪C‬ه آن رفت‪.‬همچ‪C‬نین ب‪C‬ر اس‪C‬اس لیس‪C‬ت‪ ،‬فاص‪C‬له گ‪C‬ره منب‪C‬ع ت‪C‬ا ‪c‬‬ ‫براب‪C‬ر بینه‪C‬ایت اس‪C‬ت‪.‬ب‪C‬ا گ‪C‬ذر از ی‪C‬ال ب‪C‬ا وزن ‪ 50‬ک‪C‬ه بین دو گ‪C‬ره‪ a‬و‪ c‬اس‪C‬ت‪ ،‬می‌ت‪C‬وان ب‪C‬ا مجم‪C‬وع ‪ )50 + 10( 60‬از گ‪C‬ره‪s‬‬ ‫ب‪C‬ه گ‪C‬ره ‪ a‬و س‪C‬پس ب‪C‬ه گ‪C‬ره ‪ c‬رس‪C‬ید‪.‬از آنج‪C‬ایی ک‪C‬ه ‪ 60‬از ∞ کوچک‪C‬تر اس‪C‬ت می بایس‪C‬ت لیس‪C‬ت و گ‪C‬راف داده ش‪C‬ده را ب‪C‬روز‬ ‫کرد‪.‬‬ ‫الگوریتم دایکسترا‬ ‫حال در لیس‪C‬ت جد‪C‬یِد بدس‪C‬ت آم‪C‬ده (مرحل‪C‬ه ‪ )3‬گ‪C‬ره ب‪C‬ا فاص‪C‬له ‪ ،min‬ک‪C‬ه در اینج‪C‬ا گ‪C‬ره ‪ d‬اس‪C‬ت‪ ،‬را انتخ‪C‬اب ک‪C‬رده‬ ‫و مراح‪C‬ل ف‪C‬وق را روی آن انج‪C‬ام می‌دهیم‪.‬یع‪C‬نی گ‪C‬ره‪ d‬را انتخ‪C‬اب و کوت‪C‬اه‌ترین فاص‪C‬له از این گ‪C‬ره ت‪C‬ا ه‪C‬ر ی‪C‬ک‬ ‫از گره‌های مجاور آن را محاسبه می‌کنیم و سپس بعد از محاسبه‪ ،‬گره ‪ d‬را از لیست حذف می‌کنیم‪.‬‬ ‫هه‪C‬ای مج‪C‬اور ‪ d‬هس‪C‬تند‪.‬از گ‪C‬ره منب‪C‬ع ت‪C‬ا گ‪C‬ره‪ d‬ب‪C‬ه ان‪C‬دازه ‪ 30‬ت‪C‬ا هزین‪C‬ه دارد‪.‬ح‪C‬ال اگ‪C‬ر بخ‪C‬واهیم در‬ ‫‪ c‬و‪ b‬گر ‌‬ ‫ادامه‌اش از گ‪C‬ره ‪ d‬ب‪C‬ه گ‪C‬ره ‪ b‬ب‪C‬رویم ب‪C‬ا توج‪C‬ه ب‪C‬ه اینک‪C‬ه ه‪C‬زینه‪ d‬ت‪C‬ا‪ b‬براب‪C‬ر ‪ 60‬اس‪C‬ت‪ ،‬در نتیج‪C‬ه هزین‪C‬ه‬ ‫مس‪C‬یر‪ s->d->b‬براب‪C‬ر ‪ 60 + 30‬یع‪C‬نی ‪ 90‬اس‪C‬ت‪.‬این هزین‪C‬ه کم‪C‬تر از هزین‪C‬ه مس‪C‬یر فعلی‌اش یع‪C‬نی مس‪C‬یر‪s-‬‬ ‫‪ >b‬است‪.‬در نتیجه مسیر با هزینه کمتر را در لیست و گراف‌مان بروز می‌کنیم‪.‬‬ ‫حال اگ‪C‬ر بخ‪C‬واهیم بع‪C‬د از اینک‪C‬ه از گ‪C‬ره منب‪C‬ع ب‪C‬ه گ‪C‬ره‪ d‬آم‪C‬دیم‪ ،‬از‪ d‬به‪ c‬ب‪C‬رویم‪ ،‬ب‪C‬ا توج‪C‬ه ب‪C‬ه اینک‪C‬ه ه‪C‬زینه‪ d‬ت‪C‬ا‪c‬‬ ‫براب‪C‬ر ‪ 20‬اس‪C‬ت در نتیج‪C‬ه هزین‪C‬ه مس‪C‬یر ‪ s->d->c‬براب‪C‬ر ‪ 20 + 30‬یع‪C‬نی ‪ 50‬اس‪C‬ت‪.‬این هزین‪C‬ه کم‪C‬تر از هزین‪C‬ه‬ ‫مس‪C‬یر فعلی‌اش یع‪C‬نی مس‪C‬یر ‪ s->a->c‬اس‪C‬ت‪.‬در نتیج‪C‬ه مس‪C‬یر ب‪C‬ا هزین‪C‬ه کم‪C‬تر را در لیس‪C‬ت و گراف‌م‪C‬ان ب‪C‬روز‬ ‫الگوریتم دایکسترا‬ ‫الگوریتم دایکسترا‬ ‫حال در لیس‪C‬ت جدی‪ِC‬د بدس‪C‬ت آم‪C‬ده (مرحل‪C‬ه ‪ )4‬گ‪C‬ره ب‪C‬ا فاص‪C‬له ‪ ،min‬ک‪C‬ه در اینج‪C‬ا گ‪C‬ره‪c‬‬ ‫اس‪C‬ت‪ ،‬را انتخ‪C‬اب ک‪C‬رده و مراح‪C‬ل ف‪C‬وق را روی آن انج‪C‬ام می‌دهیم‪.‬یع‪C‬نی گ‪C‬ره‪ c‬را انتخ‪C‬اب‬ ‫و کوت‪C‬اه‌ترین فاص‪C‬له از این گ‪C‬ره ت‪C‬ا ه‪C‬ر ی‪C‬ک از گره‌ه‪C‬ای مج‪C‬اور آن را محاس‪C‬به می‌ک‪C‬نیم و‬ ‫سپس بعد از محاسبه‪ ،‬گره‪ c‬را از لیست حذف می‌کنیم‪.‬‬ ‫تنه‪C‬ا گ‪C‬ره مج‪C‬اور‪ c‬ن‪C‬ود‪ b‬اس‪C‬ت ک‪C‬ه ب‪C‬ا هزین‪C‬ه ‪ 10‬می‌ت‪C‬وان ب‪C‬ه آن رفت‪.‬ح‪C‬ال ب‪C‬ا توج‪C‬ه ب‪C‬ه اینک‪C‬ه‬ ‫کوت‪C‬اه‌ترین مس‪C‬یر از منب‪C‬ع ت‪C‬ا ن‪C‬ود ‪ c‬براب‪C‬ر ‪ 50‬اس‪C‬ت (ب‪C‬ر اس‪C‬اس آخ‪C‬رین ب‪C‬روز رس‪C‬انی لیس‪C‬ت)‬ ‫در نتیج‪C‬ه می‌ت‪C‬وان ب‪C‬ا رفتن از گ‪C‬ره‪ c‬ب‪C‬ه ‪ ،b‬یع‪C‬نی ب‪C‬ا هزین‪C‬ه ‪ ،60 = 10 + 50‬از گ‪C‬ره منب‪C‬ع‬ ‫به گره ‪ b‬رفت‪s->d->c->b.‬‬ ‫از آنجایی که ‪ 60‬از ‪ 90‬کوچکتر است میبایست لیست و گراف داده شده را بروز کرد‪.‬‬ ‫اکن‪C‬ون ب‪C‬ا ح‪C‬ذف گ‪C‬ره‪ c‬از لیس‪C‬ت فاص‪C‬له‌ها‪ ،‬الگ‪C‬وریتم دایجس‪C‬ترا خاتم‪C‬ه میاب‪C‬د و در نه‪C‬ایت‬ ‫گراف و لیست زیر را خواهیم داشت‪.‬‬ ‫الگوریتم دایکسترا‬ ‫الگوریتم دایکسترا‬ ‫در گراف بدست آمده یال‌های قرمز رنگ کوتاه‌ترین مسیرها از گره منبع تا هر‬ ‫یک از گره‌های گراف هستند‪.‬‬

Use Quizgecko on...
Browser
Browser