background image

34 | 

9 4

 

 

Επαναλαμβάνουμε τα παρακάτω έως ότου πληρούνται τα κριτήρια διακοπής: 

(3.3)  Αναζητούμε  τον  κόμβο  με  την  χαμηλότερη    τιμή  της  𝒇(𝒏) από  την  λίστα 

"yetToVisit".  Αυτός  ο  κόμβος  γίνεται  ο  τρέχον  κόμβος.  Ελέγχουμε  επίσης  τη  μέγιστη  τιμή 

επανάληψης που έχουμε ορίσει, αν έχει επιτευχθεί τερματίζουμε. 

(3.4)  Ελέγχουμε  εάν  ο  τρέχον  κόμβος  είναι  ίδιος  με  τον  κόμβο  στόχο  (δηλαδή  αν 

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

είναι ίσες τότε είναι ο ίδιος κόμβος. 

(3.5)  Χρησιμοποιούμε  τον  τρέχοντα  κόμβο  και  ελέγχουμε  τους  τέσσερις  γειτονικούς 

του κόμβους. Αν δεν επιτρέπεται να κινηθούμε προς αυτόν ή αν βρίσκεται στη λίστα "visited", 

τον  αγνοούμε.  Διαφορετικά,  δημιουργούμε    νέο  κόμβο  με  γονικό  τον  τρέχοντα  κόμβο  και 

ενημερώνουμε τη θέση του κόμβου. 

(3.6) Ελέγχουμε όλους τους γειτονικούς κόμβους που δημιουργήθηκαν για να δούμε 

• Εάν δεν βρίσκεται στην λίστα "yetToVisit", τον προσθέτουμε. Κάνουμε τον τρέχοντα 

κόμβο γονέα του γειτονικού και υπολογίζουμε τα κόστη f, g, και h του κόμβου. 

• Αν υπάρχει ήδη στον κατάλογο "yetToVisit", ελέγχουμε αν η διαδρομή προς αυτόν 

τον κόμβο είναι καλύτερη, χρησιμοποιώντας το κόστος g ως μέτρο. Ένα χαμηλότερο κόστος g 

σημαίνει  ότι  πρόκειται  για  μια  καλύτερη  πορεία.  Αν  ναι,  αλλάζουμε  τον  γονέα  του  κόμβου 

στον τρέχον κόμβο και υπολογίζουμε εκ νέου τα αποτελέσματα g και f του κόμβου. 

(4)  Κυρίως  πρόγραμμα:  Θα ορίσουμε  το λαβύρινθο,  την  αρχική  και την  τελική  θέση. 

Στη συνέχεια θα χρησιμοποιήσουμε τη συνάρτηση αναζήτησης και εάν υπάρχει μια διαδρομή, 

τότε θα  μπορούμε να την τυπώσουμε με την συνάρτηση GetPath(). 

Πρώτον,  θα  δημιουργήσουμε  μια  κλάση  για  έναν  κόμβο  που  θα  περιέχει  όλα  τα 

χαρακτηριστικά που σχετίζονται με τον κόμβο όπως ο γονέας του κόμβου, η θέση του κόμβου