web-dev-qa-db-ja.com

人間による優先度でタスクをソートするための最良のアルゴリズム

タスク管理ツールを開発しました。また、一部のタスクリストは非常に大きくなる場合があります。 (自分には300以上のタスクがあります)。

タスクを積み上げて優先度でソートできるように、時々タスクレビューを実行したいと思います。

ユーザーにタスクを2つずつ提示することを想像して、他のタスクよりもどのタスクが重要かを尋ねます。すべてのタスクがソートされるまで繰り返します。

ご了承ください:

  • アルゴリズムは「停止に耐える」必要があります。ユーザーは必要に応じてレビューを中止でき、前のソートの結果は失われません。
  • タスクには、優先順位を表す、ユーザーが手動で設定した初期ランクがすでにあります。

私の質問は

  1. すべてのタスクをソートするために必要な比較の数を減らす最適なアルゴリズムは何ですか?
  2. これらのレビューをスピードアップするために提案するより良い戦略(またはタスクと質問を提示する方法)はありますか?

編集1

このフィードバックをありがとうございました!

いくつかの質問に答えるには:

  • はい、各タスクには責任者がおり、各責任者はすべて(数千)のタスクを注文できます。
  • タグはすでにありますが、タスクのレビューでタグ間の優先順位を決定します。優先度は機能やタスクレベルでも設定できることに同意します。
  • 機能ごとに分類されたタスクのツリーがあり、フラットなリストを失いたくありません。タグ付けされたタスクを含むフラットなバックログを好みます。後でキューに配置されたそれほど重要ではない機能に属するタスクに優先順位を付けると、非常に役立つことがあります。
  • 私はソフトウェアレベルでこの問題に最初に焦点を当てた可能性があることを認識しています(アルゴリズムを要求する)が、私の質問はおそらくプロジェクト管理グループに属しているのかもしれません。たとえば、アジャイルレビューミーティングはどのように行われるのでしょうか。

編集2

それについて考え、目標が何であるか(このアルゴリズムについてこの質問をすること)が多ければ多いほど、タスクのレビューを楽しくすることができます。

最終的な目標は、タスクを優先度順に並べることです。しかし、それはタスクを検討することを要求しています。タスクが表示され、ユーザーがレビューをしながらプレイできるセクシーなインターフェイスが欲しいです。セクシー/プレイする部分は私次第ですが、ユーザーがいつでもこのプロセスを停止できるので、タスクを論理的(アルゴリズム的)に提示して注文する方法を見つけるのに苦労します。

私が2つのランダムなタスクを提示し、ユーザーがAよりBの方が重要であるとユーザーが言って、そこで停止するとします。じゃあ何 ?それは単にランクをb.rank = a.rank-1に更新することを意味しますか(重要度が低いほど重要です)。そして、なぜランダムになぜですか?そこで論理的にやるべきことはありますか?ほら、どうすればいいのか分からない。

編集

たくさんのご意見をいただきましたが、そのすべてから大きな利益を得ることができますので、どうもありがとうございました。

8
MickaelFM

バケットソート

しかし、私は自分より先に進んでいます。

このようなリストおよびソートタスクの使用例を検討してください。

  • 開発者はタスクを完了し、次に何をすべきかを知る必要があります
  • プロジェクトマネージャーは納期を見積もる必要がある
  • 顧客/利害関係者は、彼らの要求があなたにとって非常に重要であることを保証する必要があります

これらの3つはすべて、実際にはリストの上部のみを考慮します。また、自然に追加されるもの、残っている機能をリクエストする1人の顧客(リクエストを無効にする)、または新しい機能に古いリクエストが含まれるため、リストは時間とともに変化する可能性があることも考慮する必要があります。アイテム170〜175に到達するまでに、それらの周囲の作業は大幅に変更されているため、正確な順序を誤解してもあまり意味がありません。彼らがトップ20-30に達したときに、それを始めることができます。

上記の問題を回避する方法は次のとおりです。バケットソートから始めます。相対的な重要性のためにいくつかの異なるカテゴリを定義します。色はここでうまくいきます。誰もがリクエストを「重要」にしたいので、評価を歪めるため、「クリティカル」や「重要」などの感情に訴える言葉で名前を付けないでください。代わりに、大まかな説明または正規項目をブレークポイントとして使用します。適切なトップカテゴリは、「データの損失、破損、盗難、または不実表示」です。正規のアイテムを決定ポイントとして使用する場合は、実際のアイテムを使用するか、「新しいアイコンは1ピクセル狭すぎるため、CSSで埋めて補正する」などの一般的なアイテムを使用できます。

次に、新しい標準を使用して、チケットを比較的重要な大まかなクラスターにグループ化します。ソートに関しては、7つほどの事前定義されたピボットでクイックソートを使用するのと似ています。せいぜい3つの比較を行うことになりますが、最初の数回の後、チームはおそらく誰かが最初にカテゴリを提案し、そこから議論するでしょう。

基本的な分類を行った後、最上位のカテゴリーにはアイテムがなく、2番目のカテゴリーには少数のアイテムがあるはずです。トップカテゴリにアイテムが0個以上ある場合は、この並べ替えプロセスをすぐに停止して、それらのアイテムで作業してください。

次に、任意の方法で最初の空でないアイテムのグループをサブソートできます。この回答の上部にある3つの箇条書きのすべてを満たすことができるまで、必要に応じて次のグループで繰り返します。さらに遠くにいると、あなたはおそらくあなたの時間を無駄にしています。

6
Joel Harmon

300のタスクでは、何千もの質問をする必要があります。だれもそれをするつもりはなく、たとえそれができたとしても、結果はあまり役に立ちません。

このような状況では、リクエスタをそのまま使用して、それぞれのリクエストに重要度を割り当てることをお勧めします。競合するユーザーがいる場合、ソフトウェアには、各リクエスター自身の重要性を重み付けする、非表示のユーザー重要要素も含まれます。

ただし、ユーザーがすでに要求に重みを割り当てることができる場合は、必要なときにいつでもそれらの重みを変更できるようにしないでください。ニーズを満たすために使用できるツールを提供します。スケジュールされたタスクレビューは必要ありません。

また、システム(またはユーザー)が「重要性」と「緊急性」を混同しないようにしてください。たとえば、配偶者のために誕生日プレゼントを購入することは非常に重要かもしれませんが、彼らの誕生日がさらに6か月間でなければ、緊急ではありません。同様に、「ここに来て、通りの向こうのこの男が何をしているか見てください」は非常に緊急です(彼はすぐにそれをやめ、あなたはそれを逃します)が、それは本当に重要ではありません。

更新:

それがまさに既存のものです。私が話していたランクはユーザーによって与えられ、ドラッグアンドドロップでタスクを並べ替えます。しかし、300個あるとします。あなたは実際にそれらすべてを見ることはありません。ユーザーがすべてのタスクを確認できるようにする必要があります。

リクエスタがすでに独自のリストを維持できる場合、解決しようとしている本当の問題はわかりません。

リクエスタが要求したことを覚えていないか気にしていない場合、それは本当に問題ではありませんか?キューの位置300にあるべきだと彼らが感じた何かに取り組んでいないことを正当に不平を言うことはできません。

おそらく:

  • 過去6か月間(またはその他のより適切な期間)にアクティビティがなかったリクエストは、優先度を上げるか、リクエストを撤回できることをリクエスタに通知するメールメッセージを生成する必要があります。 (メッセージは「アクティビティ」と見なされ、時計がリセットされます。)
  • これらのメッセージが送信されない特別な最低優先度を作成します。これは、軽微なバグ、煩わしさ、提案された改善などを記録するために単に作成されたアイテムに使用できます。これらは、現時点では努力するほど深刻ではありませんが、特定のソフトウェアが主要な作業を行った次のときに考慮する必要がありますそれに。
3
Ray Butterworth

アルゴリズムは、比較の数を減らすだけでなく、アクセス時間も減らす必要があります。ユーザーがタスクを発見したとき、ユーザーがそれを読み取り、そのタスクについて持っているメモリを回復するには時間がかかります。したがって、ユーザーが2つのタスクのうち最も重要なものを選択した場合、次のラウンドに向けて勝利したタスクを保持できます。この方法の利点は、最も重要なタスクが最初に適切にソートされ、重要度の低いタスクはランダムな順序で長く留まることです。重要度の低いタスクは後で実装され、物事はそれまでに変化するため、すばらしいことです。

アクセス時間を短縮する別の方法は、2つではなく一度に5つのタスクを表示し、これらの5つのタスクをソートするように依頼することです。

そして、あなたはあなたがそれを楽しいものにしたいと言っているので、多分それは時には5、時には2であるべきであり、時にはそれらをソートし、時には最も重要な、時には最も重要でないものを選びます。これにより、プロセスの反復性が低下します。

1
Alexis Ruyant

実際には、300のタスクを優先度だけで並べ替えることはしません。

タスクは関連しているか、関連していません。通常、関連のないタスクよりも関連のあるタスクを処理する方が効率的です。したがって、関連するタスクを一緒に実行する必要があります。また、ランダムなビットや断片の代わりに、一部の主題を完全に処理させること。

これは手動で処理する方がはるかに適切です。

1
gnasher729

1すべてのタスクをソートするために必要な比較の数を減らす最適なアルゴリズムは何ですか?

厳密に言うと、マージソートは打ち勝つことが困難です。

2これらのレビューをスピードアップするために提案するより良い戦略(またはタスクと質問を提示する方法)はありますか?

はい、未完了のタスクの積み重ねを停止します! 300はばかげています。問題を完了可能な機能に分解します。 1つの機能を試してください。 1つの機能を実行します。象を食べる前に象全体を切り分けないでください。

計画を立てすぎると、プロジェクトでの作業中に学習する能力が低下するため、失敗することになります。あなたのデザインはあなたが行くにつれてよりスマートになるはずです。

1
candied_orange

ユーザーに2つのタスクを提示して優先順位を付ける代わりに、ユーザーがすべてのタスクのリストを表示できるオプションをユーザーに提供し、ドラッグアンドドロップで優先度に基づいてタスクを並べ替えることができます。

0
code.rookie

問題はアルゴリズムではなく、UIです。

データを画面全体に分割します。ユーザーがアイテムをドラッグして各画面をソートできるようにします。

次に、変更されたマージソートを使用してセットを結合します。2つのソートされたグループの画面の半分を表示し、マージリストの最初に来るものをユーザーに選択させます-通常は1つのグループの最初ですが、ユーザーは一貫した。

最初にデータを2 ^ kグループに分割するのが最適です。

一方、300個のアイテムを並べ替えることの価値には疑問があります。最初の20個が完了した後、優先順位が変更されるからです。

0
gnasher729