【发布时间】:2014-09-17 22:53:53
【问题描述】:
我第一次尝试使用 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 的团队)。这是正确的方法吗?
非常感谢您的帮助!
【问题讨论】:
标签: java math optimization constraint-programming optaplanner