web-dev-qa-db-fra.com

Meilleur algorithme pour trier les tâches par les priorités par un humain

J'ai développé un outil de gestion des tâches. Et certaines listes de tâches peuvent être très importantes. (J'ai moi-même plus de 300 tâches à faire).

J'aimerais faire un peu critiques de tâches de temps en temps car les tâches s'accumulent pour pouvoir Triez-les par priorité.

J'imagine présenter des tâches 2 par 2 à l'utilisateur et lui demander quelle tâche est plus importante que l'autre. Répétez la répétition jusqu'à ce que toutes les tâches soient triées.

Noter que:

  • L'algorithme doit être "arrêté résistant": l'utilisateur peut abandonner l'examen lorsqu'il souhaite et le résultat des tri précédents ne serait pas perdu.
  • Les tâches ont déjà un rang initial déjà défini par l'utilisateur à la main qui représente la priorité.

Mes questions sont

  1. Quel est le meilleur algorithme qui réduit le nombre de comparaison nécessaire pour trier toutes les tâches?
  2. Avez-vous une meilleure stratégie à proposer (ou à présenter les tâches et les questions) afin d'accélérer ces critiques?

éditer 1

Merci beaucoup pour tous ces commentaires!

Pour répondre à quelques questions:

  • Oui, chaque tâche a des responsables et chaque responsable peut commander toutes les tâches (mille leurs).
  • Nous avons déjà des tags, mais une analyse des tâches est là pour déterminer les priorités entre elles. Je conviens que les priorités peuvent également être définies par des fonctionnalités et au niveau de la tâche.
  • Je ne veux pas avoir un arbre de tâches classées par des fonctionnalités et perdez la liste des plats. Je préfère un arriéré plat avec des tâches marquées. Il est parfois très utile de prioriser une tâche appartenant à une fonctionnalité pas si importante placée plus tard dans la file d'attente.
  • Je me rends compte que je suis peut-être concentré sur ce problème sur le niveau logiciel (demandant un algorithme), mais ma question appartient peut-être davantage à un groupe de gestion de projet. Je me demande par exemple comment les réunions d'examen agiles ont lieu.

éditer 2

Plus je pense à cela et qu'est-ce que mon objectif est (poser cette question de cet algorithme), est que je veux nous amuser à faire la révision des tâches.

L'objectif ultime est de garder les tâches commandées par la priorité. Mais il est insuffisant de passer en revue les tâches. J'aimerais avoir une interface sexy lorsque des tâches sont présentées et que l'utilisateur pourrait jouer en effectuant son avis. La partie sexy/jouer est à moi, mais j'ai du mal à trouver un moyen de présenter des tâches logiquement (algorithmiquement), puis de les commander, donnant ainsi que l'utilisateur peut arrêter ce processus à tout moment.

Dis que je présente 2 tâches aléatoires et que l'utilisateur dit que B est plus important que A et s'arrêter là-bas. Alors quoi? Cela signifie-t-il que je mettez simplement à jour le rang à b.rank = A.RANK - 1 (plus important c'est important). Et pourquoi au hasard au fait? Y a-t-il une chose logiquement à faire là-bas? Vous voyez, je ne sais pas comment procéder.

éditer

J'ai reçu beaucoup d'informations et je profiterai grandement de tous, alors un grand merci à vous tous.

8
MickaelFM

Type de godet

Mais je deviens de l'avance sur moi-même.

Considérez les cas d'utilisation de la liste et de tri des tâches comme celle-ci.

  • Un dev complété une tâche et doit savoir quoi travailler sur la prochaine
  • Un chef de projet doit estimer une date de livraison
  • Un client/intervenant doit être assuré que leurs demandes sont très importantes pour vous

Les trois personnes ne se soucient vraiment que de la partie supérieure de la liste. Vous devez également estime que la liste est susceptible de changer au fil du temps car les choses sont ajoutées naturellement, le client à demander une fonctionnalité à gauche (en faisant des demandes de propositions) ou de nouvelles fonctionnalités subsumées de plus anciennes demandes. Au moment où vous arrivez à des articles 170-175, les travaux autour d'eux auront changé de manière significative, il n'ya donc pas beaucoup de point dans leur ordre exact. Vous pouvez commencer à faire cela quand ils se retrouvent dans le top 20-30.

Voici comment éviter les problèmes décrits ci-dessus. Commencez avec un type de godet. Définir plusieurs catégories différentes d'importance relative; Les couleurs fonctionnent bien ici. Évitez de les nommer avec des mots chargés émotionnellement tels que "critiques" ou "important", car tout le monde veut que leurs demandes soient "importantes", et cela obligera les notes. Au lieu de cela, utilisez des descriptions larges ou des éléments canoniques comme points de rupture. Une bonne catégorie de haut niveau pourrait être "Perte de données, corruption, vol ou mauvaise représentation". Si vous utilisez des éléments canoniques en tant que points de décision, vous pouvez utiliser des points réels ou généralisés comme "les nouvelles icônes sont un pixel trop étroit, donc les coussinez-les dans CSS pour compenser".

Ensuite, utilisez vos nouvelles normes pour regrouper les billets en grappes approfondies d'importance relative. En termes de tri, il est similaire à utiliser un tri rapide avec sept pivots prédéfinis. Vous finissez par faire au plus trois comparaisons, mais après les premières rares que votre équipe aura probablement une personne suggère une catégorie initialement et discuter de là.

Une fois que vous avez une catégorisation de base, vous devez avoir zéro d'éléments dans votre catégorie supérieure et un petit nombre dans votre deuxième catégorie. Si vous avez plus de zéro d'éléments dans votre catégorie supérieure, arrêtez ce processus de tri immédiatement et travaillez sur ces éléments.

Ensuite, vous pouvez également soustraire le premier groupe d'éléments non vides de toute méthode préférée. Répétez la répétition avec le groupe suivant si nécessaire jusqu'à ce que vous puissiez satisfaire toutes les trois points de bullet au sommet de cette réponse. Tout plus éloigné et que vous perdez probablement votre temps.

6
Joel Harmon

Pour 300 tâches, vous auriez besoin de poser des milliers de questions. Personne ne va faire cela, et même s'ils faisaient les résultats ne seraient pas très utiles.

Pour des situations comme ceci, je vous suggérerais de rester avec les demandeurs qui assignent simplement un facteur d'importance à chacune de leurs demandes. Si vous avez des utilisateurs concurrents, le logiciel peut également avoir un facteur d'importance utilisateur caché qui pèse sa propre importance de chaque demandeur.

Mais si les utilisateurs peuvent déjà affecter des poids à leurs demandes, pourquoi ne pas simplement les laisser changer ces poids quand ils le souhaitent. Donnez-leur des outils qu'ils peuvent utiliser pour répondre à leurs besoins et il n'y aura pas besoin d'évaluations de tâches programmées.

Et ne laissez pas votre système (ou les utilisateurs) confondre la "importance" et "urgence". Par exemple, l'achat d'un cadeau d'anniversaire pour votre conjoint pourrait être très important, mais si leur anniversaire n'est pas pendant 6 mois, il n'est pas urgent. De même "Venez ici et regardez ce que ce gars à travers la rue fait" est très urgent (il cessera de le faire bientôt et vous manquerez), mais ce n'est vraiment pas important.

METTRE À JOUR:

C'est exactement ce qui existe déjà. Les rangs dont je parlais sont donnés par l'utilisateur, de réorganiser des tâches par glisser-déposer. Mais imaginez que vous en avez 300. Vous ne les regardez jamais vraiment tous. Nous devons aider les utilisateurs à faire un examen de toutes les tâches.

Si les demandeurs peuvent déjà conserver leurs propres listes, je ne vois pas quel est le problème réel que vous essayez de résoudre.

Si le demandeur ne se souvient pas ou se souciait de quelque chose qu'ils demandaient, cela n'a pas vraiment d'importance? Personne ne peut légitimement se plaindre que vous ne travailliez pas sur quelque chose qu'ils ont ressenti devraient être en position de file d'attente 300.

Peut-être:

  • Toute demande qui n'a pas eu d'activité au cours des 6 derniers mois (ou une autre période plus appropriée) devrait générer un message de courrier rappelant au demandeur qu'il peut augmenter sa priorité ou prendre sa retraite de la demande. (Le message serait considéré comme "activité" et réinitialiser l'horloge.)
  • Créez une priorité particulière la plus basse pour laquelle ces messages ne sont jamais envoyés. Cela pourrait être utilisé pour les articles créés simplement pour enregistrer des bugs mineurs, des ennuis, des améliorations suggérées, etc., qui ne sont pas assez sérieux pour passer des efforts maintenant, mais qui devraient être considérés comme la prochaine fois que le logiciel spécifique a été effectué. à cela.
3
Ray Butterworth

L'algorithme devrait réduire le nombre de comparaisons, mais aussi l'heure d'accès: lorsque l'utilisateur découvre une tâche, il faut du temps pour le lire et la récupération de la mémoire à propos de cette tâche. Ainsi, lorsque l'utilisateur a sélectionné le plus important de deux tâches, vous pouvez conserver la tâche gagnante pour le tour suivant. Un avantage de cette méthode est que les tâches les plus importantes seront bien triées, tandis que les moins importants resteront plus longtemps dans un ordre aléatoire: c'est génial, car les tâches moins importantes seront mises en œuvre plus tard, et les choses auront changé d'ici là.

Une autre façon de réduire le temps d'accès serait de montrer 5 tâches à la fois au lieu de 2 et de demander de trier ces 5 tâches.

Et puisque vous dites que vous voulez vous amuser, peut-être que cela devrait parfois être 5, parfois 2, les trier parfois, choisissant parfois le plus important, parfois le moins important. Cela peut rendre le processus moins répétitif.

1
Alexis Ruyant

En pratique, vous ne triez pas 300 tâches simplement par la priorité.

Les tâches sont liées ou non liées. Il est généralement plus efficace de gérer les tâches liées aux tâches non liées. Vous voudriez donc effectuer des tâches connexes ensemble. Aussi avoir un sujet géré complètement au lieu de bits et de morceaux aléatoires.

Ceci est beaucoup mieux traité manuellement.

1
gnasher729

1 Quel est le meilleur algorithme qui réduit le nombre de comparaison nécessaire pour trier toutes les tâches?

Strictement parlant, le tri de la fusion est difficile à battre.

2 Avez-vous une meilleure stratégie à proposer (ou à présenter les tâches et questions) afin d'accélérer ces critiques?

Oui, arrêtez d'empiler des tâches inachevées! 300 est ridicule. Décomposer votre problème dans des fonctionnalités pouvant être complétées. Tâche d'une seule fonctionnalité. Faire une fonctionnalité. Ne négligez pas l'ensemble de l'éléphant avant de manger.

Plus de planification vous permet d'échouer, car il étrangle votre capacité à apprendre en fonction de votre projet. Votre conception devrait devenir plus intelligente comme vous allez.

1
candied_orange

Au lieu de présenter 2 tâches à l'utilisateur pour hiérarchiser, vous pouvez fournir une option à l'utilisateur dans lequel l'utilisateur peut afficher la liste de toutes les tâches et dispose d'une option de réorganisation des tâches en fonction de la priorité par le glisser-déposer.

0
code.rookie

Le problème n'est pas l'algorithme mais l'interface utilisateur.

Diviser les données en écoles. Laissez l'utilisateur trier chaque écran en faisant glisser les éléments.

Ensuite, combinez les ensembles à l'aide d'un type de fusion modifié: affichez une demi-écran de deux groupes triés, puis laissez le choix de l'utilisateur qui vient en premier dans la liste fusionnée - généralement le premier d'un groupe, mais les utilisateurs peuvent choisir des éléments plus bas car les utilisateurs ne sont pas cohérent.

Il est préférable de diviser les données en groupes de 2 ^ k initialement.

D'autre part, je doute de la valeur d'avoir 300 éléments triés, car une fois les 20 premières priorités effectuées auront changé.

0
gnasher729