آیا می دانید چرا در یک خط مستقیم بیشتر از یک قوس است؟ تعیین فاصله بین دو خط موازی کمترین فاصله بین دو نقطه چقدر است؟

مسیر در امتداد خط نقطه در تصویر کوتاه تر از مسیر در امتداد خط ثابت است. و اکنون کمی جزئیات بیشتر در مورد مثال مسیرهای دریایی:

اگر در یک مسیر ثابت حرکت می کنید، مسیر حرکت کشتی در امتداد آن است سطح زمینمنحنی خواهد بود که در ریاضیات نامیده می شود لگاریتمیمارپیچ

در ناوبری به این خط انحنای دوگانه پیچیده گفته می شود لوکسودرومی, که در زبان یونانی به معنای "دویدن مورب" است.

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

قوس یک دایره بزرگ به عنوان اثری از تقاطع سطح زمین با صفحه ای که از مرکز زمین می گذرد به دست می آید و به صورت توپ گرفته می شود.

در ناوبری، قوس دایره بزرگ نامیده می شود دایره بزرگ, که به معنی «دویدن مستقیم» است. دومین ویژگی دایره بزرگ این است که از نصف النهارها در زوایای مختلف عبور می کند (شکل 29).

تفاوت در فواصل بین دو نقطه از سطح زمین در امتداد لوکسودروم و ارتودروم فقط برای گذرگاه های بزرگ اقیانوس اهمیت عملی دارد.

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

برای استخراج معادله، لوکسودرومی ها را می گیریم (شکل 30، آ) دو نقطه ولیو AT،فاصله بین آنها به سادگی کم است. با رسم نصف النهارها و موازی آنها، یک مثلث کروی قائم الزاویه ابتدایی به دست می آوریم. ABC.در این مثلث، زاویه ای که از تقاطع نصف النهار و موازی تشکیل می شود، قائمه است و زاویه پnABبرابر مسیر کشتی K. Katet ACنشان دهنده یک قطعه قوس نصف النهار است و می تواند بیان شود

جایی که آر - شعاع زمین در نظر گرفته شده به عنوان یک کره؛

Δφ - افزایش اولیه عرض جغرافیایی (تفاوت عرض جغرافیایی).

پا SWنشان دهنده قسمتی از یک قوس موازی است

جایی که r - شعاع موازی؛

Δλ - تفاوت ابتدایی طول جغرافیایی

از مثلث OO 1 C می توان یافت که

سپس در فرم نهایی پا SWرا می توان اینگونه بیان کرد:

با فرض یک مثلث کروی ابتدایی ABCبرای تخت، بنویس

پس از کاهش آر و به جای افزایش های کوچک ابتدایی مختصات با موارد بی نهایت کوچک، داریم

ما عبارت به دست آمده را در محدوده φ 1، λ 1 تا φ 2 ادغام می کنیم، λ 2 در نظر گرفتن مقدار tgK به عنوان یک مقدار ثابت:

در سمت راست ما یک انتگرال جدولی داریم. پس از جایگزینی مقدار آن، معادله لوکسودروم را روی توپ بدست می آوریم

تجزیه و تحلیل این معادله به ما امکان می دهد تا به نتایج زیر دست یابیم:

در دوره های 0 و 180 درجه، لوکسودروم به یک قوس دایره بزرگ - یک نصف النهار تبدیل می شود.

در دوره های 90 و 270 درجه، لوکسودروم با موازی منطبق است.

لوکسودروم از هر موازی فقط یک بار و از هر نصف النهار تعداد بی شماری بار عبور می کند. آن ها به طور مارپیچی به قطب نزدیک می شود، به آن نمی رسد.

ناوبری در یک مسیر ثابت، یعنی در امتداد لوکسودروم، اگرچه کوتاه ترین فاصله بین دو نقطه روی زمین نیست، اما نشان دهنده راحتی قابل توجهی برای دریانورد است.

الزامات یک نمودار ناوبری دریایی را می توان بر اساس مزیت ناوبری در طول لوکسودروم و نتایج تجزیه و تحلیل معادله آن به صورت زیر فرموله کرد.

1. Loxodrome، عبور از نصف النهارها در یک زاویه ثابت، باید به عنوان یک خط مستقیم به تصویر کشیده شود.

2. پیش بینی نقشه، که برای ساخت نقشه ها استفاده می شود، باید متساوی الاضلاع باشد تا مسیرها، بلبرینگ ها و زوایای روی آن با ارزش آنها در زمین مطابقت داشته باشد.

3. نصف النهارها و موازی ها، مانند خطوط مسیر 0، 90، 180 درجه و 270 درجه، باید خطوط مستقیم عمود بر یکدیگر باشند.

کوتاه ترین فاصله بین دو نقطه داده شده روی سطح زمین که به صورت کره در نظر گرفته می شود، کوچکتر از کمان های دایره بزرگی است که از این نقاط می گذرد. به جز در مورد کشتی که از نصف النهار یا خط استوا پیروی می کند، دایره بزرگ از نصف النهارها در زوایای مختلف عبور می کند. بنابراین، کشتی که چنین منحنی را دنبال می کند، باید همیشه مسیر خود را تغییر دهد. در عمل، راحت تر است که مسیری را دنبال کنید که یک زاویه ثابت با نصف النهارها ایجاد می کند و روی نقشه در طرح مرکاتور توسط یک خط مستقیم - لوکسودروم به تصویر کشیده می شود. با این حال، در فواصل زیاد، تفاوت در طول ارتودروم و لوکسودروم به مقدار قابل توجهی می رسد. بنابراین، در چنین مواردی، ارتودروم محاسبه می شود و نقاط میانی روی آن مشخص می شود که بین آنها در امتداد لوکسودروم شنا می کنند.

طرح نقشه کشی که شرایط فوق را برآورده می کند توسط نقشه نگار هلندی جرارد کرامر (Mercator) در سال 1569 پیشنهاد شد. به افتخار خالق آن، طرح ریزی نامگذاری شد. مرکاتور.

و چه کسی می خواهد حتی بیشتر به دست آورد اطلاعات جالببیشتر بدانید اصل مقاله در سایت موجود است InfoGlaz.rfپیوند به مقاله ای که این کپی از آن ساخته شده است -

DISTANCE، فواصل، ر.ک. 1. فضایی که دو نقطه را از هم جدا می کند، فاصله بین چیزی. کوتاه ترین فاصله بین دو نقطه در یک خط مستقیم. از ما در فاصله دو کیلومتری زندگی می کند. فرمانده در نزدیکترین فاصله به آنها اجازه ورود داد ... فرهنگ لغتاوشاکوف

فاصله- اسم، اس، استفاده. اغلب مورفولوژی: (نه) چی؟ فاصله برای چی فاصله، (ببینید) چیست؟ فاصله از فاصله، چی؟ در مورد فاصله؛ pl. چی؟ فاصله، (نه) چی؟ فاصله ها، چرا؟ فاصله ها، (ببینید) چه چیزی؟ فاصله از فاصله ها... فرهنگ لغت دمیتریف

فاصله- من؛ رجوع کنید به فضای جداکننده دو نقطه، دو جسم و غیره، فاصله بین کسی، از l. کوتاه ترین رودخانه بین دو نقطه ر.از خانه تا مدرسه. به رودخانه ای نزدیک عقب نشینی کنید. در فاصله یک متری، بازوها دراز شده اند. چیزی را بدان، چیزی را احساس کن. در …… فرهنگ لغت دایره المعارفی

فاصله- من؛ رجوع کنید به همچنین ببینید فاصله الف) فضای جداکننده دو نقطه، دو جسم و غیره، فاصله بین کسی، از l. کمترین فاصله بین دو نقطه فاصله خانه تا مدرسه. عقب نشینی به فاصله نزدیک / نه ... فرهنگ لغت بسیاری از عبارات

هندسه- شاخه ای از ریاضیات که به بررسی خواص اشکال مختلف (نقاط، خطوط، زوایا، اجسام دو بعدی و سه بعدی)، اندازه و موقعیت نسبی آنها می پردازد. برای سهولت تدریس، هندسه به پلان سنجی و هندسه جامد تقسیم می شود. در…… دایره المعارف کولیر

جهت یابی*

جهت یابی- بخش ناوبری (نگاه کنید به)، جمع بندی ارائه راه هایی برای تعیین مکان کشتی در دریا، با استفاده از قطب نما و سیاهههای مربوط (نگاه کنید به). تعیین مکان کشتی در دریا به این معنی است که نقطه ای را که کشتی در آن قرار دارد روی نقشه قرار دهید این لحظهواقع شده.… … فرهنگ لغت دایره المعارف F.A. بروکهاوس و I.A. افرون

COGEN- (کوهن) هرمان (1842 1918) فیلسوف آلمانی، بنیانگذار و برجسته ترین نماینده مکتب نئوکانتیانیسم ماربورگ. آثار عمده: «نظریه تجربه کانت» (1885)، «توجیه اخلاق کانت» (1877)، «توجیه زیبایی‌شناسی کانت» (1889)، «منطق…

کانت امانوئل- مسیر زندگی و نوشته‌های کانت امانوئل کانت در سال 1724 در کونیگزبرگ (کالینینگراد کنونی) در پروس شرقی به دنیا آمد. پدرش زین‌باز و مادرش خانه‌دار بود، شش فرزندشان تا بزرگسالی زندگی نکردند. کانت همیشه پدر و مادرش را با ... فلسفه غرب از پیدایش تا امروز

فلسفه انتقادی کانت: دکترین توانایی ها- (La philosophie critique de Kant: Doctrines des facultes, 1963) اثر دلوز. دلوز با توصیف روش استعلایی در مقدمه اشاره می کند که کانت فلسفه را به عنوان علم ارتباط همه دانش با اهداف اساسی می داند... تاریخ فلسفه: دایره المعارف

اصل مزرعه- اصل اساسی اپتیک هندسی (نگاه کنید به اپتیک هندسی). ساده ترین شکل F. p این است که یک پرتو نور همیشه در فضایی بین دو نقطه در مسیری که زمان عبور آن کمتر از ... بزرگ دایره المعارف شوروی

(هندسه توصیفی)
  • CD (CXDX، C2D2)به صورت نقطه نشان داده شده است C5 = D5 A5B5برابر ...
    (هندسه توصیفی)
  • تعیین فاصله بین دو صفحه موازی
    تعیین فاصله بین دو صفحه موازی در موقعیت کلی 01| ایکسراحت است که آن را به مشکل تعیین فاصله بین همان دو صفحه کاهش دهیم، که به موقعیت صفحات بیرون زده تبدیل شده است. در این حالت، فاصله بین صفحات به عنوان عمود بین خطوط تعریف می شود، ...
    (هندسه توصیفی)
  • تعیین فاصله بین دو خط متقاطع
    اگر می‌خواهید کوتاه‌ترین فاصله بین دو خط متقاطع را تعیین کنید، باید دوبار سیستم‌های صفحه‌نمایش را تغییر دهید. هنگام حل این مشکل، مستقیم CD (CXDX، C2D2)به صورت نقطه نشان داده شده است C5 = D5(شکل 198). فاصله از این نقطه تا طرح ریزی A5B5برابر ...
    (هندسه توصیفی)
  • زاویه بین دو خط مستقیم متقاطع
    این زاویه بین دو خط متقاطع موازی با داده ها است. بنابراین، این کار مشابه کار قبلی است. برای حل آن باید یک نقطه دلخواه گرفته و دو خط موازی با خطوط اریب داده شده از آن رسم کنید و با استفاده از تبدیل طرح ریزی زاویه مورد نیاز را تعیین کنید.
    (مبانی هندسه توصیفی. دوره کوتاهو مجموعه ای از وظایف.)
  • تعیین فاصله بین دو خط موازی
    مشکل با روش جایگزینی مضاعف صفحات طرح ریزی حل می شود. در مرحله آخر، یکی از صفحات طرح ریزی باید عمود بر یکی از خطوط متقاطع باشد. سپس کوتاهترین فاصله بین آنها با مقدار پاره عمود بر خط اریب دیگر تعیین می شود (شکل 199).
    (هندسه توصیفی)
  • معلم با ترسیم دو نقطه روی تخته سیاه با گچ، به دانش آموز جوان پیشنهاد می کند: کوتاه ترین مسیر را بین هر دو نقطه ترسیم کند.

    دانش آموز پس از اندیشیدن، با جدیت بین آنها خط پیچ در پیچی می کشد.

    - این کوتاه ترین راهه! معلم تعجب می کند. - کی بهت یاد داد؟

    - پدر من. او راننده تاکسی است.

    طراحی یک پسر مدرسه ای ساده لوح، البته حکایتی است، اما اگر به شما گفته شود که قوس نقطه چین در انجیر، لبخند نمی زنید؟ 1 کوتاه ترین راه از دماغه امید خوب تا نوک جنوبی استرالیا است!

    حتی قابل توجه تر عبارت زیر است: نشان داده شده در شکل. 2 رفت و برگشت از ژاپن به کانال پاناما کوتاهتر از خط مستقیمی است که بین آنها در همان نقشه کشیده شده است!

    برنج. 1. روشن نقشه دریاکوتاه ترین مسیر از دماغه امید خوب تا نوک جنوبی استرالیا با یک خط مستقیم ("لوکسودروم") نشان داده نمی شود، بلکه با یک منحنی ("ارتودرومی") مشخص می شود.


    همه اینها شبیه یک شوخی به نظر می رسد، اما در عین حال حقایقی غیرقابل انکار وجود دارد که برای نقشه کشان کاملاً شناخته شده است.




    برنج. 2. باورنکردنی به نظر می رسد که مسیر منحنی که یوکوهاما را در نمودار دریایی به کانال پاناما متصل می کند کوتاهتر از یک خط مستقیم باشد که بین همان نقاط کشیده شده است.


    برای روشن شدن موضوع، باید چند کلمه در مورد نمودارها به طور کلی و در مورد نمودارهای دریایی به طور خاص گفته شود. به تصویر کشیدن قسمت هایی از سطح زمین بر روی کاغذ، حتی در اصل کار ساده ای نیست، زیرا زمین یک کره است و مشخص است که هیچ قسمتی از سطح کروی را نمی توان بدون چین و پارگی روی هواپیما مستقر کرد. به طور غیر ارادی، فرد باید با تحریفات اجتناب ناپذیر روی نقشه ها کنار بیاید. راه‌های زیادی برای ترسیم نقشه‌ها ابداع شده‌اند، اما همه نقشه‌ها خالی از کاستی نیستند: برخی دارای یک نوع اعوجاج هستند، برخی دیگر از نوع دیگر، اما هیچ نقشه‌ای بدون اعوجاج وجود ندارد.

    ملوانان از نقشه هایی استفاده می کنند که بر اساس روش نقشه کش و ریاضیدان قدیمی هلندی قرن شانزدهم ترسیم شده است. مرکاتور. این روش را پیش بینی Mercator می نامند. تشخیص نمودار دریایی از طریق شبکه مستطیلی آن آسان است: نصف النهارها روی آن به صورت یک سری خطوط مستقیم موازی نشان داده شده اند. دایره های عرض جغرافیایی - همچنین در خطوط مستقیم عمود بر اول (شکل 5 را ببینید).

    اکنون تصور کنید که می خواهید کوتاه ترین مسیر را از یک بندر اقیانوسی به بندر دیگر در همان موازی پیدا کنید. در اقیانوس، همه مسیرها در دسترس هستند و همیشه می‌توانید در کوتاه‌ترین مسیر به آنجا سفر کنید، اگر بدانید چگونه است. در مورد ما، طبیعی است که فکر کنیم کوتاه ترین مسیر در امتداد موازی است که هر دو پورت روی آن قرار دارند: بالاخره در نقشه یک خط مستقیم است، و چه چیزی می تواند کوتاهتر از یک مسیر مستقیم باشد! اما ما اشتباه می کنیم: مسیر در امتداد موازی به هیچ وجه کوتاه ترین نیست.

    در واقع: در سطح یک کره، کوتاه ترین فاصله بین دو نقطه، قوس دایره بزرگی است که آنها را به هم متصل می کند. اما دایره موازی کم اهمیت یک دایره قوس یک دایره بزرگ کمتر از قوس هر دایره کوچکی است که از همان دو نقطه کشیده شده است: شعاع بزرگتر مربوط به انحنای کوچکتر است. نخ روی کره زمین را بین دو نقطه ما بکشید (شکل 3 را ببینید). مطمئن خواهید شد که اصلاً در امتداد موازی قرار نمی گیرد. یک موضوع تنگ - یک اشاره گر بی چون و چرا کوتاه ترین راهو اگر با موازی روی کره زمین منطبق نباشد، در نمودار دریایی کوتاه ترین مسیر با یک خط مستقیم نشان داده نمی شود: به یاد بیاورید که دایره های موازی در چنین نقشه ای با خطوط مستقیم به تصویر کشیده می شوند، هر خطی که اینطور باشد. منطبق نیست با یک خط مستقیم است منحنی .



    برنج. 3. یک راه ساده برای یافتن کوتاه ترین مسیر بین دو نقطه: شما باید یک نخ روی کره زمین بین این نقاط بکشید.


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

    آنها می گویند که هنگام انتخاب جهت برای نیکولایفسکایا (اکنون اوکتیابرسکایا) راه آهنمناقشات بی پایانی در مورد این که آن را به چه طریقی تنظیم کنیم وجود داشت. این اختلافات با مداخله تزار نیکلاس اول پایان یافت، که مشکل را به معنای واقعی کلمه "سریع" حل کرد: او سنت پترزبورگ را با مسکو در طول خط وصل کرد. اگر این کار بر روی نقشه مرکاتور انجام می شد، شگفتی شرم آور بود: به جای یک خط مستقیم، جاده به یک پیچ تبدیل می شد.

    کسانی که از محاسبات اجتناب نمی کنند، می توانند با یک محاسبه ساده مطمئن شوند که مسیری که در نقشه به نظر ما کج به نظر می رسد، در واقع کوتاهتر از مسیری است که ما آماده در نظر گرفتن مستقیم هستیم. اجازه دهید دو بندر ما در موازی 60 قرار بگیرند و با فاصله 60 درجه از هم جدا شوند. (البته اینکه چنین دو بندر واقعاً وجود دارند برای محاسبه بی اهمیت است.)



    برنج. 4. برای محاسبه فواصل بین نقاط A و B روی توپ در امتداد قوس موازی و در امتداد قوس دایره بزرگ.


    روی انجیر 4 امتیاز O -مرکز جهان, AB -قوس دایره عرض جغرافیایی که بندرها روی آن قرار دارند الف و ب؛ که در 60 درجه او مرکز دایره عرض جغرافیایی در یک نقطه است از جانبآن را از مرکز تصور کنید Oکره زمین از میان همان بندرگاه ها یک قوس دایره ای بزرگ کشیده شده است: شعاع آن OB = OA = R;از نزدیک قوس کشیده شده عبور خواهد کرد AB،اما مطابقت ندارد

    بیایید طول هر قوس را محاسبه کنیم. از آنجایی که نقاط ولیو ATدر عرض جغرافیایی 60 درجه و سپس شعاع قرار بگیرید OAو OVآرایش کردن با سیستم عامل(محور کره زمین) زاویه 30 درجه. در یک مثلث قائم الزاویه ASOپا AC (=r)،قرار گرفتن در مقابل زاویه 30 درجه برابر با نیمی از هیپوتنوز است JSC;

    به معنای، r=R/2طول کمان ABیک ششم طول دایره عرض جغرافیایی است و از آنجایی که این دایره نصف طول دایره بزرگ (مرتبط با نصف شعاع) است، پس طول قوس دایره کوچک است.



    اکنون برای تعیین طول کمان دایره بزرگ کشیده شده بین نقاط مشابه (یعنی کوتاه ترین مسیر بین آنها)، باید بزرگی زاویه را بدانیم. AOW.آکورد مانندبا تفریق قوس به 60 درجه (دایره کوچک)، ضلع یک شش ضلعی منظم است که در همان دایره کوچک حک شده است. از همین رو AB \u003d r \u003d R / 2

    کشیدن یک خط مستقیم odاتصال مرکز Oکره با وسط Dآکورد AB،یک مثلث قائم الزاویه بدست آورید ODA،زاویه کجاست د-سر راست:

    DA= 1/2 AB و OA=R.

    sinAOD=AD: AO=R/4:R=0.25

    از اینجا می‌بینیم (طبق جداول):

    = 14 درجه 28، 5

    و از این رو

    = 28 درجه 57 اینچ

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

    ما می آموزیم که مسیر در امتداد دایره عرض جغرافیایی، که در نمودار دریا با یک خط مستقیم نشان داده شده است، 3333 کیلومتر است، و مسیر در امتداد دایره بزرگ - در امتداد منحنی روی نقشه - 3213 کیلومتر، یعنی 120 کیلومتر کوتاهتر است.

    با داشتن یک نخ و یک کره در دست، می توانید به راحتی صحت نقشه های ما را بررسی کنید و مطمئن شوید که قوس های دایره های بزرگ واقعاً همانطور که در نقاشی ها نشان داده شده است قرار دارند. در شکل نشان داده شده است. 1 گویا مسیر دریایی "مستقیم" از آفریقا به استرالیا 6020 مایل است و "منحنی" - 5450 مایل، یعنی 570 مایل یا 1050 کیلومتر کوتاهتر است. مسیر هوایی "مستقیم" در نمودار دریایی از لندن به شانگهای از دریای خزر می گذرد، در حالی که واقعا کوتاه ترین مسیر در شمال سنت پترزبورگ قرار دارد. مشخص است که این مسائل چه نقشی در صرفه جویی در زمان و سوخت دارند.

    اگر در عصر کشتیرانی زمان حمل و نقل همیشه ارزش گذاری نمی شد - پس "زمان" هنوز "پول" در نظر گرفته نمی شد ، پس با ظهور کشتی های بخار ، باید برای هر تن زغال سنگ اضافی مصرف شده پرداخت کرد. به همین دلیل است که در روزهای ما کشتی‌ها در کوتاه‌ترین مسیر حرکت می‌کنند و اغلب از نقشه‌هایی استفاده می‌کنند که نه در مرکاتور، بلکه در طرح به اصطلاح "مرکزی" ساخته شده‌اند: در این نقشه‌ها، قوس‌های دایره‌های بزرگ به صورت خطوط مستقیم به تصویر کشیده می‌شوند.

    پس چرا دریانوردان سابق از چنین نقشه های فریبنده ای استفاده می کردند و مسیرهای نامساعدی را انتخاب می کردند؟ این اشتباه است که فکر کنیم در قدیم آنها از ویژگی مشخص شده نمودارهای دریایی اطلاعی نداشتند. توضیح این موضوع البته نه به این صورت است، بلکه به این دلیل است که نمودارهایی که به روش مرکاتور ترسیم شده اند، همراه با ناراحتی ها، مزایای بسیار ارزشمندی برای ملوانان دارد. چنین نقشه ای اولاً بخش های کوچک جداگانه ای از سطح زمین را بدون اعوجاج به تصویر می کشد و گوشه های کانتور را حفظ می کند. این با این واقعیت منافات ندارد که با فاصله از استوا، تمام خطوط به طور قابل توجهی کشیده می شوند. در عرض های جغرافیایی بالا، کشش آنقدر قابل توجه است که نمودار دریایی به فردی که با ویژگی های آن آشنا نیست تصوری کاملاً نادرست از اندازه واقعی قاره ها را القا می کند: به نظر می رسد گرینلند به اندازه آفریقا، آلاسکا باشد. بزرگتر از استرالیا است، اگرچه گرینلند 15 برابر کوچکتر از آفریقا است، و آلاسکا به همراه گرینلند به اندازه نصف استرالیا است. اما ملوانی که به خوبی با این ویژگی های نمودار آشنایی دارد نمی تواند توسط آنها گمراه شود. او با آنها کنار می‌آید، به خصوص که در مناطق کوچک، نمودار دریایی شباهت دقیقی از طبیعت به دست می‌دهد (شکل 5).

    از سوی دیگر، نمودار دریا حل وظایف تمرین ناوبری را بسیار تسهیل می کند. این تنها نوع نقشه ای است که مسیر یک کشتی در حال حرکت در یک مسیر ثابت به صورت یک خط مستقیم به تصویر کشیده می شود. پیروی از یک «مسیر ثابت» به معنای حفظ یک جهت، یک «رومب» معین است، به عبارت دیگر، به گونه‌ای پیش رفت که از تمام نصف النهارها با زاویه مساوی عبور کرد. اما این مسیر ("لوکسودروم") را می توان به عنوان یک خط مستقیم تنها بر روی نقشه ای به تصویر کشید که در آن همه نصف النهارها خطوط مستقیم موازی با یکدیگر هستند. و از آنجایی که در کره زمین دایره های عرض جغرافیایی با نصف النهارها در زوایای قائم تلاقی می کنند، پس در چنین نقشه ای دایره های عرض جغرافیایی باید خطوط مستقیم عمود بر خطوط نصف النهارها باشند. به طور خلاصه، دقیقاً به شبکه مختصاتی می رسیم که یک ویژگی مشخصه نمودار دریایی را تشکیل می دهد.




    برنج. 5. نقشه دریایی یا مرکاتور کره زمین. در چنین نقشه هایی، ابعاد خطوط دور از خط استوا بسیار اغراق آمیز است. به عنوان مثال، کدام بزرگتر است: گرینلند یا استرالیا؟ (پاسخ بصورت متنی)


    تمایل ملوانان به نقشه های مرکاتور اکنون قابل درک است. ناوبر برای تعیین مسیری که باید در هنگام رفتن به بندر تعیین شده طی شود، خط کشی را به نقاط انتهایی مسیر اعمال می کند و زاویه ای را که با نصف النهارها ایجاد می کند اندازه گیری می کند. ناوبر با نگه داشتن تمام مدت در دریای آزاد در این جهت، کشتی را با دقت به هدف می رساند. می بینید که "لوکسودروم" اگرچه نه کوتاه ترین و نه مقرون به صرفه ترین، اما از نظر خاصی راهی بسیار راحت برای یک ملوان است. برای مثال، برای رسیدن از دماغه امید خوب به نوک جنوبی استرالیا (نگاه کنید به شکل 1)، باید همیشه همان مسیر S87.50 " را حفظ کرد. در همین حال، برای رساندن کشتی به همان مسیر. نکته پایانی کوتاه ترین راه(طبق "ارتودرومی")، همانطور که از شکل مشاهده می شود، لازم است که مسیر کشتی را به طور مداوم تغییر دهید: از مسیر S 42.50 درجه شروع کنید و با مسیر N 53.50 درجه پایان دهید. (در این مورد، کوتاه ترین مسیر حتی امکان پذیر نیست - آن را به دیوار یخی قطب جنوب).

    هر دو مسیر - در امتداد "لوکسودروم" و در امتداد "ارتودرومی" - فقط زمانی منطبق هستند که مسیر در امتداد دایره بزرگ در نمودار دریا به عنوان یک خط مستقیم به تصویر کشیده شود: هنگام حرکت در امتداد استوا یا در امتداد نصف النهار. در همه موارد دیگر، این مسیرها متفاوت است.

    الگوریتم دایکسترا یک الگوریتم گراف است که توسط دانشمند هلندی ادسگر دایکسترا در سال 1959 اختراع شد. کوتاه ترین مسیرها را از یکی از رئوس نمودار تا بقیه را پیدا می کند. الگوریتم کار می کند فقط برای نمودارهای بدون لبه وزن منفی.

    اجرای الگوریتم را در مثال نمودار نشان داده شده در شکل در نظر بگیرید.

    اجازه دهید لازم باشد کوتاهترین فواصل را از راس اول تا بقیه را پیدا کنید.

    دایره ها راس ها را نشان می دهند، خطوط مسیرهای بین آنها را نشان می دهند (لبه های نمودار). اعداد رئوس در دایره ها نشان داده شده است، "قیمت" آنها - طول مسیر - در بالای لبه ها نشان داده شده است. در کنار هر راس، یک برچسب قرمز مشخص شده است - طول کوتاه ترین مسیر به این راس از راس 1.

    گام اول. برای مثال ما مرحله ای از الگوریتم دایکسترا را در نظر بگیرید. راس 1 دارای حداقل برچسب است. راس های 2، 3 و 6 همسایگان آن هستند.

    اولین همسایه راس 1 به نوبه خود راس 2 است، زیرا طول مسیر به آن حداقل است. طول مسیر به آن از طریق راس 1 برابر است با مجموع مقدار برچسب راس 1 و طول یال که از 1 به 2 می رود، یعنی 0 + 7 = 7. این کمتر از برچسب فعلی راس 2، بی نهایت، بنابراین برچسب جدید راس دوم 7 است.

    ما یک عملیات مشابه را با دو همسایه دیگر از راس 1 - 3 و 6 انجام می دهیم.

    همه همسایگان گره 1 بررسی می شوند. حداقل فاصله فعلی تا قله 1 نهایی در نظر گرفته می شود و مورد تجدید نظر قرار نمی گیرد (این واقعیت که واقعاً چنین است ابتدا توسط E. Dijkstra ثابت شد). آن را از نمودار عبور دهید تا مشخص کنید که این راس بازدید شده است.

    مرحله دوم. مرحله الگوریتم تکرار می شود. دوباره "نزدیک ترین" رئوس بازدید نشده را پیدا می کنیم. این راس 2 با برچسب 7 است.

    دوباره سعی می کنیم برچسب های همسایه های راس انتخاب شده را کاهش دهیم و سعی می کنیم از راس دوم عبور کنیم. همسایگان راس 2 رئوس 1، 3 و 4 هستند.

    اولین همسایه (به ترتیب) راس 2، راس 1 است. اما قبلاً بازدید شده است، بنابراین با راس 1 کاری انجام نمی دهیم.

    همسایه بعدی راس 2، راس 3 است، زیرا دارای حداقل برچسب رئوس است که به عنوان بازدید نشده مشخص شده است. اگر از طریق 2 به آن بروید، طول چنین مسیری برابر با 17 (7 + 10 = 17) خواهد بود. اما برچسب فعلی راس سوم 9 است که کمتر از 17 است، بنابراین برچسب تغییر نمی کند.

    همسایه دیگر راس 2، راس 4 است. اگر از 2 به آن بروید، طول چنین مسیری برابر است با مجموع کوتاه ترین فاصله تا راس 2 و فاصله بین رئوس 2 و 4، یعنی ، 22 (7 + 15 = 22) . از 22<, устанавливаем метку вершины 4 равной 22.

    همه همسایگان راس 2 مشاهده شده اند، فاصله تا آن را ثابت کرده و به عنوان بازدید شده علامت گذاری می کنیم.

    مرحله سوم. ما مرحله الگوریتم را با انتخاب راس 3 تکرار می کنیم. پس از "پردازش" آن، نتایج زیر را دریافت می کنیم:

    مراحل بعدی. مرحله الگوریتم را برای رئوس باقی مانده تکرار می کنیم. اینها به ترتیب رئوس 6، 4 و 5 خواهند بود.

    تکمیل اجرای الگوریتم. الگوریتم زمانی خاتمه می یابد که هیچ راس دیگری پردازش نشود. در این مثال، همه رئوس خط کشیده شده اند، اما این اشتباه است که فرض کنیم در هر مثالی چنین خواهد بود - برخی از رئوس ممکن است بدون دسترسی به آنها، یعنی اگر نمودار قطع شود، بدون خط باقی بمانند. نتیجه الگوریتم در آخرین شکل قابل مشاهده است: کوتاه ترین مسیر از راس 1 به 2 7، به 3 - 9، به 4 - 20، به 5 - 20، به 6 - 11 است.

    پیاده سازی الگوریتم در زبان های برنامه نویسی مختلف:

    C++

    #include "stdafx.h" #include با استفاده از namespace std. const int V=6; // الگوریتم Dijkstra void Dijkstra(int GR[V][V], int st) (int distance[V], count, index, i, u, m=st+1; bool visited[V]; for (i= 0 من "< "<> "; cin>>شروع؛ Dijkstra(GR، start-1); system("مکث>>باطل")؛ )

    پاسکال

    برنامه DijkstraAlgorithm; usecrt; constV=6; inf=100000; نوع vector=آرایه عدد صحیح; var start: integer; const GR: آرایه عدد صحیح=((0، 1، 4، 0، 2، 0)، (0، 0، 0، 9، 0، 0)، (4، 0، 0، 7، 0، 0)، (0، 9، 7، 0، 0، 2)، (0، 0، 0، 0، 0، 8)، (0، 0، 0، 0، 0، 0))؛ (الگوریتم دایکسترا) رویه Dijkstra(GR: آرایه عدد صحیح؛ st: عدد صحیح); var count, index, i, u, m, min: integer; فاصله: برداری; بازدید شده: آرایه بولی; startm:=st; برای i:=1 تا V فاصله را شروع کنید[i]:=inf; بازدید شده[i]:=false; پایان؛ فاصله:=0; برای count:=1 تا V-1 شروع کنید min:=inf; برای i:=1 تا V اگر (بازدید نشده[i]) و (فاصله[i]) انجام دهید<=min) then begin min:=distance[i]; index:=i; end; u:=index; visited[u]:=true; for i:=1 to V do if (not visited[i]) and (GR<>0) و (فاصله[u])<>inf) و (فاصله[u]+GR inf سپس writeln(m," > "، i," = "، فاصله[i]) else writeln(m," > "، i," = "، "مسیر در دسترس نیست"); پایان؛ (بلوک برنامه اصلی) start clrscr; write("گره شروع >>"); خواندن (شروع)؛ Dijkstra (GR، شروع)؛ پایان.

    جاوا

    وارد کردن java.io.BufferedReader. وارد کردن java.io.IOException. وارد کردن java.io.InputStreamReader. وارد کردن java.io.PrintWriter. وارد کردن java.util.ArrayList; وارد کردن java.util.Arrays. java.util.StringTokenizer را وارد کنید. راه حل کلاس عمومی (int static خصوصی INF = Integer.MAX_VALUE / 2؛ int خصوصی n؛ //تعداد رئوس در دیگراف خصوصی int m؛ //تعداد کمان ها در دیگراف خصوصی ArrayList adj // لیست مجاورت ArrayList خصوصی وزن؛ //وزن لبه در دیگراف خصوصی بولی استفاده می شود. //آرایه برای ذخیره اطلاعات مربوط به قله های پاس شده و رد نشده private int dist; //آرایه برای ذخیره فاصله از راس شروع //آرایه ای از اجداد مورد نیاز برای بازیابی کوتاه ترین مسیر از راس شروع private int pred. int start; //رأس شروع، که از آن فاصله تا بقیه راس خصوصی BufferedReader cin جستجو می شود. خصوصی PrintWriter cout; توکنایزر خصوصی StringTokenizer. //روش شروع الگوریتم Dijkstra از راس شروع خصوصی void dejkstra(int s) ( dist[s] = 0; //کوتاه ترین فاصله تا راس شروع 0 برای (int iter = 0; iter< n; ++iter) { int v = -1; int distV = INF; //выбираем вершину, кратчайшее расстояние до которого еще не найдено for (int i = 0; i < n; ++i) { if (used[i]) { continue; } if (distV < dist[i]) { continue; } v = i; distV = dist[i]; } //рассматриваем все дуги, исходящие из найденной вершины for (int i = 0; i < adj[v].size(); ++i) { int u = adj[v].get(i); int weightU = weight[v].get(i); //релаксация вершины if (dist[v] + weightU < dist[u]) { dist[u] = dist[v] + weightU; pred[u] = v; } } //помечаем вершину v просмотренной, до нее найдено кратчайшее расстояние used[v] = true; } } //процедура считывания входных данных с консоли private void readData() throws IOException { cin = new BufferedReader(new InputStreamReader(System.in)); cout = new PrintWriter(System.out); tokenizer = new StringTokenizer(cin.readLine()); n = Integer.parseInt(tokenizer.nextToken()); //считываем количество вершин графа m = Integer.parseInt(tokenizer.nextToken()); //считываем количество ребер графа start = Integer.parseInt(tokenizer.nextToken()) - 1; //инициализируем списка смежности графа размерности n adj = new ArrayList[n]; for (int i = 0; i < n; ++i) { adj[i] = new ArrayList()؛ ) //آغاز کردن لیستی که وزن یال ها را ذخیره می کند weight = new ArrayList[n]; برای (int i = 0; i< n; ++i) { weight[i] = new ArrayList()؛ ) //خواندن نمودار ارائه شده توسط لیست یال ها برای (int i = 0; i< m; ++i) { tokenizer = new StringTokenizer(cin.readLine()); int u = Integer.parseInt(tokenizer.nextToken()); int v = Integer.parseInt(tokenizer.nextToken()); int w = Integer.parseInt(tokenizer.nextToken()); u--; v--; adj[u].add(v); weight[u].add(w); } used = new boolean[n]; Arrays.fill(used, false); pred = new int[n]; Arrays.fill(pred, -1); dist = new int[n]; Arrays.fill(dist, INF); } //процедура восстановления кратчайшего пути по массиву предком void printWay(int v) { if (v == -1) { return; } printWay(pred[v]); cout.print((v + 1) + " "); } //процедура вывода данных в консоль private void printData() throws IOException { for (int v = 0; v < n; ++v) { if (dist[v] != INF) { cout.print(dist[v] + " "); } else { cout.print("-1 "); } } cout.println(); for (int v = 0; v < n; ++v) { cout.print((v + 1) + ": "); if (dist[v] != INF) { printWay(v); } cout.println(); } cin.close(); cout.close(); } private void run() throws IOException { readData(); dejkstra(start); printData(); cin.close(); cout.close(); } public static void main(String args) throws IOException { Solution solution = new Solution(); solution.run(); } }

    گزینه ای دیگر:

    وارد کردن java.io.*؛ واردات java.util.*; کلاس عمومی Dijkstra ( خصوصی استاتیک نهایی Graph.Edge GRAPH = (جدید Graph.Edge("a"، "b"، 7)، new Graph.Edge("a"، "c"، 9)، new Graph.Edge( "a"، "f"، 14), new Graph.Edge("b"، "c"، 10)، new Graph.Edge("b"، "d"، 15)، new Graph.Edge("c "، "d"، 11)، جدید Graph.Edge("c"، "f"، 2)، new Graph.Edge("d"، "e"، 6)، new Graph.Edge("e"، "f"، 9)،؛ رشته پایانی ثابت خصوصی START = "a"؛ رشته پایانی استاتیک خصوصی END = "e"؛ خالی ثابت عمومی اصلی (رشته آرگ) ( نمودار g = نمودار جدید (GRAPH)؛ g.dijkstra (START); g.printPath(END); //g.printAllPaths(); ) ) class Graph (نقشه نهایی خصوصی نمودار // نگاشت نام رئوس به اشیاء راس، ساخته شده از مجموعه ای از لبه ها /** یک یال نمودار (فقط توسط سازنده Graph استفاده می شود) */ کلاس static عمومی Edge ( رشته نهایی عمومی v1, v2; public final int dist; لبه عمومی (رشته v1، رشته v2، int dist) ( this.v1 = v1; this.v2 = v2; this.dist = dist; ) ) /** یک راس نمودار، کامل با نگاشت به رئوس همسایه */ عمومی استاتیک کلاس Vertex پیاده سازی Comparable (نام رشته نهایی عمومی؛ عمومی int dist = Integer.MAX_VALUE؛ // MAX_VALUE فرض می شود بی نهایت عمومی راس قبلی = تهی؛ نقشه نهایی عمومی همسایگان = HashMap جدید<>()؛ راس عمومی (نام رشته) ( this.name = name; ) private void printPath() ( if (this == this.previous) ( System.out.printf ("%s", this.name); ) other if ( this.previous == null) ( System.out.printf("%s(دسترسی نشده)"، this.name); ) else (this.previous.printPath(); System.out.printf(" -> %s( %d)"، this.name, this.dist); ) ) public int compareTo(Ras other) ( return Integer.compare(dist, other.dist); ) ) /** یک نمودار از مجموعه ای از یال ها می سازد * / Public Graph (لبه های لبه) ( نمودار = HashMap جدید<>(لبه ها.طول)؛ //یک پاس برای یافتن همه رئوس برای (Edge e: edges) ( if (!graph.containsKey(e.v1)) graph.put(e.v1، new Vertex(e.v1))؛ if (!graph. containKey(e.v2)) graph.put(e.v2، new Vertex(e.v2))؛ ) //یک پاس دیگر برای تنظیم رئوس همسایه برای (Edge e: edges) ( graph.get(e.v1). Neighbours.put(graph.get(e.v2)، e.dist); //graph.get(e.v2).neighbours.put(graph.get(e.v1)، e.dist); // همچنین این کار را برای یک گراف بدون جهت انجام دهید ) /** dijkstra را با استفاده از یک راس منبع مشخص اجرا می کند */ public void dijkstra(String startName) ( if (!graph.containsKey(startName)) ( System.err.printf("Graph حاوی راس شروع \"%s\"\n، startName)؛ بازگشت؛ ) منبع راس نهایی = graph.get(startName)؛ NavigableSet q = مجموعه درختی جدید<>()؛ // تنظیم رئوس برای (راس v: graph.values()) ( v.previous = v == منبع ? منبع: null; v.dist = v == منبع ? 0: Integer.MAX_VALUE; q.add( v) ) dijkstra(q); ) /** پیاده سازی الگوریتم dijkstra با استفاده از یک پشته باینری. */ private void dijkstra(final NavigableSet q) (راس u، v؛ while (!q.isEmpty()) (u = q.pollFirst(); // راس با کوتاه ترین فاصله (تکرار اول منبع را برمی گرداند) اگر (u.dist == Integer.MAX_VALUE) شکستن؛ // می‌توانیم u (و هر رئوس باقی‌مانده) را نادیده بگیریم، زیرا آنها غیرقابل دسترس هستند // به فاصله‌های هر همسایه برای (Map.Entry) نگاه کنیم a: u.neighbours.entrySet()) (v = a.getKey(); //همسایه در این تکرار int نهایی alternateDist = u.dist + a.getValue(); if (alternateDist< v.dist) { // shorter path to neighbour found q.remove(v); v.dist = alternateDist; v.previous = u; q.add(v); } } } } /** Prints a path from the source to the specified vertex */ public void printPath(String endName) { if (!graph.containsKey(endName)) { System.err.printf("Graph doesn"t contain end vertex \"%s\"\n", endName); return; } graph.get(endName).printPath(); System.out.println(); } /** Prints the path from the source to every vertex (output order is not guaranteed) */ public void printAllPaths() { for (Vertex v: graph.values()) { v.printPath(); System.out.println(); } } }

    سی

    #عبارتند از #عبارتند از #عبارتند از //#define BIG_EXAMPLE typedef struct node_t node_t, *heap_t; typedef struct edge_t edge_t; struct edge_t ( node_t *nd; /* target of this edge */ edge_t *sibling;/* for singlely linked list */ int len; /* edge cost */ ); struct node_t ( edge_t *edge; /* لیستی از یال ها به هم پیوند خورده */ node_t *از طریق؛ /* که گره قبلی در کوتاه ترین مسیر */ فاصله دو برابر است؛ /* فاصله از گره مبدأ */ نام کاراکتر؛ /* the, er ، نام */ int heap_idx؛ /* پیوند به موقعیت پشته برای به روز رسانی فاصله */ ); /* --- مدیریت لبه --- */ #ifdef BIG_EXAMPLE # define BLOCK_SIZE (1024 * 32 - 1) #else # define BLOCK_SIZE 15 #endif edge_t *edge_root = 0, *e_next = 0; /* به مسائل مدیریت حافظه اهمیتی ندهید، آنها غیر از موضوع هستند. تظاهر به e_next = malloc(sizeof(edge_t)) */ void add_edge(node_t *a, node_t *b, double d) ( if (e_next == edge_root ) ( edge_root = malloc(sizeof(edge_t) * (BLOCK_SIZE + 1)); edge_root.sibling = e_next؛ e_next = edge_root + BLOCK_SIZE؛ ) --e_next؛ e_next->nd = b؛ e_next->len = d -> خواهر = a-> edge; a->edge = e_next; ) void free_edges() ( for (; edge_root; edge_root = e_next) (e_next = edge_root.sibling; free(edge_root); ) ) /* --- چیزهای صف اولویت --- */ heap_t *heap; int heap_len; void set_dist(node_t *nd, node_t *via, double d) (int i, j; /* قبلاً مسیر بهتری را می دانست */ if (nd->via && d >= nd->dist) بازگشت؛ /* ورودی هیپ موجود را پیدا کنید، یا یک ورودی جدید ایجاد کنید */ nd->dist = d؛ nd->via = via؛ i = nd->heap_idx؛ اگر (!i) i = ++heap_len; /* upheap */ برای (; i > 1 && nd->dist< heap->دور i = j) (heap[i] = heap[j])->heap_idx = i; heap[i] = nd; nd->heap_idx = i; ) node_t * pop_queue() (node_t *nd, *tmp; int i, j؛ اگر (!heap_len) 0 را برگرداند؛ /* عنصر اصلی را حذف کنید، عنصر دم را به آنجا بکشید و downheap */ nd = heap؛ tmp = heap؛ برای (i = 1; i< heap_len && (j = i * 2) <= heap_len; i = j) { if (j < heap_len && heap[j]->dist > heap->dist) j++; if (heap[j]->dist >= tmp->dist) break; (heap[i] = heap[j])->heap_idx = i; ) heap[i] = tmp; tmp->heap_idx = i; بازگشت nd; ) /* --- Dijkstra stuff; گره های دست نیافتنی هرگز ساخته نمی شوند به درونصف --- */ void calc_all(node_t *start) ( node_t *lead; edge_t *e; set_dist(start, start, 0)؛ while ((lead = pop_queue())) for (e = lead->edge; e؛ e = e-> خواهر و برادر) set_dist(e->nd، lead، lead->dist + e->len)؛ ) void show_path(node_t *nd) (if (nd->via == nd) printf( "%s"، nd->name)؛ وگرنه اگر (!nd->از طریق) printf("%s(دسترسی نشده)"، nd->name)؛ else ( show_path(nd->via)؛ printf("- > %s(%g) ", nd->name, nd->dist); ) ) int main(void) ( #ifndef BIG_EXAMPLE int i; # تعریف N_NODES ("f" - "a" + 1) node_t * گره = calloc(sizeof(node_t)، N_NODES)؛ برای (i = 0; i< N_NODES; i++) sprintf(nodes[i].name, "%c", "a" + i); # define E(a, b, c) add_edge(nodes + (a - "a"), nodes + (b - "a"), c) E("a", "b", 7); E("a", "c", 9); E("a", "f", 14); E("b", "c", 10);E("b", "d", 15);E("c", "d", 11); E("c", "f", 2); E("d", "e", 6); E("e", "f", 9); # undef E #else /* BIG_EXAMPLE */ int i, j, c; # define N_NODES 4000 node_t *nodes = calloc(sizeof(node_t), N_NODES); for (i = 0; i < N_NODES; i++) sprintf(nodes[i].name, "%d", i + 1); /* given any pair of nodes, there"s about 50% chance they are not connected; if connected, the cost is randomly chosen between 0 and 49 (inclusive! see output for consequences) */ for (i = 0; i < N_NODES; i++) { for (j = 0; j < N_NODES; j++) { /* majority of runtime is actually spent here */ if (i == j) continue; c = rand() % 100; if (c < 50) continue; add_edge(nodes + i, nodes + j, c - 50); } } #endif heap = calloc(sizeof(heap_t), N_NODES + 1); heap_len = 0; calc_all(nodes); for (i = 0; i < N_NODES; i++) { show_path(nodes + i); putchar("\n"); } #if 0 /* real programmers don"t free memories (they use Fortran) */ free_edges(); free(heap); free(nodes); #endif return 0; }

    PHP

    $edge, "cost" => $edge); $neighbours[$edge] = آرایه("end" => $edge, "cost" => $edge); ) $vertices = array_unique($vertices); foreach ($vertices به عنوان $vertex) ( $dist[$vertex] = INF; $previous[$vertex] = NULL; ) $dist[$source] = 0; $Q = $راس; while (count($Q) > 0) ( // TODO - راه سریع‌تری برای دریافت حداقل $min = INF پیدا کنید؛ foreach ($Q به عنوان $vertex)( if ($dist[$vertex]< $min) { $min = $dist[$vertex]; $u = $vertex; } } $Q = array_diff($Q, array($u)); if ($dist[$u] == INF or $u == $target) { break; } if (isset($neighbours[$u])) { foreach ($neighbours[$u] as $arr) { $alt = $dist[$u] + $arr["cost"]; if ($alt < $dist[$arr["end"]]) { $dist[$arr["end"]] = $alt; $previous[$arr["end"]] = $u; } } } } $path = array(); $u = $target; while (isset($previous[$u])) { array_unshift($path, $u); $u = $previous[$u]; } array_unshift($path, $u); return $path; } $graph_array = array(array("a", "b", 7), array("a", "c", 9), array("a", "f", 14), array("b", "c", 10), array("b", "d", 15), array("c", "d", 11), array("c", "f", 2), array("d", "e", 6), array("e", "f", 9)); $path = dijkstra($graph_array, "a", "e"); echo "path is: ".implode(", ", $path)."\n";


    پایتون

    از مجموعه ها import namedtuple، صف از pprint واردات pprint به عنوان pp inf = float("inf") Edge = namedtuple("Edge", "start, end, cost") class Graph(): def __init__(self, edges): self .edges = edges2 = self.vertices = set(sum(( برای e در edges2), )) def dijkstra(self, source, dest): عنوان منبع در self.vertices dist = (راس: inf برای راس در self.vertices ) previous = (راس: هیچ برای راس در self.vertices) dist = 0 q = self.vertices.copy() همسایگان = (راس: set() برای راس در self.vertices) برای شروع، پایان، هزینه در خود. edges: nears.add((پایان، هزینه)) #pp(همسایگان) در حالی که q: u = min(q، کلید = راس لامبدا: dist) q.remove(u) if dist[u] == inf یا u = = dest: شکست برای v، هزینه در همسایگان[u]: alt = dist[u] + هزینه اگر alt< dist[v]: # Relax (u,v,a) dist[v] = alt previous[v] = u #pp(previous) s, u = deque(), dest while previous[u]: s.pushleft(u) u = previous[u] s.pushleft(u) return s graph = Graph([("a", "b", 7), ("a", "c", 9), ("a", "f", 14), ("b", "c", 10), ("b", "d", 15), ("c", "d", 11), ("c", "f", 2), ("d", "e", 6), ("e", "f", 9)]) pp(graph.dijkstra("a", "e")) Output: ["a", "c", "d", "e"]