我第一次尝试使用optaplanner(顺便说一句,非常简单,帮助非常完整,错误信息非常明确)。我的问题很简单:根据房间大小为团队分配房间。我希望填满所有房间,我可能会有更多的团队人员而不是可用空间。
我的问题是显然所有球队都无法分配。我想知道如何表达这一点。
首先,我使用了HARD_SOFT分数。可用空间和分配的团队之间的差异给了我一个难题。通过这种简单的实现,解算器可以继续运行,分配所有团队,即使是在破坏严格约束的情况下也是如此。
// Loop on all rooms
for (Room currentRoom : currentAllocation.getRoomList()){
int requiredSize = 0;
// Cumulated sum of allocated people required size
for (People currentPeople : currentAllocation.getPeopleList()){
if (currentRoom.equals(currentPeople.getRoom())){
requiredSize += currentPeople.get_requiredSize();
}
}
// Check if max capacity is respected or not for current room
if (requiredSize > currentRoom.getSize()){
// Max capacity is not respected
hardScore += (currentRoom.getSize()-requiredSize);
}
}
然后,我又增加了一个人工房间(0号房间)。当团队被分配到那个房间时,会降低我的软分数。其他房间以硬分数进行追踪。
for (Room currentRoom : currentAllocation.getRoomList()){
int requiredSize = 0;
// Cumulated sum of allocated people required size
for (People currentPeople : currentAllocation.getPeopleList()){
if (currentRoom.equals(currentPeople.getRoom())){
requiredSize += currentPeople.get_requiredSize();
}
}
// Handle case of room zero
if (currentRoom == currentAllocation.getRoomList().get(0)){
softScore = -requiredSize;
}
else{
// Check if max capacity is respected or not for current room
if (requiredSize > currentRoom.getSize()){
// Max capacity is not respected
hardScore += (currentRoom.getSize()-requiredSize);
}
}
}
现在,只要硬分数达到0,解算器就可以停止。虽然软分数可以确保我们尝试减少左侧空间。在最终解决方案(分配到0室的那个)中很容易找到未分配的团队。这是正确的进行方式吗?
非常感谢你的帮助!
答案 0 :(得分:0)
这称为过度约束计划。请查看文档和医院病床规划(例)中的@PlanningVariable(nullable = true)
。