bnvdarklord Δημοσ. 18 Ιουνίου 2011 Δημοσ. 18 Ιουνίου 2011 Φτιάχνω ενα NPuzzleSolver για μια εργασία, και διατηρεί δύο Λίστες για να λύσει το puzzle. Αρχικά είχα List, και αποφάσισα να βάλω στην μία HashSet, αφού υλοποίησα την getHashCode και Equals για τα states του puzzle. Αυτό το κανω ωστε να γλιτώσω τις γραμμικές αναζητίσεις... Το περίεργο που σημβαίνει είναι ότι με την List για καποιο puzzle χρειάζεται ~35000 βήματα και το λύνει, ενώ με το HashSet κανει ~65000 βήματα και βρίσκει την ίδια λύση. Γιατι συμβαίνει αυτό; Υποπτευομαι οτι το λαθος ειναι στην getHashCode. Το καθε state εχει ενα array που αναπαριστά τον πίνακα, και εχω βαλει το HashCode του πινακα για HashCode του state.
DeltaLover Δημοσ. 18 Ιουνίου 2011 Δημοσ. 18 Ιουνίου 2011 Φτιάχνω ενα NPuzzleSolver για μια εργασία, και διατηρεί δύο Λίστες για να λύσει το puzzle. Αρχικά είχα List, και αποφάσισα να βάλω στην μία HashSet, αφού υλοποίησα την getHashCode και Equals για τα states του puzzle. Αυτό το κανω ωστε να γλιτώσω τις γραμμικές αναζητίσεις... Το περίεργο που σημβαίνει είναι ότι με την List για καποιο puzzle χρειάζεται ~35000 βήματα και το λύνει, ενώ με το HashSet κανει ~65000 βήματα και βρίσκει την ίδια λύση. Γιατι συμβαίνει αυτό; Υποπτευομαι οτι το λαθος ειναι στην getHashCode. Το καθε state εχει ενα array που αναπαριστά τον πίνακα, και εχω βαλει το HashCode του πινακα για HashCode του state. Μπορεις να ποσταρεις το κωδικα?
bnvdarklord Δημοσ. 18 Ιουνίου 2011 Μέλος Δημοσ. 18 Ιουνίου 2011 Ολο τον κώδικα λιγο δύσκολο. Το state ειναι περίπου ετσι >class PuzzleState { private int[] puzzle; private int hash; ... public PuzzleState(...) { ... hash = puzzle.getHashCode(); } .... public override int getHashCode() { return hash; } } Και στον αλγοριθμο χρησιμοποιώ Add, Remove και Contains, οπως και στην List.
bnvdarklord Δημοσ. 19 Ιουνίου 2011 Μέλος Δημοσ. 19 Ιουνίου 2011 Να προσθέσω ότι δοκίμασα πριν λιγο ενα puzzle που δεν εχει λύση. Αν βαλω List βγάζει οτι δεν εχει λύση, ενώ αν βάλω HashSet πέφτει σε ατέρμον βρόγχο. Εντωμεταξυ Add, Remove και Contains δουλευουν σε δοκιμες που εκανα σε HashSet.
bnvdarklord Δημοσ. 20 Ιουνίου 2011 Μέλος Δημοσ. 20 Ιουνίου 2011 Υπάρχει λάθος στο getHashCode τελικά. Δύο ίδια states μου βγάζουν διαφορετικό hash, ενώ οι πινακες που περιέχουν εχουν τα ιδια στοιχεια.(και το hash του state ειναι array.getHashCode). edit: Το ελυσα. Απο οτι φαινεται το Array.getHashCode δεν ειναι overriden οποτε εβγαζε τυχαιες τιμες καθε φορα. Μετατρέποντας τον πίνακα σε string και πέρνοντας το hash του string δουλεψε.
παπι Δημοσ. 20 Ιουνίου 2011 Δημοσ. 20 Ιουνίου 2011 Δηλαδη αυτο που ηθελες ειναι να κανεις compare δυο array; Αν ναι γιατι δεν χρησιμοποιεις την SequenceEqual (linq)
bnvdarklord Δημοσ. 20 Ιουνίου 2011 Μέλος Δημοσ. 20 Ιουνίου 2011 Οχι ηθελα να βρω αν υπαρχει ενα array σε μια λιστα με arrays. Ο A* αλγοριθμος που κανω διατηρει λιστες με τα states, και πρεπει να αγνοώ νεα states αν υπαρχουν σε αυτες. Με το list ειχα σειριακή αναζητηση, οποτε εβαλα HashSet στην μια list, και τωρα το λυνει 3 φορες ταχύτερα.
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.