如何让Planner容忍初始分数?云负载均衡约束优化问询
解决方案:调整约束优先级实现“填满但不强制超额分配”
问题核心
你当前的约束用了Hard惩罚强制填满计算机,导致规划器为了满足Hard约束,哪怕超额也要分配剩余进程。要实现“尽可能填满,但满载后不再分配剩余进程”,只需调整惩罚类型和逻辑:
具体修改
把所有unfilled*和unusedComputer约束的Hard惩罚改为Soft惩罚,同时确保没有强制分配所有进程的约束(你已经移除成本约束,这步没问题)。修改后的代码如下:
Constraint unfilledCpuPowerTotal(ConstraintFactory constraintFactory) { return constraintFactory.forEach(CloudProcess.class) .groupBy(CloudProcess::getComputer, sum(CloudProcess::getRequiredCpuPower)) .filter((computer, requiredCpuPower) -> requiredCpuPower < computer.getCpuPower()) .penalize("unfilledCpuPowerTotal", HardSoftScore.ONE_SOFT, // 改为Soft惩罚 (computer, requiredCpuPower) -> computer.getCpuPower() - requiredCpuPower); } Constraint unfilledMemoryTotal(ConstraintFactory constraintFactory) { return constraintFactory.forEach(CloudProcess.class) .groupBy(CloudProcess::getComputer, sum(CloudProcess::getRequiredMemory)) .filter((computer, requiredMemory) -> requiredMemory < computer.getMemory()) .penalize("unfilledMemoryTotal", HardSoftScore.ONE_SOFT, // 改为Soft惩罚 (computer, requiredMemory) -> computer.getMemory() - requiredMemory); } Constraint unfilledNetworkBandwidthTotal(ConstraintFactory constraintFactory) { return constraintFactory.forEach(CloudProcess.class) .groupBy(CloudProcess::getComputer, sum(CloudProcess::getRequiredNetworkBandwidth)) .filter((computer, requiredNetworkBandwidth) -> requiredNetworkBandwidth < computer.getNetworkBandwidth()) .penalize("unfilledNetworkBandwidthTotal", HardSoftScore.ONE_SOFT, // 改为Soft惩罚 (computer, requiredNetworkBandwidth) -> computer.getNetworkBandwidth() - requiredNetworkBandwidth); } Constraint unusedComputer(ConstraintFactory constraintFactory) { return constraintFactory.forEach(CloudComputer.class) .ifNotExists(CloudProcess.class, equal(Function.identity(), CloudProcess::getComputer)) .penalize("unusedComputers", HardSoftScore.ONE_SOFT, // 改为Soft惩罚 computer -> computer.getCpuPower() + computer.getMemory() + computer.getNetworkBandwidth()); }
原理说明
- Soft惩罚的激励作用:规划器会优先填满计算机、使用所有可用计算机,因为未填满/未使用会产生Soft惩罚,规划器会尽量减少惩罚值。
- 超额约束的权衡:你已经把超额约束改为Soft惩罚,当所有计算机满载后,再分配剩余进程会产生超额的Soft惩罚。此时规划器会对比“分配进程带来的超额惩罚”和“不分配进程的0惩罚”,显然会选择后者,从而保留未分配的进程,不会强制超额分配。
- 无强制分配约束:确保没有要求“所有进程必须分配”的Hard约束(你已经移除成本约束,这部分无需额外操作),规划器就不会被迫分配剩余进程。
验证要点
- 确认你的超额约束(比如CPU/内存/带宽超额)确实是Soft惩罚,这样规划器才会在超额和不分配之间做权衡。
- 测试场景:当进程总数超过所有计算机的总容量时,检查剩余进程是否未被分配,且没有产生不必要的超额惩罚。
内容的提问来源于stack exchange,提问作者yellowcard123
相关产品推荐
相关产品推荐

