La moyenne mobile/total de l'algorithme
J'ai besoin de garder une trace des 7 derniers jours heures de travail en un fichier à plat de la lecture de la boucle. Il est utilisé pour mesurer "fatigueability" des équipes de travail.
Droit maintenant, j'ai quelque chose qui fonctionne, mais il semble assez bavard et je ne suis pas sûr qu'il y a un modèle qui est plus concis.
Actuellement, j'ai une classe Java avec un tableau statique de tenir les x derniers jours des données, puis comme je l'ai lu dans le fichier, j'ai couper le premier élément et déplacez les 6 autres (pour une semaine de roulement total) en arrière par un. Le traitement de ce tableau statique est fait dans sa propre méthode ie.
/**
* Generic rolling average/total method. Keeps adding to an array of
* last 'x' seen.
* @param d Datum point you want to add/track.
* @param i Number of rolling periods to keep track of eg. 7 = last 7 days
* NOT USED AT MOMENT DURING TESTING
* @param initFlag A flag to initialize static data set back to empty.
* @return The rolling total for i periods.
*/
private double rollingTotal(double d, boolean initFlag) {
//Initialize running total array eg. for new Employyes
if (initFlag) {
runningTotal = null;
}
else {
//move d+1 back to d eg. element 6 becomes element 5
for (int x = 0; x< 6 ; x++) {
runningTotal[x] = runningTotal[x+1];
}
//Put current datum point at end of array.
runningTotal[6]= d;
}
//Always return sum of array when this method is called.
double myTotal = 0.0;
for (int x = 0; x<7; x++) {
myTotal+= runningTotal[x];
}
System.err.print(Arrays.toString(runningTotal)+ '\n' );
return myTotal;
}
Ma question: est-ce raisonnable approche de la conception, ou est-il quelque chose évidentes et simples à réaliser cette tâche?
Merci les gars
OriginalL'auteur Pete855217 | 2011-08-30
Vous devez vous connecter pour publier un commentaire.
Je dirais que l'utilisation d'une file d'attente et de pousser la nouvelle et de la pop à l'ancienne. Pour garder une trace de la moyenne, vous pouvez aussi juste soustraire le sauté de la valeur de la course totale et l'ajout de la nouvelle (vous auriez besoin d'un statique ou variable d'instance ou de passer la vieille somme). Pas besoin d'accéder au reste des éléments. Aussi, où est runningTotal en cours d'initialisation sinon à quand le initFlag est vrai?
Je crois que la File d'attente est abstraite, de sorte que vous aurez besoin de comprendre à la mise en œuvre d'utilisation. Je suggère une liste liée basée sur un.
Merci beaucoup les gars: j'ai le message: utilisation d'un objet de niveau supérieur et d'exploiter les méthodes pertinentes ou d'un tampon circulaire. De grandes réponses, tous. Quand vous pensez à ce sujet, vous avez toujours besoin d'accéder à l'ensemble de la matrice de sorte que vous pouvez vous débarrasser de cette première entrée - dont je n'étais pas sûr à 100% de moi-même. Je suis soulagé que je n'avais pas raté quelque 1 liner et a été pour l'essentiel sur l'raisonnable, si pas efficace et laconique de la piste! C'est ce que j'aime à propos de ce site: de haute qualité, des réponses pertinentes à partir de personnes qui connaissent leur sh*t.
runningTotal est arriver initialisé dans le fichier principal de boucle de traitement que le fichier atteint de nouveaux employés.
Ne seront pas retournés total serait faux si initFlag est vrai?
oui, vous avez raison, il a besoin de réglage et de revenir à zéro (bien que le code principal logique poignées ie. ignorer la valeur de retour dans le cas où le initFlag est vrai);
OriginalL'auteur Kevin
Qui fonctionne certes, mais vous êtes en train de faire un peu plus de travail que vous avez à. Vous pouvez éviter de déplacer toutes les données autour, et vous pouvez le configurer de sorte que le calcul de la prochaine total est une question de soustraire la valeur la plus ancienne, et l'ajout de la nouvelle valeur.
Par exemple:
Il utilise une mémoire tampon circulaire et maintient la
currentTotal
de sorte qu'il est toujours disponible.OriginalL'auteur Jim Mischel
Vous pouvez essayer en utilisant un tampon circulaire au lieu de déplacer toutes les données à chaque ajout:
Donc
nextIndex
est toujours pointant vers le plus ancien système de référence géodésique. Vous pouvez toujours la somme du début à la fin comme avant.Vous aurez à stocker les nextIndex dans le fichier texte; je pense que ce n'est pas une meilleure approche de la conception, comme la question posée.
OriginalL'auteur JCooper
Il serait plus facile d'utiliser une liste de tableaux au lieu d'un tableau. Ensuite, vous pouvez simplement utiliser
OriginalL'auteur mamboking
Vous pouvez utiliser un pondération exponentielle de moyenne mobile. Assez long à écrire, mais le code est insignifiante en comparaison. Il tend à donner des résultats plus lisses.
Note: ceci est une version optimisée de la formule
Dans ce cas, la formule est plus précis et, comme l'alpha ne change pas la surcharge de
Math.exp
n'est pas important. Si alpha peut changer, et est généralement faible, je suggère l'utilisation de la première formule.En dehors de l'initialisation de la valeur à la première valeur à la place de 0, la formule est la même.
le même qui est après que j'ai résolu en changeant le
-
à un+
Merci pour ramasser que c'était mal.Oui, j'ai compris plus tard et a terminé avec votre version corrigée. 🙂
si alpha n'est pas petite, j'ai ajouté une formule qui est plus précis, mais plus lent. Remarque: si la formule était bon, le nom
ALPHA
était incorrecte. J'ai corrigé maintenant.OriginalL'auteur Peter Lawrey
Pourquoi avez-vous initialiser
runningTotal
à null? Quel est son type? Où il est déclaré? Il serait bien si vous mettez un peu d'exemples de code qui ressemblent réelle de code Java.De passer, ma critique serait la suivante: votre fonction n'est de trop. Une fonction ou une méthode, doit être cohérente. De façon plus appropriée, ils doivent faire une chose et une chose seulement.
Pire encore, ce qui se passe dans votre boucle lorsque x = 5? Vous copiez
runningTotal[6]
enrunningTotal[5]
, mais ensuite vous avez deux copies de la même valeur à la position 5 et 6.Dans votre conception, votre fonction
Il en fait trop.
Ma première suggestion est de ne pas déplacer des choses autour de la matrice. Au lieu de cela, mettre en œuvre un tampon circulaire et de l'utiliser à la place du tableau. Il permettra de simplifier la conception de votre. Ma deuxième suggestion est de briser les choses en fonctions de la cohésion:
C'est ce que je ferais 🙂
Hmmm, ce n'est pas la perfection, mais à propos de établi des pratiques industrielles que nous avons pour les 3 dernières décennies. Un code propre est toujours celui qui est partitionné. Nous avons des décennies d'éléments de preuve indiquent que c'est la voie à suivre dans le cas général (en termes de coût-efficacité, la réduction des défauts, de la compréhension, etc)... sauf c'est jeter de code pour un seul type de la chose. Il n'est jamais coûteuse pour ce faire, lorsque l'on démarre une analyse du problème de cette manière. Codage 101, décomposer le problème et le code qui suit, ni excessif ni difficile 😉
OriginalL'auteur luis.espinal
Votre tâche est trop simple et l'approche que vous avez adopté est certainement une bonne chose pour l'emploi. Cependant, si vous souhaitez utiliser un meilleur design, vous devez vous débarrasser de tout ce que le numéro de mouvement; vous feriez mieux d'utiliser une file d'attente FIFO et faire bon usage de méthodes push et pop; de cette façon, le code de l'habitude de refléter toutes les données de mouvement, tout les deux actions logiques de "nouvelles données" et "supprimer les données de plus de 7 jours".
OriginalL'auteur daniloquio