Προς το περιεχόμενο

Προτεινόμενες αναρτήσεις

Δημοσ.

Το πρόβλημά μου:

Θέλω να προσομοιώσω την κίνηση των ανθρώπων στο χώρο. Αυτό το κάνω με ένα πίνακα P που δείχνει αν υπάρχει άτομο στη θέση i,j με τα παρακάτω βήματα:

if P[j]==0 //αν δεν είναι κανείς στο i

  if P[i-1][j]==1 //αν είναι κάποιος στην προηγούμενη θέση

    P[j]=1// ο πίσω κάνει ένα βήμα

    P[i-1][j]=0

end if 

end if

(Αυτό είναι απλοποίηση, τα άτομα μπορούν να πάνε σε οποιδήποτε γειτονικό κελί, όχι μόνο δεξιά)

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

Δημοσ.

Ναι βέβαια,

Έχεις δύο ίδιους πίνακες, ο ένας λέει τις τωρινές θέσεις. Ξεκινάς τον υπολογισμό νέων θέσεων, γράφοντας στο άλλο πίνακα. Οπότε τη κίνηση του ανθρώπου στον Α πίνακα την ελέγχεις στον Β και αν το επιτρέπει ο Β την κάνεις. Στο τέλος γεμίζει ο Β με τις νέες θέσεις. Θα μπορούσαν οι παίκτες σου, οι άνθρωποι, να έχουν προτεραιότητες, ως προς την κίνηση. Η προτεραιότητα θα εμφανίζεται ως γρηγορότερη απόκριση-αντίδραση. Ο υπολογισμός του Β να γίνεται αφού πρώτα μπουν στις θέσεις χωρίς μετακίνηση οι αργοί, και μετά μπαίνουν σε νέες θέσεις, οι γρήγοροι. Όταν τελειώνει ο πίνακας Β αντιγράφεται στον Α, αυτό δεν το έγραψα πιο πάνω. Αν σε 5 ανανεώσεις κάποιοι κινήθηκαν τις 3 φορές, κάποιοι τις δύο, άλλοι και τις πέντε, τότε έχεις μια καλή προσομοίωση,γιατί αποφεύγεις τη σταθερή ταχύτητα, και η μη συμφασική κίνηση φαίνεται ως έλλογη, μη αυτοματοποιημένη.

Δημοσ.

M2000 σ' ευχαριστώ για την απάντησή σου, αλλά δεν νομίζω αυτό να λύσει το πρόβλημά μου. Για να το εξηγήσω με ένα παράδειγμα, έστω οτι έχουμε 3 άτομα στη σειρά να πηγαίνουν 1 βήμα δεξιά:

/*/*/*/ /

1ο βήμα: ο πρώτος βλέπει κενό, προχωράει, οι 2 πίσω βλέπουν πιασμένη θέση και μένουν ακίνητοι

/*/*/ /*/

2ο βήμα: ο πρώτος έχει φτάσει στο στόχο του και σταματάει, ο 2ος βλέπει κενό και προχωράει, ο 3ος βλέπει πιασμένη θέση και μένει ακίνητος

/*/ /*/*/

3ο βήμα: οι 2 πρώτοι έχουν φτάσει στο στόχο τους και έχουν σταματήσει, ο 3ος βλέπει κενό και προχωράει

/ /*/*/*/

 

Αυτό στην πραγματικότητα θα γινόταν σε ένα βήμα, αφού ο 2ος θα ξεκινούσε (σχεδόν) με τον πρώτο και ο 3ος (σχεδόν) με τον δεύτερο.

Δεν καταλαβαίνω πώς ο Β θα λύσει το πρόβλημα

Δημοσ.

Όπως το προσεγγίζεις δεν θα βρεις την λύση εύκολα.

 

Θέλεις τρία βήματα πριν κάνεις το update:

 

1) Να ρωτάς πού μπορεί να πάει ο κάτοικος του κελιού, όπου θα παίρνεις έναν array με indices (π.χ.) με τις δυνατές ΕΠΟΜΕΝΕΣ θέσεις

2) Να βρίσκεις τις θέσεις που ικανοποιούν την μετάβασή σου βάσει των indices που πήρες από το 1)

3) Να αποφασίζεις που θα πάει ο κάθε κάτοικος βάσει των θέσεων που έχεις πάρει για κάθε κάτοικο από το 1) και των αποφάσεων από το 2)

 

Μετά κάνεις το update.

 

 

Σε OO γλώσσα θέλεις:

 

1) Ένα grid

2) Cells

3) Κάτοικους

 

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

Δημοσ.

Ο Β πίνακας λύνει το πρόβλημα, ακόμα και τον συγκρούσεων. Ας υποθέσουμε ότι /*/*/*/ / ο Α είναι 4 θέσεων, με τρία άτομα. Ας υποθέσουμε ότι όλα θα κινηθούν (αν όχι βάζουμε τα ακίνητα στο Β από την αρχή). Υπολογίζουμε την νέα θέση για το κάθε άτομο και με την σειρά βάζουμε στον Β / /*/*/*/ αντιγράφουμε το Β στο Α. Η επόμενη "προβαλλόμενη" κίνηση είναι ο νέος Α.

Με OO, έχεις το πλεονέκτημα να κρατάς τις θέσεις έτσι ώστε να μπορείς σε μία θέση να έχεις πολλά άτομα. Αν αυτό θες να το απόκλείσεις, τότε βοηθάει ο πίνακας γιατί έχεις την πληροφορία σε ένα σημείο.

Δημοσ.

@OP

Πφφφ...

 

Ο Μ2000 πάλι χτύπησε.

 

 

Αυτό με τους δύο πίνακες είναι ό,τι θυμάται από τα εισαγωγικά στην C.

 

 

Μπορεί να γίνει με 1 πίνακα μία χαρά, ακόμα και σε C. Π.χ., ο πίνακας για κρατάει IDs στοιχείων αντί για "τιμές". Βασικά, τα IDs θα είναι τιμές.

 

Το μπίζιλο είναι στο πως θα κάνεις parse και θα αλλάξεις τις τιμές. Με 2 πίνακες λύνεται πολύ εύκολα γιατί απλά αντιγράφεις τιμές.

 

 

Τέλος, με ΟΟΡ έχεις πλεονεκτήματα αλλά εντελώς διαφορετικά από αυτά που λέει ο Μ2000.

 

 

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

Δημοσ.

Άσχετη η τελευταία προτροπή..σου Groot. Δεν μπορείς να είσαι στο μυαλό των άλλων και πώς εγώ θα χρησιμοποιούσα το OO. Ούτε εγώ στο δικό σου. Άρα δεν διαφωνώ με το τρόπο σου...για να τον λες έχεις κάποια βάση. Το ίδιο έχω και εγώ, οπότε όλα τα άλλα είναι περιττά. Ας καταλάβει πρώτα ο OP ότι σε αυτό που λέει ότι γίνεται με ένα βήμα, έχει σχέση με το τι βλέπουμε, όχι με το τι γίνεται. Στο τι γίνεται, ας είναι το οτιδήποτε. Στο τι βλέπουμε θέλουμε να είναι όλες οι κινήσεις, με την μία..

Δημοσ.

Γενικότερα μάλλον με ΟΟ θα το κάνω, καθώς κάθε θέση στο χώρο έχει και άλλες παραμέτρους που δεν ανέφερα για λόγους απλούστευσης . Επίσης κάθε θέση θα έχει μια προκαθορισμένη κατεύθυνση, οπότε κάθε κελί έχει μόνο 1 δυνατό επόμενο κελί. Δηλαδή groot μπορούμε να παραβλέψουμε τα βήματα στο 1ο σου post αν κατάλαβα τι εννοείς. Και Μ2000 ακόμα δεν έχω καταλάβει πώς ο 2ος πίνακας βοηθά στην κίνηση. Μπορείς να μου γράψεις τον αλγόριθμό σου βήμα βήμα ή να μου δώσεις ένα παράδειγμα?

Δημοσ.

O δεύτερος πίνακας γράφει την επόμενη κατάσταση, και ξεκινάει χωρίς τίποτα να είναι επάνω. Σκέψου δυο σκακιέρες, η μία έχει πιόνια και η άλλη δεν έχει. Η κίνηση θα γίνεται βάσει της Α στην Β. έτσι η Β θα πάρει όλα τα πιόνια της Α σε νέες θέσεις. Δεν έχει σημασία πως θα γράψεις σε κώδικα αυτό. Σημασία έχει να καταλάβεις, χωρίς καν κώδικα την διαδικασία. Σου έδωσα σε προηγούμενη ανάρτηση ένα πίνακα τεσσάρων θέσεων /1/2/3/4/ με πιόνια στα 1,2,3, έστω Α. Πάω λοιπόν στον πίνακα Β που έχει επίσης τέσσερις θέσεις. και κάνω το εξής Β(2)=Α(1), Β(3)=Α(2),Β(4)=Α(3). Έκανα τρεις κινήσεις ...αντιγράφω στον Α..και έχω στον Α τέσσερις θέσεις με καλυμμένες την 2,3,4 και κενή την 1, άρα τα τρία πιόνια μετακινήθηκαν "με την μία", γιατί δείχνω το Α() μόνο όχι το Β(). Δηλαδή βλέπεις το Α() ως /*/*/*/ / και μετά / /*/*/*/

έγινε κατανοητό; (δεν θέλω να γράψεις ναι ή όχι, αλλά πάρε ένα χαρτί κάνε 4 κουτάκια Α και 4 κουτάκια Β και κάνει την διαδικασία που περιγράφω)

Δημοσ.

Γενικότερα μάλλον με ΟΟ θα το κάνω, καθώς κάθε θέση στο χώρο έχει και άλλες παραμέτρους που δεν ανέφερα για λόγους απλούστευσης . Επίσης κάθε θέση θα έχει μια προκαθορισμένη κατεύθυνση, οπότε κάθε κελί έχει μόνο 1 δυνατό επόμενο κελί. Δηλαδή groot μπορούμε να παραβλέψουμε τα βήματα στο 1ο σου post αν κατάλαβα τι εννοείς. Και Μ2000 ακόμα δεν έχω καταλάβει πώς ο 2ος πίνακας βοηθά στην κίνηση. Μπορείς να μου γράψεις τον αλγόριθμό σου βήμα βήμα ή να μου δώσεις ένα παράδειγμα?

Αυτό που εννοείς ως "βήματα" είναι απλά ανάθεση αντικειμένων σε έναν vector σε κάθε κελί.

 

Π.χ., εάν έχεις το cell να έχει ένα member τύπου walker (κάτοικος, αυτός που θα περπατήσει) τοτε τα βήματα είναι ποιος walker θα πάει σε ποιο κελί.

 

Να γίνουν όλα μαζί, ταυτόχρονα, το ξεχνάς εάν δεν πας με κατανεμημένα συστήματά. Ακομα και σε multi threading, το μέγιστο θα μπορείς να ελέγξεις ταυτόχρονα τόσες κινήσεις όσοι οι πυρήνες σου.

 

Άρα από κάπου θα αρχίσεις να κοιτάς τι τρέχει στον πίνακά σου.

 

Επίσης, η κίνηση που λες θα γίνει βάσει κανόνων. Άρα, και εάν κάθε cell έχει μέσα του έναν και μόνο έναν walker, θες να βρεις το σετ μετακινήσεων που καλύπτει τους κανόνες σου.

 

Οπότε, μία λύση (π.χ.) θα ήταν να εργάζεσαι στις μελλοντικές τιμές και όχι σε αυτές που έχεις. Δηλαδή, εάν ένα cell είναι υπό επεξεργασία (δηλαδή, θα μπει ή θα βγει walker από μέσα) να απαντάει στο hasHabitant με βάσει την απόφαση που θα πάρει και όχι τι έχει τώρα. Οταν κάνεις την μετακίνηση, απαντάει κανονικά.

 

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

 

Εάν θέλεις την optimal λύση μετακίνησης (βάσει κανόνων που θα θέσεις), τότε θα πρέπει να λύσεις το πρόβλημα επιλογής θέσεων για όλους τους walkers ταυτόχρονα.

Δημοσ.

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

 

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

  1. Έστω υποψήφιο άτομο Χ και κατεύθυνση κίνησης δεξιά.
  2. Υπάρχει άλλο άτομο Υ στα αριστερά του Χ; Αν ναι, Χ = Υ και πήγαινε στο 1.
  3. Έστω Ζ = Χ.
  4. While στα δεξιά του Ζ υπάρχει άλλο άτομο Ζ', Ζ = Ζ'.
  5. Όλα τα άτομα στην ευθεία από το Χ μέχρι και το Ζ κάνουν ένα βήμα δεξιά (αν μάλιστα τα άτομα δεν έχουν καμία ιδιότητα που να τα διαφοροποιεί, μπορείς απλά να "τηλεμεταφέρεις" το Χ στα δεξιά του Ζ και τελείωσες).

Το πρόβλημα είναι τι γίνεται όταν

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

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

Δημοσ.

Γενικότερα μάλλον με ΟΟ θα το κάνω, καθώς κάθε θέση στο χώρο έχει και άλλες παραμέτρους που δεν ανέφερα για λόγους απλούστευσης . Επίσης κάθε θέση θα έχει μια προκαθορισμένη κατεύθυνση, οπότε κάθε κελί έχει μόνο 1 δυνατό επόμενο κελί. Δηλαδή groot μπορούμε να παραβλέψουμε τα βήματα στο 1ο σου post αν κατάλαβα τι εννοείς. Και Μ2000 ακόμα δεν έχω καταλάβει πώς ο 2ος πίνακας βοηθά στην κίνηση. Μπορείς να μου γράψεις τον αλγόριθμό σου βήμα βήμα ή να μου δώσεις ένα παράδειγμα?

 

Βασικα εχεις λαθος βαση. Ενω ολες οι σχεσεις σου ειναι πανω στις θεσεις, εσυ εχεις βαλεις ολες τις σχεσεις στο χωρο.

 

Σκεψου λιγο, γιατι να εχεις ενα grid το οποιο θα σκαναρεις για να δεις που ειναι οι θεσεις, ενω ηδη ξερεις που ειναι θεσεις;

 

Μια λιστα θες που θα εχει μονο τις θεσεις. Η οποια θα σορταρεται με την αποσταση της καθε θεσης (πυθαγορειο)

Δημοσ.

Εδώ είναι ένα πρόγραμμα, το Φιδάκι, που έχω γράψει και παίζει σε Μ2000. Υπάρχει πίνακας θέσεων και σε ορισμένες θέσεις η επόμενη θέση δεν είναι μία αλλά μια σειρά θέσεων.

 

Υπάρχει και το φιδάκι 2 που έχει επιπλέον τον κανόνα ότι αν το ζάρι δεν πάει το πιόνι ακριβώς στο τέρμα, το γυρίζει πίσω.

 

Κάθε στοιχείο πίνακα είναι ένα αντικείμενο με ένα πίνακα, με την...τροχιά, για ένα ή περισσότερα βήματα. Η ρουτίνα που στήνει την οθόνη,υπολογίζει αυτόματα ενδιάμεσα καρέ για να κάνει πιο ομαλή την κίνηση. Αυτά δεν χρειάζονται στην τροχιά. Επειδή παίζουν 4 πιόνια, έχω 4 offset ώστε να περνάει ένα πιόνι δίπλα από άλλα, και πότε από την ίδια θέση. Όμως αυτός που βλέπει το παιχνίδι...δεν το καταλαβαίνει..Απλά βλέπει όλα τα πιόνια να περνούν από όλες τις θέσεις, τις θέσεις σαν κουτιά.

  • 2 εβδομάδες αργότερα...
Δημοσ.

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

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...