web-dev-qa-db-ja.com

ユーザーが入力する一連の実際のタスクをスケジュールするためのアルゴリズム

ユーザーが入力する一連の実際のタスクをスケジュールするコードを記述しようとしています。これらのタスクはSQLiteデータベースに保存されます。そして現時点では、私が考慮している唯一のパラメータは、

The project to which a task belongs to --> p 
The name of the task itself --> t
And the due date for this task --> d

projectおよびdue dateパラメータはオプションです。ただし、ユーザーは常に少なくともtask nameおよびdue dateすべてのタスクに対して..たとえば Completely Fair Scheduler(CFS) のようなスケジューラーを使用してタスクのセットをスケジュールすることが可能かどうか疑問に思いました。 CFSは、この目的のために提案されている一連のタスクよりもはるかに細かい粒度(ナノ秒)でタスクをスケジュールするために作成されていることを理解しています...しかし、私たちの時間の認識と同じ時間スケールにあるタスク。

データベースの一般的なエントリは、(p、t、d)の形式になります。 「p」はオプションです。以下にいくつかの例を示します。

(_, 'Call home', 29/2/2012)
(Work, 'Meet boss', 14/3/2012)
(Work, 'Ask for raise', 18/3/2012)
(_, 'Book tickets', 10/3/2012)
(Work, 'Quit', 14/4/2012)
(Personal, 'Get botox injections', 10/3/2012)
(Personal, 'Get breast implants', 10/10/2012)
(_, 'Dad bday', 7/10/2012)

ここで考慮すべき状況があります。朝起きたいのですが。この「まだコード化されていない」アルゴリズムを一連のタスクで実行します。上記のタスクと同様に、スループットを最大化する残りの日のスケジュールを受け取りたいです。後の段階で、現在の状況に応じて一連のタスクを返すようにスケジューラーを制御できるように、このアルゴリズムに引数を渡したいと思います。仕事中のように、アルゴリズムに引数を渡して、仕事で完了できるタスクのみを返すように要求できるようにしたいのです。

その趣旨をお伝えできれば幸いです。 due dateだけでは、たとえばCFSを使用してタスクをスケジュールするのに十分ではありません...しかし、他に検討すべきパラメータがある場合は、お知らせください。そして、採用するスケジューリングアルゴリズムの種類に関する提案があれば役に立ちます。

4
Jay

これも私がずっと望んでいたことです。ただし、カーネルスケジューラは、実行するタスクを決定するだけで済みます現在将来、他のタスクを実行する時期は決定しません。したがって、これらのスケジューラーは問題の一部を支援する可能性がありますが、ここでは解決する以上のことがたくさんあります。そして、彼らはあなたが保持していない重要な情報を持っています。つまり、タスクがブロックされているかどうか。 (実際には、カーネルがプロセスの状態を追跡します。ここでは単純化しすぎています。)タスクがブロックされているかどうかをユーザーが通知できるように、タスクがブロックしているものを知る必要があります。

1日のスケジュールを設定できるようにする場合は、タスクの残り時間の見積もりを含める必要があります。

タスクの依存関係もそれに結び付けたいと思うでしょう。そして、それは、本を注文する前に、「本を注文する」->「本が到着するのを待つ」->「本を読む」などの外部イベントで物事をスケジュールすることすらしていません。

問題がすぐに深くなり、よく考え抜かれたそして常にあなたと一緒に UIを持つことが重要になることに気付くと思います。

4
retracile

さて、私はそれにいくつかの考えを与えました。これが私がそれを達成するために想像する方法です。

タスクのセットがあると仮定すると、各タスクには

A deadline
Time taken for completion
Time spent on the task so far

私はそれらの一連の作業を遺伝的染色体として表すつもりです。各染色体は、任意の数のタスクでエンコードされます。各染色体の適応度は、締め切りに近づいていてまだ不完全な一連のタスクを持つ染色体に報酬を与える適応度関数によって決定されます。また、最近注目されていないタスクにも報酬を与えます。

適応度関数は、期限が遠いタスクと、最近(私がCPUであると仮定して)私の注意にはるかにアクセスできるタスクを罰します。

私の理解では、上記の手順を実行した結果、数世代後に、次のような一連のタスクを持つ染色体に到達できる可能性があります。

  • 締め切り間近
  • 最近注目されていない
  • 与えられた時間内に完了する可能性が最も高い(これが意味するのは、アルゴに3時間のスケジュールを与えるように頼んだ場合、勝った染色体にはその時間枠で達成できるタスクが含まれている必要があるということです)

誰かが私のアプローチについてコメントしてもらえますか?あなたはそれがうまくいくかもしれないと思いますか?現時点では、さまざまなタスク間の依存関係を考慮するつもりはありません。ベア機能のプロトタイプを稼働段階にしたいと思います。その後、アルゴリズムを再帰的に改善できます...

ありがとう。

0
Jay