Η μικρότερη απόσταση μεταξύ δύο σημείων. Ξέρετε γιατί είναι πιο μακριά σε ευθεία παρά σε τόξο; Προσδιορισμός της απόστασης μεταξύ δύο τεμνόμενων γραμμών

01.02.2022

Έχοντας σκιαγραφήσει δύο σημεία στον μαυροπίνακα με κιμωλία, ο δάσκαλος προσφέρει στον μικρό μαθητή μια εργασία: να χαράξει τη συντομότερη διαδρομή μεταξύ των δύο σημείων.

Ο μαθητής, αφού σκεφτεί, τραβάει επιμελώς μια τυλιγμένη γραμμή ανάμεσά τους.

- Αυτός είναι ο συντομότερος δρόμος! ο δάσκαλος ξαφνιάζεται. - Ποιος σου το έμαθε αυτό;

- Ο πατέρας μου. Είναι οδηγός ταξί.

Το σχέδιο ενός αφελούς μαθητή είναι, φυσικά, ανέκδοτο, αλλά δεν θα χαμογελούσατε αν σας έλεγαν ότι το διακεκομμένο τόξο στο σύκο. 1 είναι ο συντομότερος δρόμος από το Ακρωτήρι της Καλής Ελπίδας μέχρι το νότιο άκρο της Αυστραλίας!

Ακόμη πιο εντυπωσιακή είναι η ακόλουθη δήλωση: απεικονίζεται στο Σχ. Το 2 ταξίδι μετ' επιστροφής από την Ιαπωνία στο κανάλι του Παναμά είναι μικρότερο από την ευθεία που χαράσσεται μεταξύ τους στον ίδιο χάρτη!

Ρύζι. 1. Σε έναν ναυτικό χάρτη, η συντομότερη διαδρομή από το Ακρωτήριο της Καλής Ελπίδας προς το νότιο άκρο της Αυστραλίας δεν υποδεικνύεται από μια ευθεία γραμμή («λοξοδρόμιο»), αλλά με μια καμπύλη («ορθοδρομία»)


Όλα αυτά μοιάζουν με αστείο, αλλά εν τω μεταξύ μπροστά σας υπάρχουν αδιαμφισβήτητες αλήθειες, γνωστές στους χαρτογράφους.




Ρύζι. 2. Φαίνεται απίστευτο ότι το καμπύλο μονοπάτι που συνδέει τη Γιοκοχάμα στον θαλάσσιο χάρτη με το κανάλι του Παναμά είναι μικρότερο από μια ευθεία γραμμή που χαράσσεται μεταξύ των ίδιων σημείων


Για να διευκρινιστεί το θέμα, θα πρέπει να ειπωθούν λίγα λόγια για τους χάρτες γενικά και για τους ναυτικούς χάρτες ειδικότερα. Η απεικόνιση τμημάτων της επιφάνειας της γης σε χαρτί δεν είναι εύκολη υπόθεση, ακόμη και κατ' αρχήν, επειδή η Γη είναι μια σφαίρα και είναι γνωστό ότι κανένα μέρος της σφαιρικής επιφάνειας δεν μπορεί να αναπτυχθεί σε ένα επίπεδο χωρίς πτυχώσεις και σπασίματα. Άθελά του, πρέπει να τα βάλει κανείς με τις αναπόφευκτες στρεβλώσεις στους χάρτες. Έχουν εφευρεθεί πολλοί τρόποι σχεδίασης χαρτών, αλλά όλοι οι χάρτες δεν είναι απαλλαγμένοι από ελλείψεις: κάποιοι έχουν παραμορφώσεις ενός είδους, άλλοι άλλου είδους, αλλά δεν υπάρχουν καθόλου χάρτες χωρίς παραμορφώσεις.

Οι ναυτικοί χρησιμοποιούν χάρτες που σχεδιάστηκαν σύμφωνα με τη μέθοδο ενός παλιού Ολλανδού χαρτογράφου και μαθηματικού του 16ου αιώνα. Mercator. Αυτή η μέθοδος ονομάζεται προβολή Mercator. Είναι εύκολο να αναγνωρίσετε έναν θαλάσσιο χάρτη από το ορθογώνιο πλέγμα του: οι μεσημβρινοί εμφανίζονται σε αυτόν ως μια σειρά από παράλληλες ευθείες γραμμές. κύκλοι γεωγραφικού πλάτους - επίσης σε ευθείες γραμμές κάθετες στην πρώτη (βλ. Εικ. 5).

Φανταστείτε τώρα ότι θέλετε να βρείτε το συντομότερο μονοπάτι από το ένα ωκεάνιο λιμάνι στο άλλο στον ίδιο παράλληλο. Στον ωκεανό, όλα τα μονοπάτια είναι διαθέσιμα και είναι πάντα δυνατό να ταξιδέψετε εκεί κατά μήκος του συντομότερου μονοπατιού, αν γνωρίζετε πώς βρίσκεται. Στην περίπτωσή μας, είναι φυσικό να πιστεύουμε ότι το συντομότερο μονοπάτι ακολουθεί τον παράλληλο στον οποίο βρίσκονται και τα δύο λιμάνια: τελικά, στον χάρτη είναι μια ευθεία γραμμή, και τι μπορεί να είναι πιο σύντομο από μια ευθεία διαδρομή! Αλλά κάνουμε λάθος: η διαδρομή κατά μήκος του παραλλήλου δεν είναι καθόλου η συντομότερη.

Πράγματι: στην επιφάνεια μιας σφαίρας, η μικρότερη απόσταση μεταξύ δύο σημείων είναι το τόξο του μεγάλου κύκλου που τα συνδέει. Αλλά ο κύκλος του παράλληλου μικρό ένας κύκλος. Το τόξο ενός μεγάλου κύκλου είναι λιγότερο κυρτό από το τόξο οποιουδήποτε μικρού κύκλου που διασχίζεται από τα ίδια δύο σημεία: μια μεγαλύτερη ακτίνα αντιστοιχεί σε μια μικρότερη καμπυλότητα. Τραβήξτε το νήμα στη σφαίρα ανάμεσα στα δύο σημεία μας (βλ. Εικ. 3). θα φροντίσετε να μην βρίσκεται καθόλου στον παράλληλο. Ένα τεντωμένο νήμα είναι ένας αναμφισβήτητος δείκτης της συντομότερης διαδρομής και αν δεν συμπίπτει με παράλληλο σε μια υδρόγειο, τότε σε έναν θαλάσσιο χάρτη η συντομότερη διαδρομή δεν υποδεικνύεται από μια ευθεία γραμμή: θυμηθείτε ότι οι κύκλοι των παραλλήλων απεικονίζονται σε τέτοια ένας χάρτης με ευθείες γραμμές, οποιαδήποτε γραμμή που δεν συμπίπτει με μια ευθεία γραμμή, υπάρχει καμπύλη .



Ρύζι. 3. Ένας απλός τρόπος για να βρείτε το συντομότερο μονοπάτι μεταξύ δύο σημείων: πρέπει να τραβήξετε μια κλωστή στην υδρόγειο ανάμεσα σε αυτά τα σημεία


Μετά από όσα ειπώθηκαν, γίνεται σαφές γιατί το συντομότερο μονοπάτι στον θαλάσσιο χάρτη δεν απεικονίζεται ως ευθεία, αλλά ως καμπύλη γραμμή.

Λένε ότι όταν επιλέγετε μια κατεύθυνση για τη Nikolaevskaya (τώρα Oktyabrskaya) ΣΙΔΗΡΟΔΡΟΜΙΚΗ ΓΡΑΜΜΗυπήρξαν ατελείωτες διαφωνίες σχετικά με τον τρόπο που θα το στρώσει. Οι διαφωνίες τερματίστηκαν με την παρέμβαση του Τσάρου Νικολάου Α', ο οποίος έλυσε το πρόβλημα κυριολεκτικά «ευθύς»: συνέδεσε την Αγία Πετρούπολη με τη Μόσχα κατά μήκος της γραμμής. Εάν αυτό είχε γίνει σε έναν χάρτη Mercator, θα ήταν μια ενοχλητική έκπληξη: αντί για μια ευθεία γραμμή, ο δρόμος θα είχε αποδειχθεί μια καμπύλη.

Όποιος δεν αποφεύγει τους υπολογισμούς μπορεί να πειστεί με έναν απλό υπολογισμό ότι η διαδρομή που μας φαίνεται καμπυλωμένη στον χάρτη είναι στην πραγματικότητα μικρότερη από αυτή που είμαστε έτοιμοι να θεωρήσουμε ευθεία. Αφήστε τα δύο λιμάνια μας να βρίσκονται στην 60η παράλληλο και να χωριστούν με απόσταση 60°. (Το αν υπάρχουν όντως τέτοια δύο λιμάνια είναι, φυσικά, αδιάφορο για υπολογισμό.)



Ρύζι. 4. Για τον υπολογισμό των αποστάσεων μεταξύ των σημείων Α και Β της μπάλας κατά μήκος του τόξου του παραλλήλου και κατά μήκος του τόξου του μεγάλου κύκλου


Στο σχ. 4 βαθμοί Ο -κέντρο του πλανήτη, AB -το τόξο του κύκλου του γεωγραφικού πλάτους στο οποίο βρίσκονται τα λιμάνια Α και Β; σετης 60°. Το κέντρο του κύκλου του γεωγραφικού πλάτους βρίσκεται σε ένα σημείο ΑΠΟΦανταστείτε το από το κέντρο Οτου πλανήτη σύρεται μέσα από τα ίδια λιμάνια ένα μεγάλο κυκλικό τόξο: η ακτίνα του OB = OA = R;θα περάσει κοντά στο τραβηγμένο τόξο AB,αλλά δεν ταιριάζει.

Ας υπολογίσουμε το μήκος κάθε τόξου. Από τα σημεία ΑΛΛΑκαι ΣΤΟβρίσκονται σε γεωγραφικό πλάτος 60° και μετά οι ακτίνες ΟΑκαι OVσυμφιλιώνομαι OS(ο άξονας της υδρογείου) γωνία 30°. Σε ορθογώνιο τρίγωνο ASOπόδι AC (=r),που βρίσκεται απέναντι από μια γωνία 30° ισούται με το ήμισυ της υποτείνουσας JSC;

που σημαίνει, r=R/2Μήκος τόξου ΑΒείναι το ένα έκτο του μήκους του κύκλου του γεωγραφικού πλάτους, και εφόσον αυτός ο κύκλος έχει το μισό μήκος του μεγάλου κύκλου (που αντιστοιχεί στο μισό της ακτίνας), τότε το μήκος του τόξου του μικρού κύκλου



Για να προσδιορίσουμε τώρα το μήκος του τόξου ενός μεγάλου κύκλου που τραβιέται μεταξύ των ίδιων σημείων (δηλαδή, η συντομότερη διαδρομή μεταξύ τους), πρέπει να γνωρίζουμε το μέγεθος της γωνίας AOW.Χορδή ΟΠΩΣ ΚΑΙ, αφαιρώντας το τόξο σε 60 ° (μικρός κύκλος), είναι η πλευρά ενός κανονικού εξαγώνου που εγγράφεται στον ίδιο μικρό κύκλο. να γιατί AB \u003d r \u003d R / 2

Σχεδιάζοντας μια ευθεία γραμμή od,κέντρο σύνδεσης Οη υδρόγειος με τη μέση ρεσυγχορδίες AB,πάρτε ένα ορθογώνιο τρίγωνο ΕΑΒ,που είναι η γωνία ΡΕ-ευθεία:

DA= 1/2 AB και OA=R.

sinAOD=AD: AO=R/4:R=0,25

Από εδώ βρίσκουμε (σύμφωνα με τους πίνακες):

=14°28",5

και ως εκ τούτου

= 28°57".

Τώρα δεν είναι δύσκολο να βρεις το επιθυμητό μήκος του συντομότερου μονοπατιού σε χιλιόμετρα. Ο υπολογισμός μπορεί να απλοποιηθεί αν θυμηθούμε ότι το μήκος ενός λεπτού ενός μεγάλου κύκλου της υδρογείου είναι

Μαθαίνουμε ότι το μονοπάτι κατά μήκος του κύκλου του γεωγραφικού πλάτους, που φαίνεται στον θαλάσσιο χάρτη με μια ευθεία γραμμή, είναι 3333 km, και το μονοπάτι κατά μήκος του μεγάλου κύκλου - κατά μήκος της καμπύλης στον χάρτη - 3213 km, δηλαδή 120 km μικρότερο.

Οπλισμένοι με ένα νήμα και μια σφαίρα στο χέρι, μπορείτε εύκολα να ελέγξετε την ορθότητα των σχεδίων μας και να βεβαιωθείτε ότι τα τόξα των μεγάλων κύκλων βρίσκονται πραγματικά όπως φαίνεται στα σχέδια. Εμφανίζεται στο σχ. 1 σαν η «ευθεία» θαλάσσια διαδρομή από την Αφρική προς την Αυστραλία να είναι 6020 μίλια και η «καμπύλη» - 5450 μίλια, δηλαδή μικρότερη κατά 570 μίλια, ή 1050 χιλιόμετρα. Η «άμεση» αεροπορική διαδρομή στον θαλάσσιο χάρτη από το Λονδίνο προς τη Σαγκάη διασχίζει την Κασπία Θάλασσα, ενώ η πραγματικά συντομότερη διαδρομή βρίσκεται βόρεια της Αγίας Πετρούπολης. Είναι σαφές τι ρόλο παίζουν αυτά τα ζητήματα στην εξοικονόμηση χρόνου και καυσίμων.

Εάν στην εποχή της ιστιοπλοΐας ο χρόνος ναυτιλίας δεν εκτιμούνταν πάντα - τότε ο "χρόνος" δεν θεωρούνταν ακόμη "χρήματα", τότε με την εμφάνιση των ατμοπλοίων, πρέπει να πληρώσετε για κάθε επιπλέον τόνο άνθρακα που καταναλώνεται. Αυτός είναι ο λόγος για τον οποίο στις μέρες μας τα πλοία πλοηγούνται κατά μήκος του πραγματικά συντομότερου μονοπατιού, χρησιμοποιώντας συχνά χάρτες που δεν έγιναν στο Mercator, αλλά στη λεγόμενη "κεντρική" προβολή: σε αυτούς τους χάρτες, τα τόξα μεγάλων κύκλων απεικονίζονται ως ευθείες γραμμές.

Γιατί, λοιπόν, πρώην πλοηγοί χρησιμοποιούσαν τόσο παραπλανητικούς χάρτες και επέλεξαν δυσμενή μονοπάτια; Είναι λάθος να πιστεύουμε ότι τα παλιά χρόνια δεν γνώριζαν για το πλέον υποδεικνυόμενο χαρακτηριστικό των θαλάσσιων χαρτών. Το θέμα εξηγείται, φυσικά, όχι από αυτό, αλλά από το γεγονός ότι οι χάρτες που σχεδιάζονται με τη μέθοδο Mercator, μαζί με τις ταλαιπωρίες, έχουν πολύ πολύτιμα οφέλη για τους ναυτικούς. Ένας τέτοιος χάρτης, πρώτον, απεικονίζει ξεχωριστά μικρά μέρη της επιφάνειας της γης χωρίς παραμόρφωση, διατηρώντας τις γωνίες του περιγράμματος. Αυτό δεν έρχεται σε αντίθεση με το γεγονός ότι με την απόσταση από τον ισημερινό, όλα τα περιγράμματα τεντώνονται αισθητά. Σε μεγάλα γεωγραφικά πλάτη, η έκταση είναι τόσο σημαντική που ένας θαλάσσιος χάρτης εμπνέει ένα άτομο που δεν είναι εξοικειωμένο με τα χαρακτηριστικά του με μια εντελώς λανθασμένη ιδέα για το πραγματικό μέγεθος των ηπείρων: η Γροιλανδία φαίνεται να έχει το ίδιο μέγεθος με την Αφρική, την Αλάσκα είναι μεγαλύτερη από την Αυστραλία, αν και η Γροιλανδία είναι 15 φορές μικρότερη από την Αφρική, και η Αλάσκα μαζί με τη Γροιλανδία το μισό μέγεθος της Αυστραλίας. Αλλά ένας ναυτικός που γνωρίζει καλά αυτά τα χαρακτηριστικά του χάρτη δεν μπορεί να εξαπατηθεί από αυτά. Τα ανέχεται, ειδικά επειδή, σε μικρές περιοχές, ένας θαλάσσιος χάρτης δίνει μια ακριβή ομοιότητα της φύσης (Εικ. 5).

Από την άλλη, ο θαλάσσιος χάρτης διευκολύνει πολύ την επίλυση των καθηκόντων της ναυτικής πρακτικής. Αυτό - ενιαίο γένοςχάρτες στους οποίους η διαδρομή ενός πλοίου σε σταθερή πορεία απεικονίζεται ως ευθεία γραμμή. Το να ακολουθείς μια «σταθερή πορεία» σημαίνει να διατηρείς αμετάβλητα μια κατεύθυνση, ένα συγκεκριμένο «ρολόι», με άλλα λόγια, να πηγαίνεις με τέτοιο τρόπο ώστε να διασχίζεις όλους τους μεσημβρινούς σε ίση γωνία. Αλλά αυτό το μονοπάτι («λοξοδρόμιο») μπορεί να απεικονιστεί ως ευθεία γραμμή μόνο σε έναν χάρτη στον οποίο όλοι οι μεσημβρινοί είναι ευθείες γραμμές παράλληλες μεταξύ τους. Και δεδομένου ότι στην υδρόγειο οι κύκλοι του γεωγραφικού πλάτους τέμνονται με τους μεσημβρινούς σε ορθή γωνία, τότε σε έναν τέτοιο χάρτη οι κύκλοι του γεωγραφικού πλάτους πρέπει να είναι ευθείες γραμμές κάθετες στις γραμμές των μεσημβρινών. Εν ολίγοις, φτάνουμε ακριβώς στο πλέγμα συντεταγμένων που αποτελεί χαρακτηριστικό γνώρισμα του θαλάσσιου χάρτη.




Ρύζι. 5. Ναυτικός ή Mercator χάρτης της υδρογείου. Σε τέτοιους χάρτες, οι διαστάσεις των περιγραμμάτων μακριά από τον ισημερινό είναι πολύ υπερβολικές. Ποιο, για παράδειγμα, είναι μεγαλύτερο: Γροιλανδία ή Αυστραλία; (απάντηση σε κείμενο)


Η προτίμηση των ναυτικών για τους χάρτες Mercator είναι πλέον κατανοητή. Θέλοντας να καθορίσει την πορεία που πρέπει να ακολουθήσει όταν πηγαίνει στο καθορισμένο λιμάνι, ο πλοηγός εφαρμόζει έναν χάρακα στα τελικά σημεία της διαδρομής και μετρά τη γωνία που κάνει με τους μεσημβρινούς. Παραμένοντας στην ανοιχτή θάλασσα όλη την ώρα προς αυτή την κατεύθυνση, ο πλοηγός θα φέρει με ακρίβεια το πλοίο στον στόχο. Βλέπετε ότι το «λοξοδρόμιο» είναι, αν και όχι ο πιο σύντομος και όχι ο πιο οικονομικός, αλλά από μια άποψη ένας πολύ βολικός τρόπος για έναν ναύτη. Για να φτάσει κανείς, για παράδειγμα, από το Ακρωτήρι της Καλής Ελπίδας στο νότιο άκρο της Αυστραλίας (βλ. Εικ. 1), πρέπει να διατηρείται πάντα η ίδια πορεία S 87 °, 50 ". Εν τω μεταξύ, για να φέρει το πλοίο στο ίδιο τελικό σημείο με τον συντομότερο τρόπο (κατά μήκος του" "), είναι απαραίτητο, όπως φαίνεται από το σχήμα, να αλλάζετε συνεχώς την πορεία του σκάφους: ξεκινήστε από την πορεία S 42 °, 50 "και τελειώστε με την πορεία N 53 °. 50" (σε αυτήν την περίπτωση, το συντομότερο μονοπάτι δεν είναι καν εφικτό - στηρίζεται στον τοίχο πάγου της Ανταρκτικής).

Και τα δύο μονοπάτια - κατά μήκος του "λοξοδρόμιου" και κατά μήκος της "ορθοδρομίας" - συμπίπτουν μόνο όταν η διαδρομή κατά μήκος του μεγάλου κύκλου απεικονίζεται στον θαλάσσιο χάρτη ως ευθεία γραμμή: όταν κινείται κατά μήκος του ισημερινού ή κατά μήκος του μεσημβρινού. Σε όλες τις άλλες περιπτώσεις, αυτές οι διαδρομές είναι διαφορετικές.

(Περιγραφική γεωμετρία)
  • CD (CXDX, C2D2)εμφανίζεται ως τελεία C5 = D5 A5B5ισοδυναμεί...
    (Περιγραφική γεωμετρία)
  • Προσδιορισμός της απόστασης μεταξύ δύο παράλληλων επιπέδων
    Προσδιορισμός της απόστασης μεταξύ δύο παράλληλων επιπέδων γενική θέση 01| Χείναι βολικό να το αναγάγουμε στο πρόβλημα του προσδιορισμού της απόστασης μεταξύ των ίδιων δύο επιπέδων, που μετατρέπεται στη θέση των προβαλλόμενων. Σε αυτή την περίπτωση, η απόσταση μεταξύ των επιπέδων ορίζεται ως η κάθετη μεταξύ των γραμμών, ...
    (Περιγραφική γεωμετρία)
  • Προσδιορισμός της απόστασης μεταξύ δύο τεμνόμενων γραμμών
    Εάν θέλετε να προσδιορίσετε τη μικρότερη απόσταση μεταξύ δύο τεμνόμενων γραμμών, πρέπει να αλλάξετε τα συστήματα των επιπέδων προβολής δύο φορές. Κατά την επίλυση αυτού του προβλήματος, η άμεση CD (CXDX, C2D2)εμφανίζεται ως τελεία C5 = D5(Εικ. 198). Απόσταση από αυτό το σημείο μέχρι την προβολή A5B5ισοδυναμεί...
    (Περιγραφική γεωμετρία)
  • Γωνία μεταξύ δύο τεμνόμενων ευθειών
    Αυτή είναι η γωνία μεταξύ δύο τεμνόμενων γραμμών που είναι παράλληλες με τα δεδομένα. Έτσι, αυτή η εργασία είναι παρόμοια με την προηγούμενη. Για να το λύσετε, πρέπει να πάρετε ένα αυθαίρετο σημείο και να σχεδιάσετε δύο γραμμές μέσω αυτού παράλληλες με τις δεδομένες λοξές γραμμές και χρησιμοποιώντας τον μετασχηματισμό προβολής για να προσδιορίσετε την απαιτούμενη γωνία....
    (Βασικές αρχές της περιγραφικής γεωμετρίας. Μια σύντομη πορεία και μια συλλογή προβλημάτων.)
  • Προσδιορισμός της απόστασης μεταξύ δύο παράλληλων ευθειών
    Το πρόβλημα επιλύεται με τη μέθοδο της διπλής αντικατάστασης των επιπέδων προβολής. Στο τελικό στάδιο, ένα από τα επίπεδα προβολής πρέπει να είναι κάθετο σε μία από τις τεμνόμενες γραμμές. Τότε η μικρότερη απόσταση μεταξύ τους καθορίζεται από την τιμή του τμήματος της κάθετης στην άλλη λοξή γραμμή (Εικ. 199)....
    (Περιγραφική γεωμετρία)
  • Η διαδρομή κατά μήκος της διακεκομμένης γραμμής στην εικόνα είναι μικρότερη από τη διαδρομή κατά μήκος της συμπαγούς γραμμής. Και τώρα λίγο πιο αναλυτικά στο παράδειγμα των θαλάσσιων διαδρομών:

    Εάν πλέετε σε μια σταθερή πορεία, τότε η τροχιά του πλοίου στην επιφάνεια της γης θα είναι μια καμπύλη, που ονομάζεται στα μαθηματικά λογαριθμικήσπειροειδής.

    Στην πλοήγηση, αυτή η σύνθετη γραμμή διπλής καμπυλότητας ονομάζεται λοξοδρομία, που στα ελληνικά σημαίνει «λοξό τρέξιμο».

    Ωστόσο, η μικρότερη απόσταση μεταξύ δύο σημείων της υδρογείου μετριέται κατά μήκος του τόξου ενός μεγάλου κύκλου.

    Το τόξο ενός μεγάλου κύκλου λαμβάνεται ως ίχνος από την τομή της επιφάνειας της γης με ένα επίπεδο που διέρχεται από το κέντρο της γης, λαμβανόμενο ως μπάλα.

    Στην πλοήγηση, το μεγάλο τόξο κύκλου ονομάζεται μεγάλος κύκλος, που σημαίνει «ίσιο τρέξιμο». Το δεύτερο χαρακτηριστικό του μεγάλου κύκλου είναι ότι διασχίζει τους μεσημβρινούς κάτω διαφορετικές γωνίες(Εικ. 29).

    Η διαφορά στις αποστάσεις μεταξύ δύο σημείων στην επιφάνεια της γης κατά μήκος του λοξοδρόμου και του ορθόδρομου είναι πρακτικής σημασίας μόνο για μεγάλες διαβάσεις ωκεανών.

    Υπό κανονικές συνθήκες, αυτή η διαφορά παραμελείται και η πλοήγηση διεξάγεται σε σταθερή πορεία, δηλ. με λοξοδρόμιο.

    Για να εξαγάγουμε την εξίσωση, παίρνουμε λοξοδρομίες (Εικ. 30, ένα) δύο τελείες ΑΛΛΑκαι ΣΤΟ,η απόσταση μεταξύ τους είναι απλά μικρή. Σχεδιάζοντας μεσημβρινούς και μια παράλληλη μέσα από αυτούς, παίρνουμε ένα στοιχειώδες ορθογώνιο σφαιρικό τρίγωνο ΑΛΦΑΒΗΤΟ.Σε αυτό το τρίγωνο, η γωνία που σχηματίζεται από την τομή του μεσημβρινού και της παραλλήλου είναι ορθή και η γωνία ΠnΑΒίσο με την πορεία του πλοίου Κ. Κατέτ ΜΕΤΑ ΧΡΙΣΤΟΝαντιπροσωπεύει ένα τμήμα τόξου μεσημβρινού και μπορεί να εκφραστεί

    όπου R - ακτίνα της Γης ως σφαίρα.

    Δφ - στοιχειώδης αύξηση γεωγραφικού πλάτους (διαφορά γεωγραφικών πλάτων).

    πόδι ΝΔαντιπροσωπεύει ένα τμήμα τόξου παράλληλο

    όπου r - ακτίνα του παραλλήλου.

    Δλ - στοιχειώδη διαφορά γεωγραφικών μήκων.

    Από τρίγωνο OO 1 C μπορεί να βρεθεί ότι

    Στη συνέχεια στην τελική μορφή το πόδι ΝΔμπορεί να εκφραστεί ως εξής:

    Υποθέτοντας ένα στοιχειώδες σφαιρικό τρίγωνο αλφάβητογια επίπεδη, γράψτε

    Μετά τη μείωση R και αντικαθιστώντας στοιχειώδεις μικρές προσαυξήσεις των συντεταγμένων με απειροελάχιστες, έχουμε

    Ενσωματώνουμε την έκφραση που προκύπτει στο εύρος από φ 1, λ 1 έως φ 2, λ 2 θεωρώντας την τιμή του tgK ως σταθερή τιμή:

    Στη δεξιά πλευρά έχουμε ένα ολοκλήρωμα πίνακα. Αφού αντικαταστήσουμε την τιμή του, λαμβάνουμε την εξίσωση λοξόδρομου στην μπάλα

    Η ανάλυση αυτής της εξίσωσης μας επιτρέπει να βγάλουμε τα ακόλουθα συμπεράσματα:

    Σε διαδρομές 0 και 180 °, το λοξοδρόμιο μετατρέπεται σε τόξο μεγάλου κύκλου - μεσημβρινό.

    Σε διαδρομές 90 και 270 °, το λοξοδρόμιο συμπίπτει με το παράλληλο.

    Το λοξοδρόμιο διασχίζει κάθε παράλληλο μόνο μία φορά και κάθε μεσημβρινό αμέτρητες φορές. εκείνοι. πλησιάζοντας σπειροειδώς τον στύλο, δεν τον φτάνει.

    Η πλοήγηση σε σταθερή πορεία, δηλαδή κατά μήκος του λοξοδρόμου, αν και δεν είναι η μικρότερη απόσταση μεταξύ δύο σημείων στη Γη, αντιπροσωπεύει σημαντική ευκολία για τον πλοηγό.

    Οι απαιτήσεις για έναν χάρτη θαλάσσιας πλοήγησης μπορούν να διαμορφωθούν με βάση το πλεονέκτημα της πλοήγησης κατά μήκος του λοξοδρόμου και τα αποτελέσματα της ανάλυσης της εξίσωσής του ως εξής.

    1. Το Loxodrome, που διασχίζει τους μεσημβρινούς υπό σταθερή γωνία, θα πρέπει να απεικονίζεται ως ευθεία γραμμή.

    2. Η χαρτογραφική προβολή που χρησιμοποιείται για την κατασκευή των χαρτών πρέπει να είναι σύμμορφη έτσι ώστε οι πορείες, τα έδρανα και οι γωνίες σε αυτήν να αντιστοιχούν στην αξία τους στο έδαφος.

    3. Οι μεσημβρινοί και οι παράλληλοι, όπως οι γραμμές πορείας 0, 90, 180° και 270°, πρέπει να είναι αμοιβαία κάθετες ευθείες γραμμές.

    Η μικρότερη απόσταση μεταξύ δύο δεδομένων σημείων στην επιφάνεια της Γης, λαμβανόμενη ως σφαίρα, είναι η μικρότερη από τα τόξα ενός μεγάλου κύκλου που διέρχεται από αυτά τα σημεία. Εκτός από την περίπτωση ενός πλοίου που ακολουθεί έναν μεσημβρινό ή τον ισημερινό, ο μεγάλος κύκλος διασχίζει τους μεσημβρινούς σε διαφορετικές γωνίες. Επομένως, ένα πλοίο που ακολουθεί μια τέτοια καμπύλη πρέπει να αλλάζει την πορεία του συνεχώς. Πρακτικά είναι πιο βολικό να ακολουθήσετε μια πορεία που κάνει σταθερή γωνία με τους μεσημβρινούς και απεικονίζεται στον χάρτη στην προβολή Mercator από μια ευθεία γραμμή - λοξοδρόμιο. Ωστόσο, σε μεγάλες αποστάσεις, η διαφορά στο μήκος του ορθόδρομου και του λοξοδρόμου φτάνει σε σημαντική τιμή. Επομένως, σε τέτοιες περιπτώσεις, υπολογίζεται ο ορθόδρομος και σημειώνονται σε αυτό ενδιάμεσα σημεία, μεταξύ των οποίων κολυμπούν κατά μήκος του λοξοδρόμου.

    Μια χαρτογραφική προβολή που πληροί τις παραπάνω απαιτήσεις προτάθηκε από τον Ολλανδό χαρτογράφο Gerard Cramer (Mercator) το 1569. Προς τιμή του δημιουργού της, η προβολή ονομάστηκε Mercator.

    Και ποιος θέλει να πάρει ακόμα περισσότερα ενδιαφέρουσες πληροφορίεςΜάθε περισσότερα Το αρχικό άρθρο βρίσκεται στον ιστότοπο InfoGlaz.rfΣύνδεσμος προς το άρθρο από το οποίο δημιουργήθηκε αυτό το αντίγραφο -

    ΑΠΟΣΤΑΣΗ, αποστάσεις, βλ. 1. Ένας χώρος που χωρίζει δύο σημεία, ένα κενό ανάμεσα σε κάτι. Η μικρότερη απόσταση μεταξύ δύο σημείων σε ευθεία γραμμή. Ζει από εμάς σε απόσταση δύο χιλιομέτρων. «Ο διοικητής τους άφησε να μπουν στην πιο κοντινή απόσταση… Επεξηγηματικό Λεξικό Ushakov

    απόσταση- ουσιαστικό, σ., χρήση. συχνά Μορφολογία: (όχι) τι; απόσταση για τι; απόσταση, (δείτε) τι; απόσταση από; απόσταση, τι; Σχετικά με την απόσταση? pl. τι; απόσταση, (όχι) τι; αποστάσεις, γιατί; αποστάσεις, (δείτε) τι; απόσταση από; αποστάσεις... Λεξικό του Ντμίτριεφ

    απόσταση- ΕΓΩ; βλ. Ο χώρος που χωρίζει δύο σημεία, δύο αντικείμενα, κ.λπ., το χάσμα μεταξύ κάποιου, από λ. Το συντομότερο ποτάμι μεταξύ δύο σημείων. R. από το σπίτι στο σχολείο. Υποχώρηση σε ένα κοντινό ποτάμι. Σε απόσταση ενός μέτρου, τα χέρια απλωμένα. Μάθετε κάτι, αισθανθείτε κάτι. στο… … εγκυκλοπαιδικό λεξικό

    απόσταση- ΕΓΩ; βλ. δείτε επίσης απόσταση α) Ο χώρος που χωρίζει δύο σημεία, δύο αντικείμενα κ.λπ., το χάσμα μεταξύ κάποιου, από το l. Η μικρότερη απόσταση μεταξύ δύο σημείων. Απόσταση από το σπίτι στο σχολείο. Υποχώρηση σε κοντινή απόσταση / nie ... Λεξικό πολλών εκφράσεων

    ΓΕΩΜΕΤΡΙΑ- κλάδος των μαθηματικών που μελετά τις ιδιότητες διαφόρων σχημάτων (σημεία, γραμμές, γωνίες, δισδιάστατα και τρισδιάστατα αντικείμενα), το μέγεθος και τη σχετική τους θέση. Για τη διευκόλυνση της διδασκαλίας, η γεωμετρία χωρίζεται σε επιπεδομετρία και συμπαγή γεωμετρία. ΣΤΟ…… Εγκυκλοπαίδεια Collier

    Πλοήγηση*

    Πλοήγηση- τμήμα ναυσιπλοΐας (βλ.), ολοκληρώνοντας μια παρουσίαση τρόπων προσδιορισμού της θέσης ενός πλοίου στη θάλασσα, χρησιμοποιώντας μια πυξίδα και ένα κούτσουρο (βλ.). Για να προσδιορίσετε τη θέση του πλοίου στη θάλασσα σημαίνει να βάλετε στον χάρτη το σημείο στο οποίο βρίσκεται αυτή τη στιγμή το πλοίο. ... ... Εγκυκλοπαιδικό Λεξικό F.A. Brockhaus και I.A. Έφρον

    COGEN- (Cohen) Hermann (1842 1918) Γερμανός φιλόσοφος, ιδρυτής και πιο εξέχων εκπρόσωπος της νεοκαντιανικής σχολής του Marburg. Κυριότερα έργα: «Η Θεωρία της Εμπειρίας του Καντ» (1885), «Η Δικαιολόγηση της Ηθικής του Καντ» (1877), «Η Δικαιολόγηση της Αισθητικής του Καντ» (1889), «Λογική… ...

    Kant Immanuel - μονοπάτι ζωήςκαι τα γραπτά του Kant Ο Immanuel Kant γεννήθηκε στο Konigsberg (τώρα Καλίνινγκραντ) στην Ανατολική Πρωσία το 1724. Ο πατέρας του ήταν σαγματοποιός και η μητέρα του νοικοκυρά, έξι από τα παιδιά τους δεν έζησαν μέχρι την ενηλικίωση. Ο Καντ θυμόταν πάντα τους γονείς του με ... ... Η δυτική φιλοσοφία από τις απαρχές της έως τις μέρες μας

    Η ΚΡΙΤΙΚΗ ΦΙΛΟΣΟΦΙΑ ΤΟΥ ΚΑΝΤ: ΤΟ ΔΟΓΜΑ ΤΩΝ ΙΚΑΝΟΤΗΤΩΝ- (La philosophie critique de Kant: Doctrines des facultes, 1963) του Deleuze. Περιγράφοντας την υπερβατική μέθοδο στην εισαγωγή, ο Ντελέζ σημειώνει ότι ο Καντ κατανοεί τη φιλοσοφία ως την επιστήμη της σχέσης όλης της γνώσης με τους ουσιαστικούς στόχους... ... Ιστορία της Φιλοσοφίας: Εγκυκλοπαίδεια

    αρχή της φάρμας- τη βασική αρχή της γεωμετρικής οπτικής (Βλ. Γεωμετρική οπτική). Η απλούστερη μορφή του F. p. είναι η δήλωση ότι μια ακτίνα φωτός διαδίδεται πάντα στο διάστημα μεταξύ δύο σημείων κατά μήκος της διαδρομής κατά μήκος των οποίων ο χρόνος διέλευσης της είναι μικρότερος από ... Μεγάλη Σοβιετική Εγκυκλοπαίδεια

    Ο αλγόριθμος του Dijkstra είναι ένας αλγόριθμος γραφήματος που εφευρέθηκε από τον Ολλανδό επιστήμονα Edsger Dijkstra το 1959. Βρίσκει τις συντομότερες διαδρομές από μια από τις κορυφές του γραφήματος σε όλες τις άλλες. Ο αλγόριθμος λειτουργεί μόνο για γραφήματα χωρίς ακμές αρνητικού βάρους.

    Εξετάστε την εκτέλεση του αλγορίθμου στο παράδειγμα του γραφήματος που φαίνεται στο σχήμα.

    Ας απαιτείται να βρεθούν οι μικρότερες αποστάσεις από την 1η κορυφή σε όλες τις άλλες.

    Οι κύκλοι υποδεικνύουν τις κορυφές, οι γραμμές υποδεικνύουν τις διαδρομές μεταξύ τους (τα άκρα του γραφήματος). Οι αριθμοί των κορυφών υποδεικνύονται στους κύκλους, η "τιμή" τους - το μήκος της διαδρομής - υποδεικνύεται πάνω από τις άκρες. Δίπλα σε κάθε κορυφή, σημειώνεται μια κόκκινη ετικέτα - το μήκος της συντομότερης διαδρομής προς αυτήν την κορυφή από την κορυφή 1.

    Το πρώτο βήμα. Εξετάστε ένα βήμα στον αλγόριθμο του Dijkstra για το παράδειγμά μας. Η κορυφή 1 έχει την ελάχιστη ετικέτα. Οι κορυφές 2, 3 και 6 είναι οι γειτονικές της.

    Ο πρώτος γείτονας της κορυφής 1 με τη σειρά του είναι η κορυφή 2, επειδή το μήκος της διαδρομής προς αυτήν είναι ελάχιστο. Το μήκος της διαδρομής προς αυτήν μέσω της κορυφής 1 είναι ίσο με το άθροισμα της τιμής της ετικέτας της κορυφής 1 και του μήκους της άκρης που πηγαίνει από την 1η στη 2η, δηλαδή 0 + 7 = 7. Αυτό είναι μικρότερο από το τρέχουσα ετικέτα κορυφής 2, άπειρο, άρα η νέα ετικέτα της 2ης κορυφής είναι 7.

    Κάνουμε μια παρόμοια λειτουργία με δύο άλλους γείτονες της 1ης κορυφής - την 3η και την 6η.

    Όλοι οι γείτονες του κόμβου 1 ελέγχονται. Η τρέχουσα ελάχιστη απόσταση μέχρι την κορυφή 1 θεωρείται οριστική και δεν υπόκειται σε αναθεώρηση (το γεγονός ότι αυτό όντως ισχύει το απέδειξε για πρώτη φορά ο E. Dijkstra). Διασχίστε το έξω από το γράφημα για να επισημάνετε ότι αυτή η κορυφή έχει επισκεφθεί.

    Δεύτερο βήμα. Το βήμα του αλγορίθμου επαναλαμβάνεται. Και πάλι βρίσκουμε την «πλησιέστερη» από τις μη επισκέψιμες κορυφές. Αυτή είναι η κορυφή 2 με την ένδειξη 7.

    Και πάλι προσπαθούμε να μειώσουμε τις ετικέτες των γειτόνων της επιλεγμένης κορυφής, προσπαθώντας να τις περάσουμε από τη 2η κορυφή. Οι γείτονες της κορυφής 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 i "< "<> "; cin>>start; Dijkstra(GR, start-1); system("pause>>void"); )

    Πασκάλ

    πρόγραμμα DijkstraAlgorithm; usecrt; constV=6; inf=100000; τύπος vector=πίνακας ακέραιου αριθμού; var start: ακέραιος; 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) Dijkstra(GR: πίνακας ακέραιου; st: ακέραιος); var count, index, i, u, m, min: ακέραιος; απόσταση: διάνυσμα; επίσκεψη: συστοιχία boolean; Beginm:=st; για i:=1 έως V ξεκινήστε την απόσταση[i]:=inf; visited[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]<>στ) και (απόσταση[u]+GR inf τότε writeln(m," > ", i," = ", απόσταση[i]) else writeln(m," > ", i," = ", "η διαδρομή δεν είναι διαθέσιμη"); τέλος; (κύριο μπλοκ προγράμματος) start clrscr? write("Starting node >> "); ανάγνωση (έναρξη) Dijkstra (GR, έναρξη); τέλος.

    Ιάβα

    εισαγωγή java.io.BufferedReader; εισαγωγή java.io.IOException; εισαγωγή java.io.InputStreamReader; εισαγωγή java.io.PrintWriter; εισαγωγή java.util.ArrayList; Εισαγωγή java.util.Arrays; εισαγωγή java.util.StringTokenizer; δημόσια κλάση Λύση ( private static int INF = Integer.MAX_VALUE / 2; private int n; //αριθμός κορυφών στο δίγραμμα ιδιωτικό int m; //αριθμός τόξων στο δίγραμμα ιδιωτικό ArrayList adj; //Λίστα γειτνίασης ιδιωτικό ArrayList βάρος; //βάρος ακμής σε διγράφημα ιδιωτικό boolean που χρησιμοποιείται. //πίνακας για την αποθήκευση πληροφοριών σχετικά με περασμένες και μη περασμένες κορυφές private int dist. //πίνακας για αποθήκευση της απόστασης από την αρχική κορυφή //μια σειρά προγόνων που απαιτούνται για την επαναφορά της συντομότερης διαδρομής από την αρχική κορυφή private int pred; int start? //κορυφή εκκίνησης, από την οποία αναζητείται η απόσταση από όλες τις άλλες private BufferedReader cin. ιδιωτικό PrintWriter cout? ιδιωτική συσκευή StringTokenizer. //διαδικασία για την εκκίνηση του αλγόριθμου του Dijkstra από την αρχική κορυφή private 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() ) //αρχικοποίηση της λίστας που αποθηκεύει τα βάρη των ακμών βάρος = 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 = ( 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), ); ιδιωτική στατική τελική συμβολοσειρά START = "a"; ιδιωτική στατική τελική συμβολοσειρά END = "e"; δημόσιο στατικό κενό main(String args) (Γράφημα g = νέο γράφημα(GRAPH); g.dijkstra (START); g.printPath(END); //g.printAllPaths(); ) ) class Graph ( ιδιωτικός τελικός χάρτης γραφική παράσταση; // αντιστοίχιση ονομάτων κορυφών σε αντικείμενα Κορυφής, κατασκευασμένα από ένα σύνολο ακμών /** Μία άκρη του γραφήματος (χρησιμοποιείται μόνο από τον κατασκευαστή γραφήματος) */ δημόσια στατική κλάση Edge ( δημόσια τελική συμβολοσειρά v1, v2; δημόσια τελική int dist; public Edge(String v1, String v2, int dist) ( this.v1 = v1; this.v2 = v2; this.dist = dist; ) ) /** Μία κορυφή του γραφήματος, πλήρης με αντιστοιχίσεις σε γειτονικές κορυφές */ δημόσια στατική κλάση Vertex υλοποιεί Συγκρίσιμο ( δημόσιο τελικό όνομα συμβολοσειράς; δημόσια int dist = Integer.MAX_VALUE; // MAX_VALUE θεωρείται ότι είναι άπειρο δημόσιο Vertex previous = null; δημόσιος τελικός χάρτης γείτονες = νέο HashMap<>() public Vertex(String name) ( 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(unreached)", 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); ) ) /** Δημιουργεί ένα γράφημα από ένα σύνολο ακμών * / public Graph(Edge edges) ( graph = new HashMap<>(άκρες.μήκος); //ένα πέρασμα για να βρεθούν όλες οι κορυφές για (Ακμή e: άκρες) ( 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("Το γράφημα δεν περιέχει την κορυφή της αρχής \"%s\"\n", startName); return; ) τελικό Vertex source = graph.get(startName); NavigableSet q = νέο Σύνολο δέντρων<>() // set-up vertices for (Vertex v: graph.values()) ( v.previous = v == source ? source: null; v.dist = v == source ? 0: Integer.MAX_VALUE; q.add( v); ) dijkstra(q); ) /** Υλοποίηση του αλγορίθμου του dijkstra με χρήση δυαδικού σωρού. */ private void dijkstra(final NavigableSet q) ( Κορυφή u, v; ενώ (!q.isEmpty()) (u = q.pollFirst(); // κορυφή με τη μικρότερη απόσταση (η πρώτη επανάληψη θα επιστρέψει την πηγή) εάν (u.dist == Integer.MAX_VALUE) break; // μπορούμε να αγνοήσουμε το 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 *via; /* όπου ο προηγούμενος κόμβος βρίσκεται στη συντομότερη διαδρομή */ διπλή απόσταση; /* απόσταση από τον αρχικό κόμβο */ όνομα χαρακτήρα; /* 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; /* Μην πειράζετε τα πράγματα διαχείρισης μνήμης, είναι εκτός θέματος. 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 = next; ->αδερφός = a->άκρη; a->άκρη = e_next; ) void free_edges() (για (; 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 = σωρό; tmp = σωρό; για (i = 1; i< heap_len && (j = i * 2) <= heap_len; i = j) { if (j < heap_len && heap[j]->dist > heap->dist) j++; αν (σωρός[j]->dist >= tmp->dist) σπάσει; (heap[i] = heap[j])->heap_idx = i; ) heap[i] = tmp; tmp->heap_idx = i; επιστροφή nd? ) /* --- Dijkstra πράγματα; οι μη προσβάσιμοι κόμβοι δεν θα μπουν ποτέ στην ουρά --- */ void calc_all(node_t *start) (node_t *lead; edge_t *e; set_dist(start, start, 0); ενώ ((lead = pop_queue())) για ( e = lead->άκρη; 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->όνομα); αλλιώς εάν (!nd->via) printf("%s(unreached)", nd->name); else ( show_path(nd-> via); printf("-> %s(%g) ", nd->όνομα, nd->dist); ) ) int main(void) ( #ifndef BIG_EXAMPLE int i; # define N_NODES ("f" - " 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

    $edge, "cost" => $edge); $neighbours[$edge] = array("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";


    Πύθων

    από συλλογές εισαγωγή 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(( for e in edges2), )) def dijkstra(self, source, dest): assert source in self.vertices dist = (κορυφή: inf για κορυφή σε self.vertices ) previous = (κορυφή: Καμία για κορυφή σε self.vertices) dist = 0 q = self.vertices.copy() γείτονες = (κορυφή: set() για κορυφή σε self.vertices) για αρχή, τέλος, κόστος στον εαυτό. άκρες: nears.add((τέλος, κόστος)) #pp(neighbours) ενώ q: u = min(q, κλειδί=λάμδα κορυφή: dist) q.remove(u) if dist[u] == inf ή u = = dest: διάλειμμα για v, κόστος σε γείτονες[u]: alt = απόσταση[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"]

    Παρόμοια άρθρα
    • Πατινοποίηση χάλκινων νομισμάτων

      Στρώστε ένα βαθύ πλαστικό δοχείο με χαρτοπετσέτες. Τσαλακώστε μερικές χαρτοπετσέτες με τα χέρια σας και τοποθετήστε τις σε ένα πλαστικό δοχείο με καπάκι. Το δοχείο πρέπει να είναι αρκετά βαθύ για να χωρέσει όλες αυτές τις πετσέτες και...

      Σωλήνες νερού
    • Το SmartNews ακολούθησε τα βήματα των Μορδοβιανών κυνηγών θησαυρών

      Την περασμένη εβδομάδα, οι θησαυροί ήταν κυρίως χάλκινοι. Τα μεγέθη των ευρημάτων ήταν διαφορετικά - από τριακόσιες έως τετρακόσια νομίσματα. Διαβάζουμε τους επόμενους κορυφαίους 5 θησαυρούς της εβδομάδας από το MDRegion! 1. Θησαυρός από ζυγαριές χαλκού. Όλοι έχουμε συνηθίσει στο γεγονός ότι οι πένες είναι ζυγαριά...

      Βρύσες
    • Ποιος θωρακικός σταυρός είναι σωστός;

      Η ιστορία της εμφάνισης αρχαίων σταυρών στη Ρωσία, η ταξινόμηση των παλαιών σταυρών και των ποικιλιών τους (θωρακικοί σταυροί, σταυροί γιλέκου, εγκόλπιοι, θήκες εικόνων και άλλα). Η εύρεση ενός θησαυρού είναι ο στόχος που ονειρεύεται κάθε ανασκαφέας. Αλλά συχνά κατά τη διάρκεια της αναζήτησης συναντά ...

      Αντλιοστάσια
     
    Κατηγορίες