0

カレンダーとスケジューリング アプリケーションを作成しようとしています。短納期の予約で構成されるデータセットがあります。開始時間、期間、期日/時間など。私たちの意図は、作業ブロックの開始時間と終了時間を指定してタスク リストを生成するアプリケーションを作成することです。

ジョブの優先順位は次のとおりです。

  1. 今日の特定の時間に締め切り
  2. 締め切りは今日で、特定の時間はありません
  3. 期限が将来の日付で、昇順で並べ替えられます
  4. 期日なし
  5. 将来の開始日 (レポートから除外)

アプリケーションの実行時に、勤務シフトの開始時刻と終了時刻が入力されます。その時間ブロックには、優先順位に従ってジョブが自動的に入力されます。

検討:

Job01; Duration 10; Start 01/01; Due 01/02 1500;
Job02; Duration 60; Start 01/01; Due 01/02;
Job03; Duration 45; Start 01/08; Due 01/08 1500;
Job04; Duration 30; Start 01/09; Due 01/09 1500;
Job05; Duration 30; Start 12/31; ;
Job06; Duration 60; Start 12/28; ;
Job07; Duration 60; Start 01/04; ;
Job08; Duration 60; Start 01/04; ;
Job09; Duration 30; Start 01/01; Due 01/03 1200;
Job10; Duration 10; Start 01/01; Due 01/05 1700;

2002 年 1 月には、これらの 10 個のジョブが次の順序で優先されます01-02-09-10-05-06。ジョブ03-04-07-08は、将来の開始日のために除外されます。

考えてみてください: 01/02 に、私は 4 時間シフトでオフィスに来て、1200-1600このデータをスケジューラに入力します。

そこから、次の魔法を起こす必要があります。

  1. 私の開始時刻から、最優先ジョブを追加します。
  2. ジョブが特別にスケジュールされたジョブである場合は、その時間を保持して、他のジョブがそれを上書きしないようにします。
  3. 特定の時間を持つすべてのジョブがカレンダーに表示されたら、カレンダーがいっぱいになるまで、最初の空いているスロットから予定を入力し続け、その後停止します。

そのロジックに従って、データがどのようにスケジュールを埋めるかを次に示します。

Job01 - 1500-1510
Job02 - cannot fit in the 1510-1500 slot, so it populates 1200-1300
Job05 - 1300-1330
Job06 - 1330-1430
Job09 - 1430-1500
Job10 - 1510-1520

これまでのところ、優先順位付けのロジックは問題なく機能しています。スケジュールの最初のレコードを適切にキャプチャできます。しかし、その後、私は、特に特定のタイムスロットを保持して何も上書きしないようにする方法、および開始時刻と終了時刻を超えないようにする方法について、思いがけない部分で迷っています。カレンダーを設定するメソッドを構造化する効果的な方法に苦労しています。15 分のバケットの配列を作成し、タスクのリストを反復処理しながらそれらに予定を入力しますか? イベントをスケジュールし、スケジューラを介して別のイベントを渡すたびに、どうにかしてnewStartTimeand を渡してトップに戻るのでしょうか? newEndTimeイベントは記憶に保持されますか?または、特定のスロットに入力するときにデータベースに書き込まれますか? Java には既にこれを行う定義済みのクラスがありますが、私はそれを見逃しましたか? くそっ…恥ずかしいだろう…

私は今これに近づきすぎており、良い戦略を視覚化するのに苦労しています. 提案、観察、および一般化された疑似コードは役に立ちます。

4

1 に答える 1

1

観察/提案 1: あるジョブで別のジョブを上書きしたい理由がよくわかりません。優先度コードが完了していて、優先度の最も高いジョブを最初に追加している場合、タイムスロットを上書きする必要があるのはなぜですか? ジョブがタイムスロットを要求できる構造を作成し、一度要求すると他のジョブが同じスポットを要求できないようにします。

1 日のジョブを処理するジョブ スケジュール クラスを記述します。今日のスケジュールにジョブのリストを保存するだけです。利用可能なタイムスロットと占有されているタイムスロットは、オンザフライで計算できます。停電後もデータが保持されることが心配な場合は、オブジェクトのシリアル化を定期的にディスクに書き込むことができます。このアプリをマルチスレッド化し、スレッドセーフの問題をDBに委譲することができない限り、このデータをデータベースに保存する価値は実際にはありません。

ジョブにフィールドを追加することをお勧めします: assignedStartTime.

開始時刻と終了時刻だけを格納する TimeInterval クラスを作成します。

次に、Schedule 内で次のように記述できます。

public class Schedule {

  //Finds the first time slot during the day not yet assigned to a job.
  public Interval getFirstOpenTimeSlot() { /* ...*/ }

  public Interval getLargestOpenTimeSlot() { /* ...*/ }

  public ArrayList<Job> getJobsAssigned() {  /* ...*/ }

  //Returns the Interval the given job was assigned to or null if the job cannot fit
  // in the schedule.
  public Interval assignJob(Job theJob) {  /* ...*/ }

  //returns a list of all open time slots representing the time still available for jobs.
  public ArrayList<Interval> getAllOpenTimeSlots{ /*  */ }

}

観察 2: assignJob を実装すると、要件を満たす最初の利用可能なタイムスロットを探すことができるはずです。このように進めるとスケジュールが得られますが、最適なスケジュールではない可能性があります。すべてのジョブをスケジュールできない状況がある場合は、最適なソリューションがどのようなものかを慎重に定義する必要があります。逃した仕事の数が最も少ないものは?今日が期限の仕事の数が最も多いのはどれですか?

提案: Interval に Comparable を実装してもらいます。間隔を最初に長さで並べ替え、次に開始時間で並べ替えます。Intervals を TreeSet に格納して、常に順序付けられるようにします。これにより、新しいジョブをスケジュールする際に最適な間隔を簡単かつ効率的に見つけることができます。

于 2013-02-13T18:42:23.307 に答える