• İki nokta arasındaki en kısa mesafe. Neden bir yaydan daha düz bir çizgide olduğunu biliyor musunuz? Kesişen iki çizgi arasındaki mesafeyi belirleme

    01.02.2022

    Tahtaya tebeşirle iki nokta çizen öğretmen, genç öğrenciye bir görev verir: her iki nokta arasındaki en kısa yolu çizmek.

    Öğrenci, düşündükten sonra, özenle aralarına bir dolambaçlı çizgi çeker.

    - En kısa yol bu! öğretmen şaşırır. - Bunu sana kim öğretti?

    - Babam. O bir taksi şoförü.

    Saf bir okul çocuğunun çizimi elbette anekdot niteliğindedir, ancak size şek. 1, Ümit Burnu'ndan Avustralya'nın güney ucuna giden en kısa yoldur!

    Daha da çarpıcı olan şu ifadedir: Şek. Japonya'dan Panama Kanalı'na 2 gidiş-dönüş, aynı haritada aralarında çizilen düz çizgiden daha kısa!

    Pirinç. 1. Bir deniz haritasında, Ümit Burnu'ndan Avustralya'nın güney ucuna kadar olan en kısa yol, düz bir çizgiyle ("loksodrome") değil, bir eğriyle ("ortodromi") gösterilir.


    Bütün bunlar bir şaka gibi görünüyor, ancak bu arada, haritacıların iyi bildiği tartışılmaz gerçekler önünüzde.




    Pirinç. 2. Deniz haritasında Yokohama'yı Panama Kanalı'na bağlayan kavisli yolun, aynı noktalar arasında çizilen düz bir çizgiden daha kısa olması inanılmaz görünüyor.


    Konuyu açıklığa kavuşturmak için genel olarak haritalar ve özel olarak deniz haritaları hakkında birkaç söz söylemek gerekecektir. Dünya yüzeyinin parçalarını kağıt üzerinde tasvir etmek, prensipte bile kolay bir iş değildir, çünkü Dünya bir küredir ve küresel yüzeyin hiçbir bölümünün bir düzlemde kıvrımlar ve kırılmalar olmadan konuşlandırılamayacağı bilinmektedir. İstemeden, haritalardaki kaçınılmaz bozulmalara katlanmak zorunda kalıyor. Harita çizmenin birçok yolu icat edilmiştir, ancak tüm haritalar eksikliklerden muaf değildir: bazılarının bir tür çarpıklığı vardır, diğerlerinin farklı bir türü, ancak çarpıklığı olmayan hiçbir harita yoktur.

    Denizciler, 16. yüzyılın eski bir Hollandalı haritacı ve matematikçisinin yöntemine göre çizilmiş haritaları kullanırlar. Merkator. Bu yönteme Mercator projeksiyonu denir. Bir deniz haritasını dikdörtgen ızgarasından tanımak kolaydır: meridyenler üzerinde bir dizi paralel düz çizgi olarak gösterilir; enlem daireleri - ayrıca birinciye dik düz çizgiler halinde (bkz. Şekil 5).

    Şimdi aynı paralel üzerinde bir okyanus limanından diğerine en kısa yolu bulmak istediğinizi hayal edin. Okyanusta tüm yollar mevcuttur ve nasıl olduğunu biliyorsanız, en kısa yoldan oraya gitmek her zaman mümkündür. Bizim durumumuzda, en kısa yolun her iki bağlantı noktasının da bulunduğu paralelden geçtiğini düşünmek doğaldır: sonuçta, haritada düz bir çizgidir ve düz bir yoldan daha kısa ne olabilir! Ancak yanılıyoruz: paraleldeki yol hiç de kısa değil.

    Gerçekten de: bir kürenin yüzeyinde, iki nokta arasındaki en kısa mesafe, onları birleştiren büyük dairenin yayıdır. Ama paralel çember küçük bir daire. Büyük bir dairenin yayı, aynı iki noktadan çizilen herhangi bir küçük dairenin yayından daha az eğridir: daha büyük bir yarıçap, daha küçük bir eğriliğe karşılık gelir. Küre üzerindeki ipliği iki noktamız arasında çekin (bkz. Şekil 3); paralel boyunca uzanmadığından emin olacaksınız. Gerilmiş bir iplik, en kısa yolun tartışılmaz bir göstergesidir ve bir dünya üzerinde bir paralel ile çakışmazsa, o zaman bir deniz haritasında en kısa yol düz bir çizgi ile gösterilmez: paralellik dairelerinin böyle tasvir edildiğini unutmayın. düz çizgilerle bir harita, düz bir çizgiyle örtüşmeyen herhangi bir çizgi, yemek eğri .



    Pirinç. 3. İki nokta arasındaki gerçekten en kısa yolu bulmanın basit bir yolu: Bu noktalar arasında küre üzerinde bir iplik çekmeniz gerekir.


    Söylenenlerden sonra, deniz haritasındaki en kısa yolun neden düz bir çizgi olarak değil de eğri bir çizgi olarak gösterildiği ortaya çıkıyor.

    Nikolaev (şimdi Oktyabrskaya) demiryolunun yönünü seçerken, hangi yolun döşeneceği konusunda sonsuz anlaşmazlıklar olduğunu söylüyorlar. Anlaşmazlıklar, sorunu kelimenin tam anlamıyla “doğrudan” çözen Çar I. Nicholas'ın müdahalesiyle sona erdi: St. Petersburg'u Moskova'ya hat boyunca bağladı. Bu bir Mercator haritasında yapılmış olsaydı, utanç verici bir sürpriz olurdu: düz bir çizgi yerine yol bir viraja dönüşecekti.

    Hesaplardan kaçınmayan herkes, basit bir hesapla, haritada bize eğri gibi görünen yolun aslında düz düşünmeye hazır olduğumuzdan daha kısa olduğuna ikna olabilir. İki limanımız 60. paralelde olsun ve aralarında 60° mesafe olsun. (Bu tür iki limanın gerçekten var olup olmadığı, elbette, hesaplama için önemsizdir.)



    Pirinç. 4. Paralel yayı boyunca ve büyük dairenin yayı boyunca top üzerindeki A ve B noktaları arasındaki mesafelerin hesaplanmasına


    Şek. 4 puan HAKKINDA - dünyanın merkezi, AB - limanların üzerinde bulunduğu enlem çemberinin yayı A ve B; içinde onun 60°'si. Enlem çemberinin merkezi bir noktada İTİBAREN Bunu merkezden hayal et HAKKINDA Dünyanın büyük bir çemberi aynı limanlardan çizilir: yarıçapı OB = OA = R;çizilen yaya yakın geçecek AB, ama uymuyor.

    Her yayın uzunluğunu hesaplayalım. Noktalardan beri FAKAT Ve İÇİNDE 60° enlemde, sonra yarıçap AE Ve OG ile makyaj işletim sistemi(dünyanın ekseni) 30°'lik bir açı. bir dik üçgende ASO bacak AC (=r), 30°'lik bir açının karşısında yatmak hipotenüsün yarısına eşittir JSC;

    anlamına geliyor, r=R/2 Yay uzunluğu AB enlem dairesinin uzunluğunun altıda biridir ve bu daire büyük dairenin uzunluğunun yarısına sahip olduğundan (yarıçapın yarısına karşılık gelir), o zaman küçük dairenin yayının uzunluğu



    Şimdi aynı noktalar arasında çizilen büyük bir dairenin yayının uzunluğunu (yani aralarındaki en kısa yolu) belirlemek için açının büyüklüğünü bilmemiz gerekir. AOW. akor OLARAK, yayı 60 °'ye (küçük daire) çıkararak, aynı küçük daireye yazılan normal bir altıgenin kenarıdır; bu yüzden AB \u003d r \u003d R / 2

    Düz bir çizgi çizmek od, bağlantı merkezi HAKKINDA ortası olan dünya D akorlar AB, bir dik üçgen al ODA, açı nerede D- dümdüz:

    DA= 1/2 AB ve OA=R.

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

    Buradan şunu buluyoruz (tablolara göre):

    =14°28",5

    ve dolayısıyla

    = 28°57".

    Artık en kısa yolun istenen uzunluğunu kilometre cinsinden bulmak zor değil. Dünyanın büyük bir dairesinin bir dakikasının uzunluğunun

    Deniz haritasında düz bir çizgi ile gösterilen enlem dairesi boyunca yolun 3333 km olduğunu ve büyük daire boyunca yolun - haritadaki eğri boyunca - 3213 km, yani 120 km daha kısa olduğunu öğreniyoruz.

    Elinizde bir iplik ve bir küre ile donanmış olarak, çizimlerimizin doğruluğunu kolayca kontrol edebilir ve büyük dairelerin yaylarının çizimlerde gösterildiği gibi gerçekten uzandığından emin olabilirsiniz. Şek. 1 sanki Afrika'dan Avustralya'ya "düz" deniz yolu 6020 mil ve "eğri" - 5450 mil, yani. 570 mil veya 1050 km daha kısa. Londra'dan Şanghay'a deniz haritasındaki "doğrudan" hava yolu, Hazar Denizi'ni keserken, gerçekten en kısa rota St. Petersburg'un kuzeyindedir. Bu konuların zamandan ve yakıttan tasarruf etmede nasıl bir rol oynadığı açıktır.

    Denizcilik çağında, nakliye zamanına her zaman değer verilmediyse - o zaman "zaman" henüz "para" olarak kabul edilmediyse, o zaman buharlı gemilerin ortaya çıkmasıyla birlikte, tüketilen her fazladan ton kömür için ödeme yapılması gerekir. Bu nedenle, günümüzde gemiler, genellikle Mercator'da değil, "merkezi" olarak adlandırılan haritalarda yapılan haritaları kullanarak gerçekten en kısa yol boyunca seyrediyorlar: bu haritalarda, büyük dairelerin yayları düz çizgiler olarak tasvir ediliyor.

    O halde neden eski denizciler böyle aldatıcı haritalar kullanıp elverişsiz yolları seçtiler? Eski günlerde deniz haritalarının şimdi belirtilen özelliğini bilmediklerini düşünmek bir hatadır. Mesele elbette bununla değil, Mercator yöntemine göre çizilen haritaların sakıncalarının yanı sıra denizciler için çok değerli faydaları olmasıyla açıklanmaktadır. Böyle bir harita, ilk olarak, konturun köşelerini koruyarak, dünya yüzeyinin ayrı küçük kısımlarını bozulma olmadan gösterir. Bu, ekvatordan uzaklaştıkça tüm konturların belirgin şekilde gerilmesi gerçeğiyle çelişmez. Yüksek enlemlerde, streç o kadar önemlidir ki, bir deniz haritası, özelliklerine aşina olmayan bir kişiye, kıtaların gerçek boyutu hakkında tamamen yanlış bir fikirle ilham verir: Grönland, Afrika, Alaska ile aynı boyutta gibi görünüyor. Avustralya'dan daha büyüktür, ancak Grönland Afrika'dan 15 kat daha küçüktür ve Alaska, Grönland ile birlikte Avustralya'nın yarısı kadardır. Ancak haritanın bu özelliklerini iyi bilen bir denizci, onlar tarafından yanıltılamaz. Özellikle küçük alanlarda bir deniz haritası doğanın tam bir benzerliğini verdiği için onlara katlanıyor (Şek. 5).

    Öte yandan, deniz haritası, seyir pratiği görevlerinin çözümünü büyük ölçüde kolaylaştırır. Bu, sabit bir rotadaki bir geminin yolunun düz bir çizgi olarak gösterildiği tek harita türüdür. "Sürekli bir rota" izlemek, her zaman bir yönü, belirli bir "kerteyi" tutmak, diğer bir deyişle, tüm meridyenleri eşit bir açıyla geçecek şekilde gitmek anlamına gelir. Ancak bu yol ("loxodrome") yalnızca tüm meridyenlerin birbirine paralel düz çizgiler olduğu bir harita üzerinde düz bir çizgi olarak gösterilebilir. Ve dünya üzerinde enlem çemberleri meridyenlerle dik açılarda kesiştiği için, böyle bir haritada enlem çemberleri meridyenlerin çizgilerine dik olan düz çizgiler olmalıdır. Kısacası, tam olarak deniz haritasının karakteristik bir özelliğini oluşturan koordinat ızgarasına ulaşıyoruz.




    Pirinç. 5. Dünyanın deniz veya Mercator haritası. Bu tür haritalarda, ekvatordan uzaktaki konturların boyutları büyük ölçüde abartılmıştır. Örneğin hangisi daha büyük: Grönland mı yoksa Avustralya mı? (metinde cevap)


    Denizcilerin Mercator haritalarına olan tercihi artık anlaşılabilir. Belirlenen limana giderken izlenecek rotayı belirlemek isteyen gezgin, yolun uç noktalarına bir cetvel uygular ve meridyenler ile yaptığı açıyı ölçer. Bu doğrultuda her zaman açık denizde bulunan navigatör, gemiyi doğru bir şekilde hedefe ulaştıracaktır. Görüyorsunuz ki, "loxodrome" en kısa ve en ekonomik olmasa da, bir bakıma bir denizci için çok uygun bir yol. Örneğin, Ümit Burnu'ndan Avustralya'nın güney ucuna ulaşmak için (bkz. Şekil 1), her zaman aynı rotayı S 87 °, 50 " tutmak gerekir. Bu arada, gemiyi aynı noktaya getirmek için en kısa yoldaki son nokta ("" boyunca), şekilde görüldüğü gibi, geminin rotasını sürekli olarak değiştirmek gerekir: S 42 °, 50 "yoldan başlayın ve N rotasıyla bitirin 53 °. 50" (bu durumda, en kısa yol bile mümkün değildir - Antarktika'nın buz duvarına dayanır).

    Her iki yol da - "loksodrom" boyunca ve "ortodromi" boyunca - yalnızca büyük daire boyunca yol deniz haritasında düz bir çizgi olarak gösterildiğinde: ekvator boyunca veya meridyen boyunca hareket ederken. Diğer tüm durumlarda, bu yollar farklıdır.

    (Tanımlayıcı geometri)
  • CD (CXDX, C2D2) nokta olarak görüntüleniyor C5 = D5 A5B5 eşittir...
    (Tanımlayıcı geometri)
  • İki paralel düzlem arasındaki mesafeyi belirleme
    Genel konumda iki paralel düzlem arasındaki mesafenin belirlenmesi 01| x Bunu, aynı iki düzlem arasındaki, çıkıntı yapanların konumuna dönüştürülmüş mesafeyi belirleme sorununa indirgemek uygundur. Bu durumda, düzlemler arasındaki mesafe, çizgiler arasındaki dik olarak tanımlanır, ...
    (Tanımlayıcı geometri)
  • Kesişen iki çizgi arasındaki mesafeyi belirleme
    Kesişen iki doğru arasındaki en kısa mesafeyi belirlemek istiyorsanız, izdüşüm düzlemlerinin sistemlerini iki kez değiştirmeniz gerekir. Bu sorunu çözerken doğrudan CD (CXDX, C2D2) nokta olarak görüntüleniyor C5 = D5(Şek. 198). Bu noktadan projeksiyona olan uzaklık A5B5 eşittir...
    (Tanımlayıcı geometri)
  • Kesişen iki doğru arasındaki açı
    Bu, verilere paralel olan kesişen iki doğru arasındaki açıdır. Bu nedenle, bu görev bir öncekine benzer. Bunu çözmek için, rastgele bir nokta almanız ve verilen eğri çizgilere paralel iki çizgi çizmeniz ve gerekli açıyı belirlemek için izdüşüm dönüşümünü kullanmanız gerekir....
    (Tanımlayıcı geometrinin temelleri. Kısa bir kurs ve bir dizi problem.)
  • İki paralel çizgi arasındaki mesafeyi belirleme
    Sorun, projeksiyon düzlemlerinin çift değiştirme yöntemiyle çözülür. Son aşamada, projeksiyon düzlemlerinden biri kesişen çizgilerden birine dik olmalıdır. Daha sonra aralarındaki en kısa mesafe, diğer eğri çizgiye dik olan segmentin değeri ile belirlenir (Şek. 199)....
    (Tanımlayıcı geometri)
  • Resimde noktalı çizgi boyunca uzanan yol, düz çizgi boyunca uzanan yoldan daha kısadır. Ve şimdi deniz yolları örneğinde biraz daha ayrıntılı:

    Sabit bir rotada seyrederseniz, geminin dünya yüzeyindeki yörüngesi matematikte denilen bir eğri olacaktır. logaritmiksarmal.

    Navigasyonda bu karmaşık çift eğrilik çizgisine loxodromi, yunanca "eğik koşu" anlamına gelir.

    Ancak, dünya üzerindeki iki nokta arasındaki en kısa mesafe, büyük bir dairenin yayı boyunca ölçülür.

    Büyük bir dairenin yayı, dünyanın merkezinden geçen bir düzlem ile dünya yüzeyinin kesişmesinden, top olarak alınan bir iz olarak elde edilir.

    Navigasyonda, büyük daire yayı denir Harika daire, bu da "düz koşu" anlamına gelir. Büyük dairenin ikinci özelliği, meridyenleri farklı açılardan geçmesidir (Şek. 29).

    Loxodrom ve orthodrome boyunca dünya yüzeyindeki iki nokta arasındaki mesafe farkı, yalnızca büyük okyanus geçişleri için pratik öneme sahiptir.

    Normal şartlar altında bu fark ihmal edilir ve navigasyon sabit bir rotada gerçekleştirilir, yani. loksodrom tarafından.

    Denklemi türetmek için loxodromileri alıyoruz (Şekil 30, fakat) iki nokta FAKAT Ve İÇİNDE, aralarındaki mesafe sadece küçüktür. Meridyenler ve içlerinden bir paralel çizerek, temel bir dik açılı küresel üçgen elde ederiz. ABC. Bu üçgende meridyen ile paralelin kesişmesiyle oluşan açı diktir ve açı PnAB geminin seyrine eşit K. Katet AC bir meridyen yayı segmentini temsil eder ve ifade edilebilir

    nerede r - küre olarak alınan Dünya'nın yarıçapı;

    Δφ - enlemdeki temel artış (enlemlerin farkı).

    bacak GB paralel bir yay parçasını temsil eder

    nerede - paralelin yarıçapı;

    Δλ - boylamların temel farkı.

    OO 1 C üçgeninden bulunabilir ki

    Sonra son formda bacak GBşu şekilde ifade edilebilir:

    Temel bir küresel üçgen varsayarsak ABC daire için yaz

    azaltmadan sonra r ve temel küçük koordinat artışlarını sonsuz küçük olanlarla değiştirerek,

    Elde edilen ifadeyi φ 1, λ 1 ila φ 2 aralığında entegre ederiz, λ 2 tgK değerini sabit bir değer olarak düşünürsek:

    Sağ tarafta bir tablo integralimiz var. Değerini değiştirdikten sonra top üzerinde loxodrom denklemini elde ederiz.

    Bu denklemin analizi, aşağıdaki sonuçları çıkarmamızı sağlar:

    0 ve 180 ° 'lik kurslarda, loxodrom büyük bir dairenin yayına dönüşür - bir meridyen;

    90 ve 270 ° kurslarında, loxodrom paralel ile çakışır;

    Loksodrome her paralelden yalnızca bir kez geçer ve her meridyen sayısız kez geçer. onlar. direğe spiral olarak yaklaşırken, ona ulaşmaz.

    Sabit bir rotada, yani loxodrom boyunca navigasyon, Dünya üzerindeki iki nokta arasındaki en kısa mesafe olmasa da, navigatör için büyük kolaylık sağlar.

    Bir deniz seyrüsefer haritası için gereksinimler, loxodrom boyunca navigasyonun avantajına ve denkleminin analizinin sonuçlarına göre aşağıdaki gibi formüle edilebilir.

    1. Meridyenleri sabit bir açıyla geçen Loxodrome düz bir çizgi olarak gösterilmelidir.

    2. Haritaların yapımında kullanılan kartografik izdüşüm, üzerindeki rotalar, kerterizler ve açılar yerdeki değerlerine karşılık gelecek şekilde uyumlu olmalıdır.

    3. Meridyenler ve paraleller, 0, 90, 180° ve 270° rota çizgileri gibi, karşılıklı olarak dik düz çizgiler olmalıdır.

    Küre olarak alındığında, Dünya yüzeyinde verilen iki nokta arasındaki en kısa mesafe, bu noktalardan geçen büyük bir dairenin yaylarından daha küçüktür. Bir meridyeni veya ekvatoru takip eden bir gemi durumu dışında, büyük daire meridyenleri farklı açılarda keser. Bu nedenle, böyle bir eğri izleyen bir gemi her zaman rotasını değiştirmelidir. Meridyenler ile sabit bir açı yapan ve haritada Mercator projeksiyonunda düz bir çizgi - loksodrom ile gösterilen bir rotayı takip etmek pratik olarak daha uygundur. Bununla birlikte, büyük mesafelerde, ortodromun ve loxodromun uzunluğundaki fark önemli bir değere ulaşır. Bu nedenle, bu gibi durumlarda, ortodrome hesaplanır ve üzerinde loksodrom boyunca yüzdükleri ara noktalar işaretlenir.

    Yukarıdaki gereksinimleri karşılayan bir kartografik projeksiyon, 1569'da Hollandalı haritacı Gerard Cramer (Mercator) tarafından önerildi. Yaratıcısının onuruna, projeksiyona isim verildi. Merkator.

    Ve kim daha ilginç bilgiler öğrenmek ister ki daha fazlasını öğrenin Orijinal makale web sitesinde InfoGlaz.rf Bu kopyanın yapıldığı makalenin bağlantısı -

    MESAFE, mesafeler, bkz. 1. İki noktayı ayıran boşluk, bir şey arasındaki boşluk. Düz bir çizgide iki nokta arasındaki en kısa mesafe. Bizden iki kilometre uzaklıkta yaşıyor. “Komutan onları en yakın mesafeden içeri aldı ... Ushakov'un Açıklayıcı Sözlüğü

    mesafe- isim, s., kullanım. genellikle Morfoloji: (hayır) ne? ne için mesafe? mesafe, (bkz.) ne? daha uzak? mesafe, ne? mesafe hakkında; lütfen. ne? mesafe, (hayır) ne? mesafeler, neden? mesafeler, (bkz.) ne? daha uzak? mesafeler... Dmitriev Sözlüğü

    mesafe- İ; bkz. İki noktayı, iki nesneyi vb. ayıran boşluk, biri arasındaki boşluk, l'den daha fazla. en kısa nehir iki nokta arasında. R. evden okula. Yakındaki bir nehre çekilin. Bir metre uzaklıkta, kollar uzanmış. Bir şey bil, bir şey hisset. üzerinde… … ansiklopedik sözlük

    mesafe- İ; bkz. Ayrıca bakınız mesafe a) İki noktayı, iki nesneyi vb. ayıran boşluk, l'den biri arasındaki boşluk. İki nokta arasındaki en kısa mesafe. Evden okula uzaklık. Yakın bir mesafeye çekilin / nie ... Birçok ifadenin sözlüğü

    GEOMETRİ- çeşitli şekillerin (noktalar, çizgiler, açılar, iki boyutlu ve üç boyutlu nesneler), boyutlarını ve göreceli konumlarını inceleyen bir matematik dalı. Öğretme kolaylığı için geometri, planimetri ve katı geometriye bölünmüştür. İÇİNDE… … Collier Ansiklopedisi

    Navigasyon*

    Navigasyon- bir pusula ve bir kütük kullanarak bir geminin denizdeki yerini belirleme yollarının bir sunumunu sonuçlandıran navigasyon departmanı (bkz.). Geminin denizdeki yerini belirlemek, geminin halihazırda bulunduğu noktayı haritaya koymak anlamına gelir. ... ... Ansiklopedik Sözlük F.A. Brockhaus ve I.A. efron

    COGEN- (Cohen) Hermann (1842 1918) Alman filozof, Marburg neo-Kantçılık okulunun kurucusu ve en önemli temsilcisi. Başlıca eserler: 'Kant'ın Deneyim Teorisi' (1885), 'Kant'ın Etiği Gerekçelendirmesi' (1877), 'Kant'ın Estetiği Gerekçelendirmesi' (1889), 'Mantık... ...

    Kant Imanuel- Kant'ın hayatı ve yazıları Immanuel Kant, 1724'te Doğu Prusya'da Königsberg'de (şimdi Kaliningrad) doğdu. Babası bir saraçtı ve annesi bir ev hanımıydı, çocuklarından altısı yetişkinliğe kadar yaşamadı. Kant anne ve babasını her zaman ...... Kökenlerinden günümüze Batı felsefesi

    KANT'IN ELEŞTİREL FELSEFESİ: YETENEKLER ÖĞRETİSİ- (La philosophie critique de Kant: Doctrines des facultes, 1963) Deleuze tarafından. Giriş bölümünde aşkın yöntemi açıklayan Deleuze, Kant'ın felsefeyi tüm bilgilerin temel hedeflerle ilişkisinin bilimi olarak anladığını belirtir... ... Felsefe Tarihi: Ansiklopedi

    çiftlik prensibi- geometrik optiğin temel prensibi (Bkz. Geometrik optik). F. p.'nin en basit biçimi, bir ışık huzmesinin uzayda her zaman yol boyunca iki nokta arasında yayıldığı ve geçiş süresinin ... Büyük Sovyet Ansiklopedisi

    Dijkstra'nın algoritması, 1959'da Hollandalı bilim adamı Edsger Dijkstra tarafından icat edilen bir grafik algoritmasıdır. Grafiğin köşelerinden birinden diğerlerine kadar olan en kısa yolları bulur. Algoritma çalışmaları sadece negatif ağırlıklı kenarları olmayan grafikler için.

    Şekilde gösterilen grafik örneğinde algoritmanın yürütülmesini düşünün.

    1. köşeden diğerlerine olan en kısa mesafeleri bulmak istensin.

    Daireler köşeleri, çizgiler ise aralarındaki yolları (grafiğin kenarları) gösterir. Köşelerin sayıları dairelerde, "fiyatları" - yolun uzunluğu - kenarların üzerinde belirtilmiştir. Her köşenin yanında kırmızı bir etiket işaretlenir - bu köşeye köşe 1'den en kısa yolun uzunluğu.

    İlk adım. Örneğimiz için Dijkstra'nın algoritmasındaki bir adımı düşünün. Vertex 1 minimum etikete sahiptir. Vertices 2, 3 ve 6 onun komşularıdır.

    Köşe 1'in ilk komşusu sırasıyla köşe 2'dir, çünkü ona giden yolun uzunluğu minimumdur. Köşe 1'den ona giden yolun uzunluğu, köşe 1'in etiketinin değeri ile 1'den 2'ye giden kenarın uzunluğunun toplamına eşittir, yani 0 + 7 = 7. 2 nolu tepe noktasının mevcut etiketi, sonsuz, yani 2. tepenin yeni etiketi 7'dir.

    1. köşenin diğer iki komşusu - 3. ve 6. ile benzer bir işlem yapıyoruz.

    Düğüm 1'in tüm komşuları kontrol edilir. Zirve 1'e mevcut minimum mesafe nihai olarak kabul edilir ve revizyona tabi değildir (bunun gerçekten böyle olduğu gerçeği ilk kez E. Dijkstra tarafından kanıtlanmıştır). Bu köşenin ziyaret edildiğini işaretlemek için grafiğin üzerini çizin.

    İkinci adım. Algoritma adımı tekrarlanır. Yine, ziyaret edilmeyen köşelerin “en yakınını” buluyoruz. Bu, 7 etiketli köşe 2'dir.

    Yine seçilen köşenin komşularının etiketlerini küçültmeye, 2. köşeden geçmeye çalışıyoruz. Köşe 2'nin komşuları 1, 3 ve 4 köşeleridir.

    Köşe 2'nin ilk (sıralı) komşusu köşe 1'dir. Ama zaten ziyaret edildi, bu yüzden 1. köşe ile hiçbir şey yapmıyoruz.

    Köşe 2'nin bir sonraki komşusu, ziyaret edilmemiş olarak işaretlenen köşelerin minimum etiketine sahip olduğundan, köşe 3'tür. 2 üzerinden giderseniz, böyle bir yolun uzunluğu 17'ye (7 + 10 = 17) eşit olacaktır. Ancak üçüncü tepe noktasının mevcut etiketi 9'dur ve bu 17'den küçüktür, dolayısıyla etiket değişmez.

    2. köşenin diğer komşusu 4. köşedir. 2. köşeden ona giderseniz, böyle bir yolun uzunluğu 2. köşeye olan en kısa mesafenin toplamına ve 2. köşeye olan en kısa mesafenin toplamına ve 2. köşe ile 4. köşe arasındaki mesafeye eşit olacaktır. , 22 (7 + 15 = 22) . 22'den beri<, устанавливаем метку вершины 4 равной 22.

    Köşe 2'nin tüm komşuları görüntülendi, ona olan mesafeyi dondurup ziyaret edildi olarak işaretliyoruz.

    Üçüncü adım. Vertex 3'ü seçerek algoritmanın adımını tekrarlıyoruz. “İşlenmesinden” sonra aşağıdaki sonuçları alıyoruz:

    Sonraki adımlar. Kalan köşeler için algoritmanın adımını tekrarlıyoruz. Bunlar sırasıyla 6, 4 ve 5 köşeleri olacaktır.

    Algoritma yürütmesinin tamamlanması. Algoritma, daha fazla köşe işlenemediğinde sona erer. Bu örnekte, tüm köşelerin üzeri çizilmiştir, ancak bunun herhangi bir örnekte böyle olacağını varsaymak bir hatadır - ulaşılamıyorsa, yani grafiğin bağlantısı kesilirse bazı köşelerin üzeri çizilmemiş kalabilir. Algoritmanın sonucu son şekilde görülebilir: 1'den 2'ye en kısa yol 7, 3'e 9, 4'e 20, 5'e 20, 6'ya 11'dir.

    Algoritmanın çeşitli programlama dillerinde uygulanması:

    C++

    #include "stdafx.h" #include ad alanı std kullanarak; const int V=6; // Dijkstra'nın algoritması void Dijkstra(int GR[V][V], int st) ( int mesafe[V], sayım, indeks, i, u, m=st+1; bool ziyaret edildi[V]; for (i= 0 ben "< "<> "; cin>>start; Dijkstra(GR, start-1); system("pause>>void"); )

    paskal

    DijkstraAlgorithm programı; usecrt; constV=6; enf=100000; type vector=tamsayı dizisi; var start: tamsayı; const GR: tamsayı dizisi=((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'nın algoritması) prosedürü Dijkstra(GR: tamsayı dizisi; st: tamsayı); var count, index, i, u, m, min: tamsayı; uzaklık vektörü; ziyaret edilen: boole dizisi; başlangıç:=st; i:=1 ila V için başlangıç ​​mesafesi[i]:=inf; ziyaret edildi[i]:=false; son; mesafe:=0; saymak için:=1'den V-1'e kadar min:=inf; i:=1 ila V için if (ziyaret edilmedi[i]) ve (mesafe[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) ve (mesafe[u]<>inf) ve (mesafe[u]+GR inf o zaman writeln(m," > ", i," = ", mesafe[i]) else writeln(m," > ", i," = ", "rota mevcut değil"); son; (ana program bloğu) clrscr'yi başlatın; write("Başlangıç ​​düğümü >> "); oku(başlat); Dijkstra(GR, başlangıç); son.

    Java

    java.io.BufferedReader'ı içe aktarın; java.io.IOException'ı içe aktarın; java.io.InputStreamReader'ı içe aktarın; java.io.PrintWriter'ı içe aktarın; java.util.ArrayList'i içe aktar; java.util.Arrays'i içe aktarın; java.util.StringTokenizer'ı içe aktarın; genel sınıf Çözüm ( private static int INF = Integer.MAX_VALUE / 2; private int n; //digraftaki köşe sayısı özel int m; //digraftaki yay sayısı özel ArrayList adj; // komşuluk listesi özel ArrayList ağırlık; // kullanılan digraph özel boole'de kenarın ağırlığı; //geçen ve geçmeyen tepe noktaları hakkında bilgi depolamak için dizi private int dist; //başlangıç ​​noktasından olan uzaklığı depolamak için dizi //başlangıç ​​noktasından en kısa yolu geri yüklemek için gereken bir üst öğe dizisi private int pred; int başlangıç; //diğerlerine olan uzaklığın arandığı başlangıç ​​noktası özel BufferedReader cin; özel PrintWriter cout; özel StringTokenizer belirteci; //Dijkstra'nın algoritmasını başlangıç ​​noktasından başlatma prosedürü private void dejkstra(int s) ( dist[s] = 0; //başlangıç ​​noktasına en kısa mesafe 0'dır for (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(); ) //kenarların ağırlıklarını saklayan listenin başlatılması ağırlık = new ArrayList[n]; for (int i = 0; ben< n; ++i) { weight[i] = new ArrayList(); ) //(int i = 0; i) için kenar listesi tarafından verilen grafiği okuyun< 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(); } }

    Başka seçenek:

    java.io.* dosyasını içe aktarın; java.util.* dosyasını içe aktarın; public class Dijkstra ( private static final Graph.Edge GRAPH = ( new 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), new Graph.Edge("c", "f", 2), new Graph.Edge("d", "e", 6), new Graph.Edge("e", "f", 9), ); private static final START = "a"; private static final Dize END = "e"; public static void main(String args) ( Graph g = new Graph(GRAPH); g.dijkstra (BAŞLAT); g.printPath(END); //g.printAllPaths(); ) ) sınıf Grafiği ( özel nihai Harita grafik; // Köşe adlarının bir dizi Edge'den oluşturulmuş Vertex nesnelerine eşlenmesi /** Grafiğin bir kenarı (yalnızca Graph yapıcısı tarafından kullanılır) */ public static class Edge ( public final String v1, v2; public final int dist; public Edge(String v1, String v2, int dist) ( this.v1 = v1; this.v2 = v2; this.dist = dist; ) ) /** Grafiğin bir tepe noktası, komşu tepe noktalarına eşlemelerle tamamlandı */ genel statik sınıf Vertex, Karşılaştırılabilir'i uygular ( public final Dize adı; public int dist = Integer.MAX_VALUE; // MAX_VALUE'nin sonsuz olduğu varsayılır public Vertex önceki = null; public final Map komşular = yeni HashMap<>(); public Vertex(String name) ( this.name = name; ) private void printPath() ( if (bu == this.previous) ( System.out.printf("%s", this.name); ) else if ( this.previous == null) ( System.out.printf("%s(reached)", this.name); ) else ( this.previous.printPath(); System.out.printf(" -> %s( %d)", this.name, this.dist); ) ) public int CompareTo(Vertex other) ( return Integer.compare(dist, other.dist); ) ) /** Bir dizi kenardan bir grafik oluşturur * / public Graph(Kenar kenarları) ( grafik = yeni HashMap<>(kenarlar.uzunluk); //(Edge e: edge) için tüm köşeleri bulmak için bir geçiş ( if (!graph.containsKey(e.v1)) graph.put(e.v1, new Vertex(e.v1)); if (!graph. içerirKey(e.v2)) graph.put(e.v2, new Vertex(e.v2)); ) //(Edge e: edge) için komşu köşeleri ayarlamak için başka bir geçiş (graph.get(e.v1). komşular.put(graph.get(e.v2), e.dist); //graph.get(e.v2).neighbours.put(graph.get(e.v1), e.dist); // ayrıca bunu yönlendirilmemiş bir grafik için yapın ) ) /** Belirli bir kaynak köşe kullanarak dijkstra'yı çalıştırır */ public void dijkstra(String startName) ( if (!graph.containsKey(startName)) ( System.err.printf("Graph çalışmıyor başlangıç ​​tepe noktası \"%s\"\n", başlangıçAdı içerir); dönüş; ) nihai Vertex kaynağı = graph.get(startName); NavigableSet q = yeni Ağaç Kümesi<>(); // için tepe noktaları kurulumu (Vertex v: graph.values()) ( v.önceki = v == kaynak ? kaynak: boş; v.dist = v == kaynak ? 0: Tamsayı.MAX_VALUE; q.add( v); ) dijkstra(q); ) /** ikili bir yığın kullanarak dijkstra"nın algoritmasının uygulanması. */ private void dijkstra(final NavigableSet q) ( Köşe u, v; while (!q.isEmpty()) ( u = q.pollFirst(); // en kısa mesafeli köşe (ilk iterasyon kaynağı döndürür) if (u.dist == Integer.MAX_VALUE) break; // Ulaşılamaz oldukları için u'yu (ve kalan diğer köşeleri) görmezden gelebiliriz //(Map.Entry) için her komşuya olan mesafelere bak a: u.neighbours.entrySet()) ( v = a.getKey(); //bu yinelemedeki komşu final int alternatifDist = 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(); } } }

    C

    #Dahil etmek #Dahil etmek #Dahil etmek //#define BÜYÜK_ÖRNEK typedef struct node_t node_t, *heap_t; typedef struct edge_t edge_t; struct edge_t ( node_t *nd; /* bu kenarın hedefi */ edge_t *sibling;/* tekil bağlantılı liste için */ int len; /* kenar maliyeti */ ); struct node_t ( edge_t *edge; /* tek bağlantılı kenar listesi */ node_t *yoluyla; /* önceki düğümün en kısa yolda olduğu yer */ double dist; /* kaynak düğümden uzaklık */ char adı; /* the, er , ad */ int heap_idx; /* mesafeyi güncellemek için yığın konumuna bağlantı */ ); /* --- kenar yönetimi --- */ #ifdef BIG_EXAMPLE # tanımla BLOCK_SIZE (1024 * 32 - 1) #else # tanımla BLOCK_SIZE 15 #endif edge_t *edge_root = 0, *e_next = 0; /* Bellek yönetimi konularına aldırmayın, meselenin dışındalar.Pretend 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; e_next ->sibling = a->edge; a->edge = e_next; ) void free_edges() ( for (; edge_root; edge_root = e_next) ( e_next = edge_root.sibling; free(edge_root); ) ) /* --- öncelikli kuyruk öğeleri --- */ heap_t *heap; int heap_len; void set_dist(node_t *nd, node_t *via, double d) ( int i, j; /* yolu zaten daha iyi biliyordu */ if (nd->via &&) d >= nd->dist) return; /* mevcut yığın girişini bul veya yeni bir tane oluştur */ nd->dist = d; nd->via = via; i = nd->heap_idx; if (!i) i = ++heap_len; /* upheap */ for (; i > 1 && nd->dist< heap->uzak; i = j) (yığın[i] = yığın[j])->yığın_idx = i; yığın[i] = nd; nd->heap_idx = ben; ) node_t * pop_queue() ( node_t *nd, *tmp; int i, j; if (!heap_len) 0 döndürürse; /* önde gelen öğeyi kaldırın, kuyruk öğesini oraya çekin ve aşağı yığın */ nd = yığın; tmp = yığın; için (i = 1; ben< heap_len && (j = i * 2) <= heap_len; i = j) { if (j < heap_len && heap[j]->dist > yığın->dist) j++; if (yığın[j]->dist >= tmp->dist) break; (yığın[i] = yığın[j])->heap_idx = i; ) yığın[i] = tmp; tmp->heap_idx = ben; dönüş nd; ) /* --- Dijkstra öğeleri; erişilemeyen düğümler asla kuyruğa girmez --- */ 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->sibling) set_dist(e->nd, lead, lead->dist + e->len); ) void show_path(node_t *nd) ( if (nd-> aracılığıyla == nd) printf("%s", nd->name); else if (!nd->via) printf("%s(reached)", nd->name); else ( show_path(nd-> yoluyla); printf("-> %s(%g) ", nd->name, nd->dist); ) ) int ana(void) ( #ifndef BIG_EXAMPLE int i; # N_NODES ("f" - " tanımla a" + 1) node_t *nodes = calloc(sizeof(node_t), N_NODES); for (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

    $kenar, "maliyet" => $kenar); $komşular[$kenar] = dizi("son" => $kenar, "maliyet" => $kenar); ) $köşeler = dizi_benzersiz($köşeler); foreach ($köşeler $köşe olarak) ( $dist[$köşe] = INF; $önceki[$köşe] = NULL; ) $dist[$kaynak] = 0; $Q = $köşeler; while (count($Q) > 0) ( // TODO - Minimum $dk = INF elde etmenin daha hızlı yolunu bulun; foreach ($Q as $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";


    piton

    koleksiyonlardan nametuple'ı içe aktar, pprint'ten sıraya aktar pprint'i pp olarak içe aktar inf = float("inf") Edge = nametuple("Edge", "start, end, cost") class Graph(): def __init__(self, edge): self .edges = kenarlar2 = self.köşeler = set(sum(( kenar2'deki e için), )) def dijkstra(self, source, hedef): self.vertices'de onay kaynağı dist = (köşe: self.vertices'deki tepe noktası için inf ) önceki = (köşe: self.vertices'deki tepe noktası için yok) dist = 0 q = self.vertices.copy() komşular = (köşe: self.vertices'deki tepe noktası için set()) başlangıç, bitiş, kendi başına maliyet için. kenarlar: komşular.add((son, maliyet)) #pp(komşular) while q: u = min(q, anahtar=lambda köşe: dist) q.remove(u) if dist[u] == inf veya u = = hedef: v için ara, komşularda maliyet[u]: alt = dist[u] + alt ise maliyet< 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"]

    benzer makaleler