作業スケジューリングアプリケーションの場合、w週間(= 7w日)の可能な従業員スケジュールを多数生成する必要があります。従業員のスケジュールは、計画期間の各日のシフト(早朝、深夜、夜間、休日)のリストで構成されます。アプリケーションはJavaでプログラムされています。
現時点では、従業員のスケジュールを次のように表しています。
public class Schedule
{
/** List with for every day of planning period the assigned shift */
private Shift[] shiftlist = new Shift[Settings.schedule_days];
/** Cost of schedule (for measuring its quality) */
private double cost;
// A list of variables, representing schedule properties
// which are referenced often.
// E.g.: number of workweekends, number of night shifts
// Also some methods for updating / retrieving information
}
Shiftは、割り当てられたシフトを表す列挙型であり、次のように定義されます。
public enum Shift
{
DAY, LATE, NIGHT, FREE;
}
列挙型宣言とプロパティを比較するメソッドにもいくつかのシフトプロパティがありますが、ここでは関係ないと思います。
すべての従業員は彼の可能なスケジュールのリストを持っています:
public class Employee
{
/** Large set of possible schedules for planning period */
public LinkedList<Schedule> generated_schedules;
// Variables representing properties of employee
}
私の問題は、実際には50人の従業員がいて、従業員1人あたり100.000〜1.000.000の可能なスケジュールを生成したいということです。
スケジュールは実際にはすばやく生成され、コンピューターで8 GBのメモリを使用できるので、多くのスケジュールを保存できます。しかし、30〜40人の従業員の生成が終了すると、私の記憶はいっぱいになります。
誰かが私に与えた提案は、列挙型の配列の代わりに、割り当てられたシフトを表すために文字の配列を使用することです。これにより、使用するスペースが少なくなります。さらに、Scheduleオブジェクトのリストの代わりにchar配列のリストを使用する方が良いと彼は述べました。ただし、スケジュールのプロパティ(コストなど)をスケジュールの近くに保存することはできず、頻繁に再計算する必要があります。これは深刻な欠点になると思います。
この観察は確かに理にかなっていますか、それともより少ないスペースを使用するためにこの大量のデータを表現するためのより良い方法があると思いますか?