【问题标题】:Don't force variable allocation in Optaplanner不要在 Optaplanner 中强制变量分配
【发布时间】: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 的团队)。这是正确的方法吗?

非常感谢您的帮助!

ThePolyscope.com

【问题讨论】:

    标签: java math optimization constraint-programming optaplanner


    【解决方案1】:

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

    【讨论】:

    • 感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 2012-09-08
    • 1970-01-01
    • 2016-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-05
    相关资源
    最近更新 更多