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

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

Δημοσ.

Καλησπέρα παιδιά.

 

Θέλω να μάθω αν υπάρχει κάποιος τρόπος να καταλάβω αν μια τιμή/μεταβλητή μέσα σε μία loop αλλάζει κατά λίγο ή και καθόλου για έναν μεγάλο αριθμό επαναλήψεων.

 

Για παράδειγμα τρέχω μία μαθηματική συνάρτηση που αλλάζει την τιμή μιας μεταβλητής μέσα σε ένα while(). Θέλω να σταματήσει το while όταν για τις τελευταίες 500 επαναλήψεις η μεταβλητή άλλαξε απειροελάχιστα σε κάθε loop ή στην χειρότερη έμεινε η ίδια. Δεν γνωρίζουμε ούτε την μέγιστη τιμή που μπορεί να πάρει ούτε την ελάχιστη. 

 

Το φαντάζομαι σαν να φτάνει σε ένα όριο (το μαθηματικό lim(x) ) χωρίς να ξέρουμε το x όμως. 

 

Πως θα γίνει αυτό σε php? Ευχαριστώ

Δημοσ.

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

 

Χοντρικά:

accuracy = 1e-6;

x_prev = function();

while (1) {

    x_curr = function();
    
    if (fabs(x_prev - x_curr) < accuracy)
        break;

    x_prev = x_curr;
}

Δημοσ.

Θα βάλεις μια μεταβλητή $stableRun ή κάπως έτσι που αντιπροσωπεύει τον αριθμό των συνεχόμενων επαναλήψεων κατά τον οποίο η τιμή δεν άλλαξε "αρκετά". Τα υπόλοιπα έρχονται μόνα τους, μέσα στο loop θα λες πχ

 

if (άλλαξε αρκετά) {

$stableRun = 0;

}

else if (++$stableRun == 500) {

break;

}

Δημοσ.

Θα βάλεις μια μεταβλητή $stableRun ή κάπως έτσι που αντιπροσωπεύει τον αριθμό των συνεχόμενων επαναλήψεων κατά τον οποίο η τιμή δεν άλλαξε "αρκετά". Τα υπόλοιπα έρχονται μόνα τους, μέσα στο loop θα λες πχ

 

if (άλλαξε αρκετά) {

$stableRun = 0;

}

else if (++$stableRun == 500) {

break;

}

 

Και εγώ κάτι τέτοιο σκεφτόμουν αλλά το θέμα μου είναι το "άλλαξε αρκετά".

Πως θα καταλάβω ότι η τιμή άλλαξε αρκετά ή ότι δεν άλλαξε καθόλου?

 

Πχ για 10 επαναλήψεις ο αριθμός μπορεί να πάει:

 

1 - 5 - 8 - 9 - 9.5 - 9.7 - 9.82 - 9.875 - 9.901 - 9.924 - 9.932

 

Πως θα καταλάβω εδώ ότι μετά το 9.82 πχ για εμένα η μεταβλητή δεν αλλάζει αρκετά, οπότε ξεκίνα να αυξάνεις το $stableRun ?

Οι αριθμοί αυτοί είναι τελείως random. Στην εφαρμογή δεν θα είναι σταθεροί.

Δημοσ.

Βάζεις ένα accuracy όπως έγραψε ο gon1332. Εσύ δηλαδή λες πόσο είναι αυτό το "αρκετά".

 

Ο gon1332 υπολογίζει μόνο την προηγούμενη τιμή και όχι για 500 επαναλήψεις όμως... 

 

και το accuracy δεν το γνωρίζω εκ των προτέρων.

 

  • πχ1. Αν στην αρχή η τιμή αυξάνεται κατά εκατομμύρια, αν για τις 500 επαναλήψεις αλλάζουν οι εκατοντάδες ή δεκάδες, πάει να πει ότι αλλάζει λίγο.
  • πχ2. Αν στην αρχή η τιμή αυξάνεται κατά μία μονάδα, αν για τις 500 επαναλήψεις αλλάζει το 5ο ή 6ο δεκαδικό ψηφίο, τότε αλλάζει λίγο.

Το πόσο άλλαξε δηλαδή είναι κάτι σχετικό. Εκτός αν δεν κατάλαβα εγώ κάτι  :huh:  :huh:

Δημοσ.

Ο gon1332 υπολογίζει μόνο την προηγούμενη τιμή και όχι για 500 επαναλήψεις όμως... 

 

και το accuracy δεν το γνωρίζω εκ των προτέρων.

 

  • πχ1. Αν στην αρχή η τιμή αυξάνεται κατά εκατομμύρια, αν για τις 500 επαναλήψεις αλλάζουν οι εκατοντάδες ή δεκάδες, πάει να πει ότι αλλάζει λίγο.
  • πχ2. Αν στην αρχή η τιμή αυξάνεται κατά μία μονάδα, αν για τις 500 επαναλήψεις αλλάζει το 5ο ή 6ο δεκαδικό ψηφίο, τότε αλλάζει λίγο.

Το πόσο άλλαξε δηλαδή είναι κάτι σχετικό. Εκτός αν δεν κατάλαβα εγώ κάτι  :huh:  :huh:

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

 

Επίσης γνωρίζεις ότι υπάρχει κάπου σύγκλιση; Για να το καταλάβεις, κάνε αυτό που σου είπα συν μηδένιζε τον μετρητή σου όταν είσαι εκτός accuracy και την πρώτη φορά που θα ξεκινήσεις να μετράς διαδοχικές κράτα τον αριθμό επανάληψης. Επίσης θέσε κι έναν timer. Αν χτυπήσει κουδουνάκι και

 

(αριθμός διαδοχικών επαναλήψεων) < (αριθμός επαναλήψεων - αριθμός επανάληψης που πετύχαμε accuracy)

 

τότε δε συγκλίνει. Διαφορετικά συγκλίνει.

Δημοσ.

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

 

Του defacer θα το χρησιμοποιούσα ούτως ή άλλος, αλλά με κάπως διαφορετικό τρόπο για την εφαρμογή μου. 

Και μάλλον θα το παλέψω και με τον τρόπο που μου είπες εσύ, αφού τρέξω πολλά πειράματα και καταλήξω σε κάποιο accuracy. Απλά φοβάμαι πάρα πολύ το infinite loop ή τις τρελές επαναλήψεις, σε περίπτωση που βάλω μικρό accuracy ή και το αντίστροφο.

 

Ευχαριστώ πολύ

Δημοσ.

Απλά φοβάμαι πάρα πολύ το infinite loop ή τις τρελές επαναλήψεις, σε περίπτωση που βάλω μικρό accuracy ή και το αντίστροφο.

 

Ευχαριστώ πολύ

Κοιταξε παραπάνω. Έκανα edit. Δεν έχεις να φοβάσαι τα πολλά loops αν βάλεις όριο (πχ 500).

 

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

Δημοσ.

Κοιταξε παραπάνω. Έκανα edit. Δεν έχεις να φοβάσαι τα πολλά loops αν βάλεις όριο (πχ 500).

 

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

 

Οκ το έπιασα, θα κάνω μπόλικα πειράματα και αναλόγως βάζω κάτι καρφωτά. Θα ήθελα κάτι πιο γενικό βέβαια αλλά it's ok  :-)

Δημοσ.

Κι ο kagelos πρότεινε κάτι που θα μπορούσε να αντικαταστήσει τη διαφορά. Απλά και πάλι πρέπει να το συγκρίνεις με κάποιο accuracy.

Δημοσ.

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

 

Δεν ξέρω αν σε εξυπηρετεί αλλά αυτό που θα έκανα εγώ είναι να πάρω το standard deviation από την αρχή πχ από τις πρώτες 10 αλλαγές και να το συγκρίνω κάθε φορά με τις 10 τελευταίες ελέγχοντας αν αποκλεινει λιγότερο από ένα ποσοστό, τότε το κοβω.

 

Αυτό το οποίο θα αποφασίσεις είναι το ποσοστό οπότε παίζεις μπάλα ανεξαρτήτως τάξης μεγέθους.

 

εδιτ: διορθώθηκε το λουκ ήταν  απο κιν.

Δημοσ.

Όχι παιδιά νομίζω το χάσαμε το νόημα. Ο συνδυασμός του defacer με την σύγκλιση στο edit του gon νομίζω είναι σωστή. Ευχαριστώ.

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

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

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

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

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

Σύνδεση

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

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