我把云平衡问题带到了一个不同的方向:
需要用进程和计算机填充所有计算机的问题(通过将“过量填充”约束更改为“软”约束)
通过添加以下约束,更改很容易:
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_HARD,
(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_HARD,
(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_HARD,
(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_HARD,
computer -> computer.getCpuPower() + computer.getMemory() + computer.getNetworkBandwidth());
}我还取消了成本约束,因为在这种情况下它是没有意义的。
然而,我不想让计划者将所有易丢失的进程转储到计算机中。
意思是,如果所有的计算机都已经满了,并且没有使用的进程,我希望它们保持这种状态,而不是被迫给计算机增加更多的超额填充惩罚。
我想这可以通过忽略init的惩罚来实现,但是我似乎不知道在哪里或者如何实现这个想法。
我还考虑添加一个“虚拟”的计算机实体,它可以不受惩罚地保存进程(规划师仍然会填充常规计算机,因为不填充它们会导致软惩罚),但这似乎需要做大量的工作,并且需要对项目的几乎所有部分进行重大更改,因此如果有一种方法来实现第一种想法,那就更好了。
https://stackoverflow.com/questions/73461429
复制相似问题