对于工作调度应用程序,我需要为 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 名员工,我想为每位员工生成 100.000 - 1.000.000 个可能的时间表。
时间表实际上生成得很快,因为我的电脑有 8GB 可用内存,所以我可以存储很多。然而,当完成为 30--40 名员工生成时,我的记忆就变得满满当当了。
有人给我的建议是使用字符数组来表示分配的班次,而不是枚举数组。这将使用更少的空间。此外,他表示使用 char 数组列表而不是 Schedule 对象列表也更好。但是,不可能在计划附近的某个地方保存计划属性(例如成本),并且需要经常重新计算它们。我认为这将是一个严重的缺点。
这种观察确实有意义,还是您认为有更好的方法来表达如此大量的数据以使用更少的空间?