在时间折叠中对任意(但固定)数量的独立规划变量进行建模?

问题描述 投票:0回答:1

我正在为我的日程生成器中的课程分配房间。我当前的模型如下所示:

@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];
}
list modeling optaplanner timefold
1个回答
0
投票

问题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 的回答中使用。该策略还有一个额外的好处,即可以更轻松地编写增量约束(因为您不需要迭代集合或数组来检查实体的规划值)。

© www.soinside.com 2019 - 2024. All rights reserved.