Blog | Profile | Archive | Email | Design by | Name Of Posts


welcome to khorrami web

به جهان خرم از آنم که جهان خرم از اوست____عاشقم بر همه عالم که همه عالم از اوست

 

 

کاربردها 

از جمله مهمترین کاربرد های این روش می توان به محاسبه ی کوتاه ترین فاصله ی دو نقطه در یک شهر از طریق راه های زمینی اشاره نمود. برای محاسبه ی کوتاه ترین مسیر بین دو نقطه باید نقاط مورد نظر در یک نقشه را علامت گذاری کرد و با استفاده از مشخصات نقاط(طول، عرض و ارتفاع) فاصله ی دو نقطه را در هر بار عملیات محاسبه نمود.توجه داریم که در ترافیک سرعت خودرو ها به شدت پایین آمده و این امر می تواند در انتخاب کوتاه ترین مسیر تاثیگذار باشد چرا که ممکن است بین دو نقطه a,b راه های 1و2 موجود باشد که راه 1 اتوبان و از خارج شهر و راه 2 از داخل شهر عبور می کند.فرض کنید فاصله ی a,b از طریق راه 1 حدود 10 کیلوتر و از طریق راه 2 حدود 7 کیلومتر باشد ولی راه 2 علی رقم فاصله ی کمتر دارای ترافیک سنگین است در نتیجه می توان انتظار داشت که در ساعات شلوغی استفاده از راه 1 بهینه تر باشد.از آن جا که اساس محاسبات در این روش بر پایه ی فاصله بین دو نقطه است می توان کاهش سرعت را با افزایش فواصل هم ارز نمود چرا که اگر رابطه ی سرعت و فاصله را خطی در نطر بگیریم (D=V.T)تاثیر کاهش سرعت و افزایش مسافت یکسان است.از این رو لازم است تا ضرایب تعدیلی در فواصل بین نقاط ضرب شده و این مسائل را در محاسبات لحاظ کنند. از جمله مهم ترین این ضرایب می توان به 3 مورد زیر اشاره نمود: 1-ضریب ترافیک و شلوغی 2-ضریب عرض معبر 3-ضریب شیب که نشانگر افت سرعت در سر بالایی هااست. گرچه تعیین این ضرایب برای نقاط مختلف شهر نیازمند کار کارشناسی متخصصان ترافیک و بررسی های آماری دقیق می باشد ولی می توان انتظار داشت که در اکثر موارد این ضرایب بین مقادیر 1 تا 2 بسته به شرایط تغییر کنند.

 

الگوریتم دیکسترا :

 

در نظریه گراف، الگوریتم دَیجکسترا یکی از الگوریتم های

یمایش گراف است که توسط دانشمند هلندی علوم رایانه،

{ادسخر دیجکسترا} در سال 1959 ارایه شد.

 

 

این الگوریتم یکی از الگوریتم های یمایش است که مسئله ی کوتاه ترین مسیر از مبدأ واحد را برای گراف های وزن داری که یال با وزن منفی ندارند، حل می‌کند و در نهایت با ایجاد درخت کوتاه ترین مسیر، کوتاه‌ترین مسیر از مبدأ به همهٔ راس های گراف را به دست می‌دهد. همچنین می‌توان از این الگوریتم برای پیدا کردن کوتاه‌ترین مسیر از مبدأ تا رأس مقصد به این ترتیب بهره جست که در حین اجرای الگوریتم به محض پیداشدن کوتاه‌ترین مسیر از مبدأ به مقصد، الگوریتم را متوقف کرد.

در صورتی که گراف یال با وزن منفی داشته باشد، این الگوریتم درست کار نمی‌کند و می‌بایست از الگوریتم‌های دیگر نظیر الگوریتم یلمن-فورد که پیچیدگی زمانی آنها بیشتر است استفاده کنیم.

خط مشی الگوریتم دیکسترا، مشابه با روش حریصانه استفاده شده در الگوریتم پریم برای پیدا کردن  زیر درخت فراگیر بهینه است.

 

 

این الگوریتم چگونه کار می‌کند؟

در حین اجرای الگوریتم دو چیز به طور ضمنی نگهداری می‌شود. یکی مجموعهٔ S از رأس‌هایی که وزن کوتاه‌ترین مسیر از مبدأ تا آن‌ها مشخص شده و دیگری دنبالهٔ d که برای هر رأس v، مقدار dv برابر وزن کوتاه‌ترین مسیر از مبدأ تا v است به شرطی که تمام رأس‌های این مسیر به جز v از رئوس داخل S باشند. S در ابتدا تهی و مقادیر d برای همهٔ رئوس به غیر از مبدأ بی‌نهایت است و مقدار آن برای مبدأ صفر گذاشته می‌شود. الگوریتم در هر مرحله رأسی خارج S را که d برای آن کمترین است انتخاب و به مجموعهٔ S اضافه می‌کند و سپس مقادیر d را برای رئوس همسایهٔ آن رأس به‌روز می‌نماید. در صورتی که نیاز به تشکیل درخت کوتاه‌ترین مسیر باشد، الگوریتم می‌بایست دنبالهٔ π را که πv پدر رأس v در درخت کوتاه‌ترین مسیر است، به همراه دنبالهٔ d به‌روز کند.

 

 

 

الگوریتم :

در پیاده‌سازی، برای اینکه مشخص کنیم چه رئوسی در مجموعهٔ S هستند، در هر مرحله رأسِ وارد شده به S را برچسب می‌زنیم.

 

 

 

پیاده‌سازی :

یک پیاده‌سازی نوعی به این شرح است:

 1  Algorithm Dijkstra(G,s)
 2  Input : G=(V,E), s(the source vertex)
 3  Output : two sequence d and π
 4  begin
 5      for all vertices w do
 6          dw = infty 
 7          πw = NULL
 8      ds = ۰
 9      while there exists an unmarked vertex do
10         let w be an unmarked vertex such that dw is minimum
11         mark w
12         for all edge (w,z) such that z is unmarked do
13             if dw + weight(w,z) < dz then
14                 dz = dw + weight(w,z)
15                 πz = w
16  end

 

 

 

پیچیدگی زمانی :

در ساده‌ترین پیاده‌سازی الگوریتمِ دیکسترا، داده‌ها در آرایه یا لیست پیوندی ذخیره می‌شوند که بدین ترتیب min مقدار d برای رئوس خارج S با الگوریتمی خطی یافت می‌شود. در این حالت پیچیدگی زمانی O( | V | 2 + | E | ) خواهد بود، چراکه در گراف بدون جهت هر یال دقیقاً دوبار و در گراف جهت دار گراف جهت دار هر یال دقیقاً یک بار پیمایش می‌شود و هم‌چنین پیدا کردن مینیمم، ( | O( | V زمان می‌خواهد که این مینیمم پیدا کردن | V | بار تکرار خواهد شد. برای گراف‌های پراکنده (یعنی گراف‌هایی که خیلی کمتر از | V | محذور یال دارند) الگوریتم دیکسترا با نگهداری گراف در فهرست مجاورت و استفاده از صف اولویت دار (priority-queue) (برای پیدا کردن مینیمم) با پیچیدگی زمانی O(( | V | + | E | )log | V | ) پیاده‌سازی می‌شود. در صورت استفاده از نگه دارنده ی فیبوناتچی (fibonacci heap) به جای صف اولویت‌دار، پیچیدگی زمانی با تحلیل جمعی (amortized analysis) به O( | E | + | V | log | V | ) بهبود می‌یابد.

+نوشته شده در دو شنبه 7 آذر 1390برچسب:,ساعت19:36توسط khorrami | |