我正在为我的日程生成器中的课程分配房间。我当前的模型如下所示:
@PlanningEntity
class Lesson {
...
@PlanningVariable(allowsUnassigned = true)
Room room;
Set<String> requiredRoomAttributes;
...
}
class Room {
Set<String> attributes;
}
但是,我需要更改它,以便每节课可以有任意(但固定)数量的房间。 (在用户界面中,用户可以指定课程需要三个房间,并具有三组不同的所需属性。)
(A
@PlanningListVariable
在这里似乎不合适,因为只要课程不及时冲突,每个房间都可以分配给多个课程。)
对此进行建模的自然方法如下:
@PlanningEntity
class Lesson {
...
Set<RoomAssignment> roomAssignments;
...
}
class RoomAssignment {
...
Room room; // null until room has been assigned
Set<String> requiredRoomAttributes;
...
}
class Room {
Set<String> attributes;
}
我很困惑,因为我不确定将
@PlanningVariable
注释放在哪里。我认为它必须在实体上,但它只是 room
(而不是实际变量 requiredRoomAttributes
)。
这让我相信这是一个更好的建模:
@PlanningEntity
class Lesson {
...
@PlanningVariable
List<Room> rooms;
// The i:th set represents the requirements for the i:th room
List<Set<String>> requiredAttributes;
...
}
class Room {
Set<String> attributes;
}
问题1:这是对这个问题进行建模的推荐方法,还是有更好的方法?
问题 2: 是否有可能使用任何内置移动选择器来更新
List<Room> rooms
中的各个元素,或者我应该继续编写自定义移动选择器?
问题3:如果我错了,请纠正我,但我觉得Timefold内部可能可以处理任意(但固定)的自变量列表。有没有考虑过这个问题?例如:
@PlanningEntity
class Lesson {
@PlanningVariableArray
Room[] rooms = new Room[10];
}
问题1:由于“每节课可以有任意(但固定)数量的房间”,我会像这样建模
class Lesson {
Set<RoomAssignment> roomAssignments;
}
@PlanningEntity
class RoomAssignment {
...
@PlanningVariable
Room room; // null until room has been assigned
Set<String> requiredRoomAttributes;
...
}
class Room {
Set<String> attributes;
}
所以规划实体现在是房间分配而不是课程。
问题 2: 使用我在回答问题 1 时使用的模型,所有内置移动选择器都可以工作。
问题 3:一般来说,任意(但固定)变量都是用“元素是实体”策略来处理的,该策略在我对问题 1 的回答中使用。该策略还有一个额外的好处,即可以更轻松地编写增量约束(因为您不需要迭代集合或数组来检查实体的规划值)。