首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使策划者容忍init得分

如何使策划者容忍init得分
EN

Stack Overflow用户
提问于 2022-08-23 15:31:49
回答 1查看 49关注 0票数 0

我把云平衡问题带到了一个不同的方向:

需要用进程和计算机填充所有计算机的问题(通过将“过量填充”约束更改为“软”约束)

通过添加以下约束,更改很容易:

代码语言:javascript
复制
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的惩罚来实现,但是我似乎不知道在哪里或者如何实现这个想法。

我还考虑添加一个“虚拟”的计算机实体,它可以不受惩罚地保存进程(规划师仍然会填充常规计算机,因为不填充它们会导致软惩罚),但这似乎需要做大量的工作,并且需要对项目的几乎所有部分进行重大更改,因此如果有一种方法来实现第一种想法,那就更好了。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-08-23 16:31:06

您所描述的是过度约束规划。最有可能的是,您正在寻找可空变量。你用假人的想法被称为"虚值“。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73461429

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档