A e dini pse është më në vijë të drejtë sesa në hark? Përcaktimi i distancës ndërmjet dy drejtëzave paralele Cila është distanca më e shkurtër ndërmjet dy pikave

Rruga përgjatë vijës me pika në figurë është më e shkurtër se shtegu përgjatë vijës së fortë. Dhe tani pak më në detaje në shembullin e rrugëve detare:

Nëse lundroni në një kurs të vazhdueshëm, atëherë trajektorja e lëvizjes së anijes përgjatë sipërfaqen e tokës do të jetë një kurbë e quajtur në matematikë logaritmikespirale.

Në lundrim, kjo linjë komplekse e lakimit të dyfishtë quhet loksodromia, që në greqisht do të thotë "vrapim i zhdrejtë".

Sidoqoftë, distanca më e shkurtër midis dy pikave në glob matet përgjatë harkut të një rrethi të madh.

Harku i një rrethi të madh merret si gjurmë nga kryqëzimi i sipërfaqes së tokës me një rrafsh që kalon në qendër të tokës, i marrë si një top.

Në lundrim, quhet harku i madh i rrethit rreth i madh, që do të thotë "vrapim drejt". Tipari i dytë i rrethit të madh është se ai kalon meridianët në kënde të ndryshme (Fig. 29).

Dallimi në distancat midis dy pikave në sipërfaqen e tokës përgjatë loksodromit dhe ortodromit është me rëndësi praktike vetëm për kalimet e mëdha të oqeanit.

Në kushte normale, kjo ndryshim neglizhohet dhe lundrimi kryhet në një kurs të vazhdueshëm, d.m.th. me loksodrom.

Për të nxjerrë ekuacionin, marrim loksodromitë (Fig. 30, a) dy pika POR dhe AT, distanca midis tyre është thjesht e vogël. Duke tërhequr meridianët dhe një paralele përmes tyre, marrim një trekëndësh elementar sferik kënddrejtë ABC. Në këtë trekëndësh, këndi i formuar nga kryqëzimi i meridianit dhe paraleles është i drejtë, dhe këndi PnAB e barabartë me rrjedhën e anijes K. Katet AC përfaqëson një segment të harkut meridian dhe mund të shprehet

ku R - rrezja e Tokës marrë si sferë;

Δφ - rritja elementare e gjerësisë gjeografike (ndryshimi i gjerësive gjeografike).

këmbën JP paraqet një segment hark paralel

ku r - rrezja e paraleles;

Δλ - dallimi elementar i gjatësive gjeografike.

Nga trekëndëshi OO 1 C mund të gjendet se

Pastaj në formën përfundimtare këmbën JP mund të shprehet kështu:

Duke supozuar një trekëndësh elementar sferik ABC për banesë, shkruani

Pas reduktimit R dhe duke zëvendësuar rritjet elementare të vogla të koordinatave me ato infiniteminale, kemi

Ne integrojmë shprehjen që rezulton në rangun nga φ 1, λ 1 në φ 2, λ 2 duke marrë parasysh vlerën e tgK si një vlerë konstante:

Në anën e djathtë kemi një integral tabelor. Pasi zëvendësojmë vlerën e tij, marrim ekuacionin e loksodromit në top

Analiza e këtij ekuacioni na lejon të nxjerrim përfundimet e mëposhtme:

Në kurset 0 dhe 180 °, loksodromi kthehet në një hark të një rrethi të madh - një meridian;

Në kurset 90 dhe 270 °, loksodromi përkon me paralelen;

Loksodromi kalon çdo paralele vetëm një herë, dhe çdo meridian një numër të panumërueshëm herë. ato. duke iu afruar në mënyrë spirale shtyllës, nuk e arrin atë.

Lundrimi në një kurs konstant, d.m.th., përgjatë loksodromit, megjithëse nuk është distanca më e shkurtër midis dy pikave në Tokë, paraqet një lehtësi të konsiderueshme për lundruesin.

Kërkesat për një tabelë lundrimi detar mund të formulohen bazuar në avantazhin e lundrimit përgjatë loksodromit dhe rezultatet e analizës së ekuacionit të tij si më poshtë.

1. Loksodromi, që kalon meridianët në një kënd konstant, duhet të përshkruhet si një vijë e drejtë.

2. projeksioni i hartës, që përdoret për ndërtimin e hartave, duhet të jetë barazkëndësh, në mënyrë që rrjedhat, kushinetat dhe këndet në të të korrespondojnë me vlerën e tyre në tokë.

3. Meridianët dhe paralelet, si vijat e kursit 0, 90, 180° dhe 270°, duhet të jenë drejtëza pingule reciproke.

Distanca më e shkurtër ndërmjet dy pikave të dhëna në sipërfaqen e Tokës, e marrë si sferë, është më e vogla nga harqet e një rrethi të madh që kalon nëpër këto pika. Me përjashtim të rastit të një anijeje që ndjek një meridian ose ekuator, rrethi i madh përshkon meridianët në kënde të ndryshme. Prandaj, një anije që ndjek një kurbë të tillë duhet të ndryshojë kursin e saj gjatë gjithë kohës. Është praktikisht më i përshtatshëm për të ndjekur një kurs që bën një kënd konstant me meridianët dhe përshkruhet në hartë në projeksionin Mercator nga një vijë e drejtë - loxodrome. Megjithatë, në distanca të mëdha, diferenca në gjatësinë e ortodromit dhe loksodromit arrin një vlerë të konsiderueshme. Prandaj, në raste të tilla, llogaritet ortodromi dhe mbi të shënohen pika të ndërmjetme, midis të cilave notojnë përgjatë loksodromit.

Një projeksion hartografik që plotëson kërkesat e mësipërme u propozua nga hartografi holandez Gerard Cramer (Mercator) në vitin 1569. Për nder të krijuesit të tij, projeksioni u emërua Merkatori.

Dhe kush dëshiron të marrë edhe më shumë informacion interesant Mëso më shumë Artikulli origjinal është në faqen e internetit InfoGlaz.rf Lidhja me artikullin nga i cili është bërë kjo kopje -

DISTANCA, largësitë, krh. 1. Hapësirë ​​që ndan dy pika, hendek midis diçkaje. Distanca më e shkurtër midis dy pikave në një vijë të drejtë. Jeton nga ne në një distancë prej dy kilometrash. "Komandanti i la ata të hyjnë në distancën më të afërt ... Fjalor Ushakov

distancë- emër, s., përdorim. shpesh Morfologjia: (jo) çfarë? distanca për çfarë? distanca, (shih) çfarë? distanca se? distanca, çfarë? në lidhje me distancën; pl. çfarë? distanca, (jo) çfarë? distancat, pse? distancat, (shih) çfarë? distanca se? distanca... Fjalori i Dmitriev

distancë- Unë; kf. Hapësira që ndan dy pika, dy objekte etj., hendeku midis dikujt, se l. Lumi më i shkurtër mes dy pikave. R. nga shtëpia në shkollë. Tërhiqeni në një lumë aty pranë. Në një distancë prej një metri, krahët e shtrirë. Di diçka, ndje diçka. në…… fjalor enciklopedik

distancë- Unë; kf. Shiko gjithashtu largësia a) Hapësira që ndan dy pika, dy objekte etj., hendeku midis dikujt, se l. Distanca më e shkurtër midis dy pikave. Distanca nga shtëpia në shkollë. Tërhiqe në një distancë të afërt / nie ... Fjalor i shumë shprehjeve

GJEOMETRI- një degë e matematikës që studion vetitë e formave të ndryshme (pika, vija, kënde, objekte dydimensionale dhe tredimensionale), madhësinë dhe pozicionin e tyre relativ. Për lehtësinë e mësimdhënies, gjeometria ndahet në planimetri dhe gjeometri solide. NË…… Enciklopedia Collier

Navigacion*

Navigimi- departamenti i lundrimit (shih), duke përfunduar një prezantim të mënyrave për të përcaktuar vendin e një anijeje në det, duke përdorur një busull dhe një regjistër (shih). Për të përcaktuar vendin e një anijeje në det do të thotë të vendosësh në hartë pikën në të cilën ndodhet anija ky moment e vendosur.… … Fjalor Enciklopedik F.A. Brockhaus dhe I.A. Efron

COGEN- (Cohen) Hermann (1842 1918) filozof gjerman, themeluesi dhe përfaqësuesi më i shquar i shkollës së Marburgut të neokantianizmit. Veprat kryesore: "Teoria e Kantit të përvojës" (1885), "Justifikimi i etikës nga Kanti" (1877), "Justifikimi i estetikës nga Kanti" (1889), "Logjika... ...

Kant Immanuel- Rruga e jetës dhe shkrimet e Kant Immanuel Kant lindi në Konigsberg (tani Kaliningrad) në Prusinë Lindore në 1724. Babai i tij ishte një samarxhi, dhe nëna e tij ishte shtëpiake, gjashtë nga fëmijët e tyre nuk jetuan deri në moshën madhore. Kanti i kujtonte gjithmonë prindërit e tij me ... ... Filozofia perëndimore nga origjina e saj deri në ditët e sotme

FILOZOFIA KRITIKE E KANTIT: DOKTRINA E AFTËSIVE- (La philosophie critique de Kant: Doctrines des facultes, 1963) nga Deleuze. Duke përshkruar metodën transcendentale në hyrje, Deleuze vëren se Kanti e kupton filozofinë si shkencë për lidhjen e të gjithë njohurive me qëllimet thelbësore... ... Historia e Filozofisë: Enciklopedi

parimi i fermës- parimi bazë i optikës gjeometrike (Shih Optika gjeometrike). Forma më e thjeshtë e F. p. është pohimi se një rreze drite përhapet gjithmonë në hapësirë ​​midis dy pikave përgjatë shtegut përgjatë së cilës koha e kalimit të saj është më pak se ... I madh enciklopedia sovjetike

(Gjeometria përshkruese)
  • CD (CXDX, C2D2) shfaqet si një pikë C5 = D5 A5B5 e barabartë me...
    (Gjeometria përshkruese)
  • Përcaktimi i distancës ndërmjet dy rrafsheve paralele
    Përcaktimi i distancës ndërmjet dy rrafsheve paralele në pozicionin e përgjithshëm 01| Xështë e përshtatshme për ta reduktuar atë në problemin e përcaktimit të distancës midis të njëjtëve dy plane, të shndërruar në pozicionin e atyre projektues. Në këtë rast, distanca midis planeve përcaktohet si pingul midis vijave, ...
    (Gjeometria përshkruese)
  • Përcaktimi i distancës ndërmjet dy drejtëzave të kryqëzuara
    Nëse dëshironi të përcaktoni distancën më të shkurtër midis dy vijave të kryqëzuara, duhet të ndryshoni dy herë sistemet e planeve të projektimit. Gjatë zgjidhjes së këtij problemi, direkt CD (CXDX, C2D2) shfaqet si një pikë C5 = D5(Fig. 198). Largësia nga kjo pikë në projeksion A5B5 e barabartë me...
    (Gjeometria përshkruese)
  • Këndi midis dy drejtëzave të kryqëzuara
    Ky është këndi midis dy vijave të kryqëzuara që janë paralele me të dhënat. Kështu, kjo detyrë është e ngjashme me atë të mëparshme. Për ta zgjidhur atë, ju duhet të merrni një pikë arbitrare dhe të vizatoni dy vija përmes saj paralele me linjat e dhëna anore, dhe duke përdorur transformimin e projeksionit për të përcaktuar këndin e kërkuar....
    (Bazat e gjeometrisë përshkruese. Kurs i shkurtër dhe një koleksion detyrash.)
  • Përcaktimi i distancës ndërmjet dy drejtëzave paralele
    Problemi zgjidhet me metodën e zëvendësimit të dyfishtë të planeve të projeksionit. Në fazën përfundimtare, një nga rrafshet e projeksionit duhet të jetë pingul me një nga linjat kryqëzuese. Atëherë distanca më e shkurtër ndërmjet tyre përcaktohet nga vlera e segmentit të pingulit me vijën tjetër të anuar (Fig. 199).
    (Gjeometria përshkruese)
  • Pasi ka përshkruar dy pika në dërrasën e zezë me shkumës, mësuesi i ofron studentit të ri një detyrë: të vizatojë rrugën më të shkurtër midis të dy pikave.

    Nxënësi, pasi mendon, tërheq me zell një vijë dredha-dredha midis tyre.

    - Kjo është rruga më e shkurtër! mësuesi habitet. - Kush të mësoi këtë?

    - Babai im. Ai është një shofer taksie.

    Vizatimi i një nxënësi naiv është padyshim anekdotik, por a nuk do të buzëqeshnit nëse do t'ju thoshin se harku me pika në fig. 1 është rruga më e shkurtër nga Kepi i Shpresës së Mirë në majën jugore të Australisë!

    Edhe më e habitshme është deklarata e mëposhtme: e paraqitur në Fig. Udhëtimi 2 vajtje-ardhje nga Japonia në Kanalin e Panamasë është më i shkurtër se vija e drejtë e tërhequr mes tyre në të njëjtën hartë!

    Oriz. 1. Në harta e detit rruga më e shkurtër nga Kepi i Shpresës së Mirë në majën jugore të Australisë nuk tregohet nga një vijë e drejtë ("loxodrome"), por nga një kurbë ("ortodromi")


    E gjithë kjo duket si një shaka, por ndërkohë përpara jush janë të vërteta të padiskutueshme, të njohura për hartografët.




    Oriz. 2. Duket e pabesueshme që shtegu i lakuar që lidh Yokohama në tabelën e detit me Kanalin e Panamasë është më i shkurtër se një vijë e drejtë e tërhequr midis të njëjtave pika


    Për të sqaruar çështjen, do të duhen thënë disa fjalë për hartat në përgjithësi dhe për hartat detare në veçanti. Vizatimi i pjesëve të sipërfaqes së tokës në letër nuk është një detyrë e lehtë, edhe në parim, sepse Toka është një sferë dhe dihet se asnjë pjesë e sipërfaqes sferike nuk mund të vendoset në një plan pa palosje dhe thyerje. Në mënyrë të pavullnetshme, njeriu duhet të përballojë shtrembërimet e pashmangshme në harta. Janë shpikur shumë mënyra të vizatimit të hartave, por të gjitha hartat nuk janë pa mangësi: disa kanë shtrembërime të një lloji, të tjera të një lloji tjetër, por nuk ka fare harta pa shtrembërime.

    Detarët përdorin harta të vizatuara sipas metodës së një hartografi dhe matematikani të vjetër holandez të shekullit të 16-të. Merkatori. Kjo metodë quhet projeksioni Mercator. Është e lehtë të dallosh një tabelë detare nga rrjeti i saj drejtkëndor: meridianët tregohen në të si një seri vijash të drejta paralele; rrathët e gjerësisë gjeografike - gjithashtu në vija të drejta pingul me të parën (shih Fig. 5).

    Imagjinoni tani që dëshironi të gjeni shtegun më të shkurtër nga një port oqean në tjetrin në të njëjtën paralele. Në oqean, të gjitha shtigjet janë të disponueshme dhe është gjithmonë e mundur të udhëtosh atje përgjatë shtegut më të shkurtër nëse e di se si shtrihet. Në rastin tonë, është e natyrshme të mendojmë se shtegu më i shkurtër shkon përgjatë paraleles në të cilën shtrihen të dy portet: në fund të fundit, në hartë është një vijë e drejtë, dhe çfarë mund të jetë më e shkurtër se një rrugë e drejtë! Por ne gabojmë: rruga përgjatë paraleles nuk është aspak më e shkurtra.

    Në të vërtetë: në sipërfaqen e një sfere, distanca më e shkurtër midis dy pikave është harku i rrethit të madh që i lidh ato. Por rrethi i paraleles të vogla një rreth. Harku i një rrethi të madh është më pak i lakuar se harku i çdo rrethi të vogël të tërhequr nëpër të njëjtat dy pika: një rreze më e madhe korrespondon me një lakim më të vogël. Tërhiqni fillin në glob midis dy pikave tona (krh. Fig. 3); do të siguroheni që ajo të mos shtrihet fare përgjatë paraleles. Një fije e ngushtë - një tregues i padiskutueshëm rruga më e shkurtër, dhe nëse nuk përkon me paralelen në glob, atëherë në tabelën e detit shtegu më i shkurtër nuk tregohet nga një vijë e drejtë: kujtoni se rrathët e paraleleve përshkruhen në një hartë të tillë me vija të drejta, çdo vijë që tregon nuk përkon me një vijë të drejtë është kurbë .



    Oriz. 3. Një mënyrë e thjeshtë për të gjetur rrugën më të shkurtër midis dy pikave: duhet të tërhiqni një fije në glob midis këtyre pikave


    Pas asaj që u tha, bëhet e qartë pse shtegu më i shkurtër në tabelën e detit përshkruhet jo si një vijë e drejtë, por si një vijë e lakuar.

    Ata thonë se kur zgjedhin një drejtim për Nikolaevskaya (tani Oktyabrskaya) hekurudhor pati mosmarrëveshje të pafundme se në cilën mënyrë do të shtrohej. Mosmarrëveshjet u dhanë fund nga ndërhyrja e Car Nikollës I, i cili e zgjidhi problemin fjalë për fjalë "drejtpërsëdrejti": ai lidhi Shën Petersburgun me Moskën përgjatë vijës. Nëse kjo do të ishte bërë në një hartë Mercator, do të ishte një surprizë e turpshme: në vend të një vije të drejtë, rruga do të ishte një kthesë.

    Kushdo që nuk i shmang llogaritjet mund të bindet me një llogaritje të thjeshtë se rruga që na duket e lakuar në hartë është në fakt më e shkurtër se ajo që ne jemi gati ta konsiderojmë të drejtë. Lërini dy portet tona të shtrihen në paralelen e 60-të dhe të ndahen me një distancë prej 60°. (Nëse dy porte të tilla ekzistojnë në të vërtetë është, natyrisht, e parëndësishme për t'u llogaritur.)



    Oriz. 4. Për llogaritjen e distancave ndërmjet pikave A dhe B në top përgjatë harkut të paraleles dhe përgjatë harkut të rrethit të madh


    Në fig. 4 pikë O - qendër Globi, AB - harku i rrethit të gjerësisë gjeografike mbi të cilin shtrihen portet A dhe B; në 60° e saj. Qendra e rrethit të gjerësisë është në një pikë NGA Imagjinoni që nga qendra O i globit është tërhequr nëpër të njëjtat porta një hark i madh rrethi: rrezja e tij OB = OA = R; do të kalojë afër harkut të tërhequr AB, por nuk përputhet.

    Le të llogarisim gjatësinë e secilit hark. Që nga pikat POR dhe AT shtrihen në një gjerësi prej 60°, pastaj rrezet OA dhe OV make up me OS(boshti i globit) një kënd prej 30°. Në një trekëndësh kënddrejtë ASO këmbën AC (=r), shtrirja përballë një këndi prej 30° është e barabartë me gjysmën e hipotenuzës SHA;

    do të thotë, r=R/2 Gjatësia e harkut ABështë një e gjashta e gjatësisë së rrethit të gjerësisë gjeografike, dhe meqenëse ky rreth ka gjysmën e gjatësisë së rrethit të madh (që korrespondon me gjysmën e rrezes), atëherë gjatësia e harkut të rrethit të vogël



    Për të përcaktuar tani gjatësinë e harkut të një rrethi të madh të tërhequr midis pikave të njëjta (d.m.th., shtegut më të shkurtër midis tyre), duhet të dimë madhësinë e këndit AOW. Akord AS, duke zbritur harkun në 60 ° (rreth i vogël), është ana e një gjashtëkëndëshi të rregullt të gdhendur në të njëjtin rreth të vogël; prandaj AB \u003d r \u003d R / 2

    Vizatimi i një vije të drejtë od, qendër lidhëse O globin me mes D akorde AB, merrni një trekëndësh kënddrejtë ODA, ku është këndi D- drejt:

    DA= 1/2 AB dhe OA=R.

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

    Nga këtu gjejmë (sipas tabelave):

    =14°28",5

    dhe si rrjedhim

    = 28°57".

    Tani nuk është e vështirë të gjesh gjatësinë e dëshiruar të shtegut më të shkurtër në kilometra. Llogaritja mund të thjeshtohet nëse kujtojmë se gjatësia e një minute të një rrethi të madh të globit është

    Mësojmë se shtegu përgjatë rrethit të gjerësisë gjeografike, i paraqitur në tabelën e detit me një vijë të drejtë, është 3333 km, dhe shtegu përgjatë rrethit të madh - përgjatë kurbës në hartë - 3213 km, pra 120 km më i shkurtër.

    Të armatosur me një fije dhe duke pasur një glob në dorë, mund të kontrolloni lehtësisht korrektësinë e vizatimeve tona dhe të siguroheni që harqet e rrathëve të mëdhenj qëndrojnë vërtet siç tregohet në vizatime. Treguar në fig. 1 sikur rruga "e drejtë" detare nga Afrika në Australi të jetë 6020 milje, dhe "kurba" - 5450 milje, d.m.th. më e shkurtër për 570 milje, ose 1050 km. Rruga ajrore "e drejtpërdrejtë" në tabelën detare nga Londra në Shangai kalon nëpër Detin Kaspik, ndërsa rruga më e shkurtër është në veri të Shën Petersburgut. Është e qartë se çfarë roli luajnë këto çështje në kursimin e kohës dhe karburantit.

    Nëse në epokën e lundrimit, koha e transportit me vela nuk vlerësohej gjithmonë - atëherë "koha" nuk konsiderohej ende "para", atëherë me ardhjen e anijeve me avull, duhet të paguani për çdo ton shtesë qymyr të konsumuar. Kjo është arsyeja pse sot anijet po lundrojnë në rrugën vërtet më të shkurtër, shpesh duke përdorur harta të bëra jo në Mercator, por në të ashtuquajturin projeksion "qendror": në këto harta, harqet e rrathëve të mëdhenj përshkruhen si vija të drejta.

    Pse, atëherë, ish-lundërtarët përdorën harta të tilla mashtruese dhe zgjodhën shtigje të pafavorshme? Është gabim të mendosh se në kohët e vjetra ata nuk dinin për veçorinë e treguar tani të tabelave të detit. Çështja shpjegohet, natyrisht, jo me këtë, por me faktin se tabelat e hartuara sipas metodës Mercator, së bashku me shqetësimet, kanë përfitime shumë të vlefshme për marinarët. Një hartë e tillë, së pari, përshkruan pjesë të vogla të veçanta të sipërfaqes së tokës pa shtrembërim, duke ruajtur qoshet e konturit. Kjo nuk kundërshtohet nga fakti se me largësinë nga ekuatori, të gjitha konturet shtrihen dukshëm. Në gjerësi të larta, shtrirja është aq domethënëse sa që një tabelë detare frymëzon një person që nuk është i njohur me tiparet e tij me një ide krejtësisht të rreme të madhësisë së vërtetë të kontinenteve: Grenlanda duket se ka të njëjtën madhësi si Afrika, Alaska është më e madhe se Australia, megjithëse Grenlanda është 15 herë më e vogël se Afrika, dhe Alaska së bashku me Grenlandën sa gjysma e Australisë. Por një marinar që i njeh mirë këto veçori të tabelës nuk mund të mashtrohet prej tyre. Ai i duron ato, veçanërisht pasi, brenda zonave të vogla, një tabelë detare jep një ngjashmëri të saktë të natyrës (Fig. 5).

    Nga ana tjetër, harta detare lehtëson shumë zgjidhjen e detyrave të praktikës lundruese. Ky është i vetmi lloj grafikësh në të cilin shtegu i një anijeje në një kurs konstant përshkruhet si një vijë e drejtë. Të ndjekësh një "rrugë konstante" do të thotë të mbash pa ndryshim një drejtim, një "humb" të caktuar, me fjalë të tjera, të shkosh në atë mënyrë që të kalosh të gjithë meridianët në një kënd të barabartë. Por kjo rrugë ("loxodrome") mund të përshkruhet si një vijë e drejtë vetëm në një hartë në të cilën të gjithë meridianët janë vija të drejta paralele me njëri-tjetrin. Dhe meqenëse në glob rrathët e gjerësisë gjeografike kryqëzohen me meridianët në kënde të drejta, atëherë në një hartë të tillë rrathët e gjerësisë gjeografike duhet të jenë vija të drejta pingul me vijat e meridianëve. Me pak fjalë, arrijmë pikërisht në rrjetin koordinativ që përbën një tipar karakteristik të hartës detare.




    Oriz. 5. Harta detare ose Mercator e globit. Në harta të tilla, dimensionet e kontureve larg ekuatorit janë shumë të ekzagjeruara. Cila, për shembull, është më e madhe: Grenlanda apo Australia? (përgjigja në tekst)


    Predikimi i marinarëve për hartat Mercator tani është i kuptueshëm. Duke dashur të përcaktojë kursin që duhet ndjekur kur shkon në portin e caktuar, navigatori vendos një vizore në pikat fundore të shtegut dhe mat këndin që bën me meridianët. Duke u mbajtur në det të hapur gjatë gjithë kohës në këtë drejtim, navigatori do ta sjellë me saktësi anijen në objektiv. E shihni që "loxodromi" është, megjithëse jo më i shkurtri dhe jo më ekonomiki, por në një farë mënyre një mënyrë shumë e përshtatshme për një marinar. Për të arritur, për shembull, nga Kepi i Shpresës së Mirë në majën jugore të Australisë (shih Fig. 1), duhet mbajtur gjithmonë i njëjti kurs S 87 °.50 ". Ndërkohë, për ta sjellë anijen në të njëjtën pika përfundimtare rruga më e shkurtër(sipas "ortodromisë"), është e nevojshme, siç shihet nga figura, të ndryshohet vazhdimisht rrjedha e anijes: filloni nga kursi S 42 °, 50 "dhe përfundoni me kursin N 53 °, 50 " (në këtë rast, rruga më e shkurtër nuk është as e realizueshme - ajo qëndron në murin e akullit të Antarktikut).

    Të dy shtigjet - përgjatë "loxodromit" dhe përgjatë "ortodromisë" - përkojnë vetëm kur shtegu përgjatë rrethit të madh përshkruhet në tabelën e detit si një vijë e drejtë: kur lëviz përgjatë ekuatorit ose përgjatë meridianit. Në të gjitha rastet e tjera, këto rrugë janë të ndryshme.

    Algoritmi i Dijkstra është një algoritëm grafik i shpikur nga shkencëtari holandez Edsger Dijkstra në 1959. Gjen shtigjet më të shkurtra nga një nga kulmet e grafikut në të gjitha të tjerat. Algoritmi funksionon vetëm për grafikët pa skaje me peshë negative.

    Konsideroni ekzekutimin e algoritmit në shembullin e grafikut të paraqitur në figurë.

    Le të kërkohet gjetja e distancave më të shkurtra nga kulmi i 1-rë në të gjitha të tjerat.

    Rrathët tregojnë kulmet, vijat tregojnë shtigjet ndërmjet tyre (skajet e grafikut). Numrat e kulmeve tregohen në rrathë, "çmimi" i tyre - gjatësia e shtegut - tregohet mbi skajet. Pranë çdo kulmi, shënohet një etiketë e kuqe - gjatësia e shtegut më të shkurtër drejt këtij kulmi nga kulmi 1.

    Hapi i parë. Konsideroni një hap në algoritmin e Dijkstra për shembullin tonë. Kulmi 1 ka etiketën minimale. Kulmet 2, 3 dhe 6 janë fqinjët e tij.

    Fqinji i parë i kulmit 1 nga ana e tij është kulmi 2, sepse gjatësia e rrugës drejt tij është minimale. Gjatësia e rrugës drejt saj përmes kulmit 1 është e barabartë me shumën e vlerës së etiketës së kulmit 1 dhe gjatësisë së skajit që shkon nga 1 në 2, domethënë 0 + 7 = 7. Kjo është më pak se etiketa aktuale e kulmit 2, pafundësia, kështu që etiketa e re e kulmit të dytë është 7.

    Ne kryejmë një operacion të ngjashëm me dy fqinjë të tjerë të kulmit të 1-të - të 3-të dhe të 6-të.

    Kontrollohen të gjithë fqinjët e nyjës 1. Distanca minimale aktuale deri në majën 1 konsiderohet përfundimtare dhe nuk i nënshtrohet rishikimit (fakti që është vërtet kështu është vërtetuar fillimisht nga E. Dijkstra). Kryqëzojeni atë nga grafiku për të shënuar që kjo kulm është vizituar.

    Hapi i dytë. Hapi i algoritmit përsëritet. Përsëri gjejmë "më të afërt" të kulmeve të pavizituara. Ky është kulmi 2 i etiketuar 7.

    Përsëri ne përpiqemi të zvogëlojmë etiketat e fqinjëve të kulmit të zgjedhur, duke u përpjekur t'i kalojmë ato përmes kulmit të 2-të. Fqinjët e kulmit 2 janë kulmet 1, 3 dhe 4.

    Fqinji i parë (në radhë) i kulmit 2 është kulmi 1. Por ai tashmë është vizituar, kështu që nuk bëjmë asgjë me kulmin e parë.

    Fqinji tjetër i kulmit 2 është kulmi 3, pasi ka etiketën minimale të kulmeve të shënuara si të pavizituara. Nëse shkoni në të përmes 2, atëherë gjatësia e një shtegu të tillë do të jetë e barabartë me 17 (7 + 10 = 17). Por etiketa aktuale e kulmit të tretë është 9, që është më pak se 17, kështu që etiketa nuk ndryshon.

    Një fqinj tjetër i kulmit 2 është kulmi 4. Nëse shkoni në të përmes 2-tës, atëherë gjatësia e një rruge të tillë do të jetë e barabartë me shumën e distancës më të shkurtër në kulmin e dytë dhe distancën midis kulmeve 2 dhe 4, d.m.th. , 22 (7 + 15 = 22) . Që nga 22<, устанавливаем метку вершины 4 равной 22.

    Të gjithë fqinjët e kulmit 2 janë parë, ne ngrijmë distancën me të dhe e shënojmë si të vizituar.

    Hapi i tretë. Ne përsërisim hapin e algoritmit duke zgjedhur kulmin 3. Pas "përpunimit" të tij, marrim rezultatet e mëposhtme:

    Hapat e ardhshëm. Ne përsërisim hapin e algoritmit për kulmet e mbetura. Këto do të jenë respektivisht kulmet 6, 4 dhe 5.

    Përfundimi i ekzekutimit të algoritmit. Algoritmi përfundon kur nuk mund të përpunohen më kulme. Në këtë shembull, të gjitha kulmet janë kryqëzuar, por është gabim të supozohet se kjo do të jetë rasti në çdo shembull - disa kulme mund të mbeten të pakryqëzuara nëse nuk mund të arrihen, d.m.th. nëse grafiku shkëputet. Rezultati i algoritmit është i dukshëm në figurën e fundit: rruga më e shkurtër nga kulmi 1 në 2 është 7, në 3 është 9, në 4 është 20, në 5 është 20, në 6 është 11.

    Zbatimi i algoritmit në gjuhë të ndryshme programimi:

    C++

    #include "stdafx.h" #include duke përdorur namespace std; const int V=6; // Algoritmi i 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 i "< "<> "; cin>>fillimi; Dijkstra (GR, start-1); sistemi ("pauzë>>i pavlefshëm"); )

    Paskalin

    programi DijkstraAlgorithm; usecrt; constV=6; inf=100000; tip vector=rrjedhje e numrit të plotë; var start: integer; const GR: grupi i numrave të plotë=((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)); (algoritmi i Dijkstra-s) procedura Dijkstra(GR: grup i numrave të plotë; st: numër i plotë); var count, index, i, u, m, min: integer; distanca: vektor; vizituar: grup i boolean; fillimi:=st; për i:=1 deri në V filloni distancën[i]:=inf; vizituar[i]:=false; fundi; distanca:=0; për numërimin:=1 deri në V-1 filloni min:=inf; për i:=1 deri në V bëj nëse (nuk është vizituar[i]) dhe (distanca[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) dhe (distanca[u]<>inf) dhe (distanca[u]+GR inf pastaj writeln(m," > ", i," = ", distanca[i]) else writeln(m," > ", i," = ", "rruga e padisponueshme"); fundi; (blloku kryesor i programit) start clrscr; write ("Nyja fillestare >> "); lexo (fillim); Dijkstra (GR, fillimi); fund.

    Java

    importoni java.io.BufferedReader; import java.io.IOException; importoni java.io.InputStreamReader; import java.io.PrintWriter; importoni java.util.ArrayList; import java.util.Arrays; importoni java.util.StringTokenizer; klasë publike Zgjidhje ( int statike private INF = Integer.MAX_VALUE / 2; int private n; //numri i kulmeve në digraf privat int m; //numri i harqeve në digraf privat ArrayList adj; //lista e afërsisë ArrayList private pesha; //pesha e skajit në digraph privat boolean e përdorur; //array për ruajtjen e informacionit për majat e kaluara dhe të pakaluara private int dist; //array për të ruajtur distancën nga kulmi fillestar //një grup paraardhësish të nevojshëm për të rivendosur shtegun më të shkurtër nga kulmi fillestar privat int pred; int start; //kulmi fillestar, nga i cili kërkohet distanca me të gjitha të tjerat private BufferedReader cin; privat PrintWriter cout; shënues privat StringTokenizer; //procedura për fillimin e algoritmit të Dijkstra nga kulmi fillestar privat void dejkstra(int s) ( dist[s] = 0; //distanca më e shkurtër nga kulmi fillestar është 0 për (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(); ) //inicializimi i listës që ruan peshat e skajeve peshë = new ArrayList[n]; për (int i = 0; i< n; ++i) { weight[i] = new ArrayList(); ) //lexoni grafikun e dhënë nga lista e skajeve për (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(); } }

    Një tjetër opsion:

    Importo java.io.*; import java.util.*; klasa publike Dijkstra ( grafiku i fundit statik privat Graph.Edge GRAPH = ( i ri Graph.Edge("a", "b", 7), i ri Graph.Edge("a", "c", 9), i ri Graph.Edge( "a", "f", 14), i ri Graph.Edge("b", "c", 10), i ri Graph.Edge("b", "d", 15), i ri Graph.Edge("c ", "d", 11), i ri Graph.Edge("c", "f", 2), i ri Graph.Edge("d", "e", 6), i ri Graph.Edge("e", "f", 9); (START); g.printPath(END); //g.printAllPaths(); ) ) Grafiku i klasës (Harta përfundimtare private grafiku; ( buza publike (String v1, String v2, int dist) ( this.v1 = v1; this.v2 = v2; this.dist = dist; ) ) /** Një kulm i grafikut, i kompletuar me paraqitjet në kulmet fqinje */ Klasa statike publike Vertex implementon Comparable ( Emri publik i vargut përfundimtar; publik int dist = Integer.MAX_VALUE; // MAX_VALUE supozohet të jetë pafundësi publike Vertex e mëparshme = null; Harta përfundimtare publike fqinjët = HashMap i ri<>(); publik vertex(emri i vargut) ( this.name = emri; ) private void printPath() ( if (this == this.previous) ( System.out.printf ("%s", this.name); ) other if ( this.previous == null) ( System.out.printf ("%s(i paarritur)", this.name); ) other ( this.previous.printPath (); System.out.printf (" -> %s( %d)", this.name, this.dist); ) ) public int compareTo(Tjetër Vertex) ( return Integer.compare(dist, other.dist); ) ) /** Ndërton një grafik nga një grup skajesh * / grafik publik (skajet e skajeve) ( grafiku = HashMap i ri<>(skajet.gjatësia); //një kalim për të gjetur të gjitha kulmet për (Edge e: skajet) ( if (!graph.containsKey(e.v1)) graph.put(e.v1, kulmi i ri(e.v1)); nëse (!graph. përmbanKey(e.v2)) graph.put(e.v2, kulm i ri(e.v2)); ) //një tjetër kalim për të vendosur kulmet fqinje për (Buza e: skajet) ( graph.get(e.v1). fqinjët.put(graph.get(e.v2), e.dist); //graph.get(e.v2).fqinjët.put(graph.get(e.v1), e.dist); // gjithashtu bëje këtë për një graf të padrejtuar ) ) /** Ekzekuton dijkstra duke përdorur një kulm të burimit të specifikuar */ public void dijkstra(StartingName) ( if (!graph.containsKey(startName)) ( System.err.printf("Grafiku nuk përmban kulmin e fillimit \"%s\"\n", startName); kthimi; ) burimi përfundimtar i kulmit = graph.get(startName); NavigableSet q = grup i ri i pemëve<>(); // kulmet e konfigurimit për (Kulmi v: graph.values()) ( v.previous = v == burimi ? burimi: null; v.dist = v == burimi ? 0: Numri i plotë.MAX_VALUE; q.add( v);) dijkstra(q); ) /** Zbatimi i algoritmit të dijkstra duke përdorur një grumbull binar. */ private void dijkstra(final NavigableSet q) ( Kulmi u, v; ndërsa (!q.isEmpty()) (u = q.pollFirst(); // kulmi me distancën më të shkurtër (përsëritja e parë do të kthejë burimin) nëse (u.dist == Numri i plotë.MAX_VALUE) thyej; // ne mund të injorojmë u (dhe çdo kulm tjetër të mbetur) pasi ato janë të paarritshme // shikojmë distancat nga secili fqinj për (Harta.Hyrja a: u.neighbours.entrySet()) (v = a.getKey(); //fqinji në këtë përsëritje final int alternateDist = u.dist + a.getValue(); nëse (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(); } } }

    C

    #përfshi #përfshi #përfshi //#define BIG_EXAMPLE typedef struct node_t node_t, *heap_t; typedef struct skaj_t skaj_t; struct edge_t ( node_t *nd; /* target i këtij skaji */ edge_t *sibling;/* për listën e lidhur veçmas */ int len; /* kostoja e skajit */ ); struct node_t ( edge_t *edge; /* lista e lidhur e vetme e skajeve */ node_t *via; /* ku nyja e mëparshme është në shtegun më të shkurtër */ dist i dyfishtë; /* distanca nga nyja e origjinës */ emri i karakterit; /* the, er , emri */ int heap_idx; /* lidhja me pozicionin e grumbullit për përditësimin e distancës */ ); /* --- menaxhimi i skajeve --- */ #ifdef BIG_EXAMPLE # define BLOCK_SIZE (1024 * 32 - 1) #else # define BLOCK_SIZE 15 #endif edge_t *edge_root = 0, *e_next = 0; /* Mos u shqetësoni për gjërat e menaxhimit të memories, ato janë pa pikë. ) ( edge_root = malloc (madhësia e (buzë_t) * (BLOCK_SIZE + 1)); edge_root.sibling = e_next; e_next = Edge_root + BLOCK_SIZE; ) --e_next; e_next->nd = b; e_next->len = next; -> vëlla = a-> skaj; a-> skaj = e_tjetër; ) void free_edges() (për (; rrënjë_edhe; rrënjë_edge = e_tjetër) ( e_next = skaj_rrënja.vëllai; i lirë (rrënja_ege); ) ) /* --- gjëra të radhës prioritare --- */ heap_t *heap; int heap_len; void set_dist(node_t *nd, node_t *via, double d) ( int i, j; /* tashmë e dinte rrugën më mirë */ if (nd->via && d >= nd->dist) ktheje; /* gjeni hyrjen ekzistuese të grumbullit ose krijoni një të re */ nd->dist = d; nd->via = via; i = nd->heap_idx; nëse (!i) i = ++heap_len; /* upheap */ për (; i > 1 && nd->dist< heap->dist; i = j) (grumbull[i] = grumbull[j])->grumbull_idx = i; grumbull[i] = nd; nd->grumbull_idx = i; ) node_t * pop_queue() ( node_t *nd, *tmp; int i, j; nëse (!heap_len) kthen 0; /* hiq elementin kryesor, tërhiq elementin e bishtit atje dhe downheap */ nd = grumbull; tmp = grumbull; për (i = 1; i< heap_len && (j = i * 2) <= heap_len; i = j) { if (j < heap_len && heap[j]->dist > grumbull->dist) j++; nëse (grumbull[j]->dist >= tmp->dist) thyej; (grumbull[i] = grumbull[j])->grumbull_idx = i; ) grumbull[i] = tmp; tmp->grumbull_idx = i; kthimi nd; ) /* --- Dijkstra sende; nyjet e paarritshme nuk do të bëjnë kurrë rradha --- */ void calc_all(nyja_t *fillimi) ( nyja_t *lead; skaj_t *e; set_dist(start, start, 0); ndërsa ((lead = pop_queue())) për (e = lead->edge; e; e = e->vëllai) set_dist(e->nd, lead, lead->dist + e->len); ) void show_path(node_t *nd) ( if (nd->via == nd) printf( "%s", nd->emri); përndryshe nëse (!nd->nëpërmjet) printf("%s(i paarritur)", nd->emri); other ( show_path(nd->via); printf("- > %s(%g) ", nd->emri, nd->dist); ) ) int main(void) ( #ifndef BIG_EXAMPLE int i; # define N_NODES ("f" - "a" + 1) node_t * nyjet = calloc (madhësia e (nyja_t), N_NODES); për (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] = grup("fund" => $edge, "cost" => $edge); ) $vertices = array_unique ($vertices); foreach ($vertices si $vertex) ( $dist[$vertex] = INF; $previous[$vertex] = NULL; ) $dist[$burimi] = 0; $Q = $kulme; while (count($Q) > 0) ( // TODO - Gjeni një mënyrë më të shpejtë për të marrë minimumin $min = INF; foreach ($Q si $vertex)( nëse ($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";


    Python

    nga koleksionet import namedtuple, radhë nga pprint import pprint si pp inf = float("inf") Edge = namedtuple("Edge", "start, fund, cost") class Graph(): def __init__(vet, edges): vet .skajet = skajet2 = vetja.kuljet = grup(shuma(( për e në skajet2), )) def dijkstra(vetja, burimi, desti): pohoj burimin në vetvete.kuljet dist = (kulmi: inf për kulmin në vetë.kulmet ) mëparshme = (kulmi: Asnjë për kulmin në vetë.kuljet) dist = 0 q = self.vertices.copy() fqinjët = (kulmi: set() për kulmin në vetë.kuljet) për fillimin, fundin, koston në vetvete. skajet: fqinjët.add((fundi, kostoja)) #pp(fqinjët) ndërsa q: u = min(q, çelësi = kulmi lambda: dist) q.remove(u) nëse dist[u] == inf ose u = = dest: pushim për v, kosto në fqinjët[u]: alt = dist[u] + kosto nëse 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"]