Αλγόριθµοι CSPs Κώδικας Μάθηµα Τεχνητής Νοηµοσύνης ΥΣ02 Χειµερινό εξάµηνο 2008-2009
CSPLIB Βιβλιοθήκη µε ρουτίνες για την επίλυση δυαδικών προβληµάτων ικανοποίησης περιορισµών http://ai.uwaterloo.ca/~vanbeek/software.h tml
Βασικές δοµές δεδοµένων και συναρτήσεις N: αριθµός µεταβλητών K: το µέγεθος του πεδίου ορισµού (θεωρούµε ίδιοµέγεθος για κάθε πεδίο ορισµού) current: µεταβλητή που περιέχει το νούµερο της τρέχουσας µεταβλητής v: µονοδιάστατος πίνακας µεγέθους Ν που περιέχει τις τρέχουσες αναθέσεις τιµών των µεταβλητών consistent(current): επιστρέφει 1 εάν η τρέχουσα ανάθεση τιµής είναι συνεπής µε τις προηγούµενες αναθέσεις ή 0 διαφορετικά check(i,j): επιστρέφει 1 εάν ο έλεγχος συνέπειας µεταξύ των v[i] και v[j] επιτύχει, διαφορετικά 0 solution(): επεξεργάζεται τη λύση που βρίσκεται στον πίνακα v και εάν µόνο µία λύση ζητείται τερµατίζει τον αλγόριθµο. empty(s): S = {}. add(x, S): προσθέτει το x στο σύνολο S. merge(s 1,S 2 ): S 1 := S 1 U S 2. max(s): επιστρέφει το µέγιστο στοιχείο του συνόλου S. Η κύρια συνάρτηση κάθε αλγορίθµου επιστρέφει την µεταβλητή (δηλαδή το νούµερο της µεταβλητής) που επιλέχθηκε ως σηµείο υπαναχώρησης
Χρονολογική υπαναχώρηση (Chronological Backtracking - BT) // για κάθε µία από τις προηγούµενες //µεταβλητές // έλεγξε εάν είναι συνεπής Προσοχή: έλεγχος συνέπειας σε σχέση µε τις ήδη αποτιµηµένες µεταβλητές // τέλος // για κάθε τιµή του πεδίου ορισµού // βάλε αυτήν την τιµή στονv // έλεγξε αν είναι συνεπής και αν ναι // συνέχισε µε τηνεπόµενη µεταβλητή
Επιπλέον δοµές και συναρτήσεις για τον πρώιµο έλεγχο domains: πίνακας ακεραίων µεγέθους Ν Κ. Κάθε στοιχείο του πίνακα δείχνει ποια µεταβλητή προκάλεσε αφαίρεση της τιµής αυτής από το πεδίο ορισµού της µεταβλητής, αλλιώς περιέχει 0. checking: πίνακας boolean µεγέθους Ν Ν, όπου η γραµµή δηλώνει τη µεταβλητή που αναθέτουµε τιµή και η στήλη δηλώνει τη µεταβλητή της οποίας πρέπει να αφαιρέσουµε κάποια τιµή από το πεδίο ορισµού. Αρχικά και οι δύο πίνακες µηδενίζονται. consistent(current): ελέγχει τη µεταβλητή current µε τιςεπόµενες µεταβλητές και επιστρέφει τη µεταβλητή η οποία έµεινε µε κενό πεδίο ορισµού διαφορετικά 0. restore(i): αναιρεί ό,τι ενέργεια είχε γίνει λόγω της ανάθεσης τιµής της µεταβλητής x i.
Πρώιµος έλεγχος I (Forward Checking - FC) // εάν αφαιρέσαµε τιµή από την //µεταβλητή j // για όλες τις τιµές που της //αφαιρέσαµε λόγωτης //µεταβλητής i της //ξαναπροσθέτουµε
Πρώιµος έλεγχος II (Forward Checking - FC) // εάν υπάρχει η τιµή στο πεδίο ορισµού // εάν δεν είναι συνεπής η τιµή // αφαίρεσέ την // και σηµείωσέ το // αφαιρέσαµε όλες τις τιµές και //άρα το πεδίο ορισµού µένει κενό
Πρώιµος έλεγχος IΙΙ (Forward Checking - FC) Προσοχή: έλεγχος συνέπειας σε σχέση µε τις µη αποτιµηµένες µεταβλητές // τέλος // για κάθε τιµή στοπεδίοορισµού // εάν η τιµή έχει αφαιρεθεί από το πεδίο // ορισµού αδιαφορεί για την τιµή αυτή // έλεγχος συνέπειας // εάν η τιµή είναισυνεπής // συνέχισε µε τηνεπόµενη µεταβλητή // αλλιώς αναίρεσε ό,τι έκανες
Επιπλέον δοµές και συναρτήσεις για την υπαναχώρηση µε άλµα max_check: πίνακας ακεραίων µεγέθους Ν. Κάθε στοιχείο του πίνακα δείχνει σε ποια µεταβλητή θα υπαναχωρήσουµε σε περίπτωση αδιεξόδου, αλλιώς περιέχει 0. conf_set: πίνακας ακεραίων µεγέθους Ν N. Κάθε γραµµή περιέχειτοσύνολο συγκρούσεων για κάθε µεταβλητή.
Υπαναχώρηση µε άλµα (Backjumping - BJ) // για κάθε µία από τις προηγούµενες //µεταβλητές // αν δεν είναι συνεπής // αν είναι συνεπής, θέλουµε //σηµείο υπαναχώρησης να //είναι το αµέσως προηγούµενο Αν δεν είναι συνεπής και είναι πιο κοντά στην τρέχουσα µεταβλητή κρατάµε αυτήτη µεταβλητήσ
Υπαναχώρηση µε άλµα II (Backjumping - BJ) // τέλος // αν το σηµείο υπαναχώρησης δεν είναι το // τωρινό τότε πήγαινε σε αυτό // αν δοκίµασες όλες τις τιµές // επέστρεψε το σηµείο υπαναχώρησης
Υπαναχώρηση µε άλµα κατευθυνόµενο από τη σύγκρουση I (Conflict-directed backjumping - CBJ) // άδειασε το conflict set της τωρινής µεταβλητής // αν το σηµείο υπαναχώρησης δεν είναι το // τωρινό τότε πήγαινε σε αυτό // σηµείο υπαναχώρησης το h // απορρόφηση του συνόλου // συγκρούσεων της current // από την h
Υπαναχώρηση µε άλµα κατευθυνόµενο από τη σύγκρουση II (Conflict-directed backjumping - CBJ) // πρόσθεσε το i στο σύνολο // συγκρούσεων και επέστρεψε