不要在Optaplanner中强制进行变量分配

时间:2014-09-17 22:53:54

标签: java math optimization constraint-programming optaplanner

我第一次尝试使用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室的那个)中很容易找到未分配的团队。这是正确的进行方式吗?

非常感谢你的帮助!

ThePolyscope.com

1 个答案:

答案 0 :(得分:0)

这称为过度约束计划。请查看文档和医院病床规划(例)中的@PlanningVariable(nullable = true)