首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Optaplanner:在多个级别上惩罚ConstraintStream

Optaplanner:在多个级别上惩罚ConstraintStream
EN

Stack Overflow用户
提问于 2022-11-21 21:14:57
回答 1查看 30关注 0票数 0

我有一个域模型,在一个规则中,我在多个级别上对分数进行惩罚。考虑一个云调度问题,我们必须将进程分配给计算机,但是每个进程可以在多台计算机之间被分割。每个进程都有一个阈值(例如,75%),如果我们能够调度到它的阈值,我们才能“赢得”这个过程。我们从调度剩余的25%的进程中获得了一些小的额外好处,但是我们的解决者是为了尽可能多的“赢得”进程,所以在调度剩余的进程之前,我们应该将尽可能多的进程调度到它们的阈值。

我们的硬规则计算硬约束(我们不能在计算机上调度比它能处理的更多的进程)

我们的中间规则是根据已排到阈值的进程数量来奖励的(超过75%没有额外的奖励)。

我们的软规则是根据计划的进程总数来奖励的(在这里,我们获得了超过75%的额外奖励)。

这种评分实现意味着将所有进程调度到阈值比浪费宝贵的计算机空间调度一个进程100%更为重要。

当我们使用drools实现时,我们有一个同时奖励中等和软级别的规则。

代码语言:javascript
复制
when
   $process : Process()
   $percentAllocated : calculatePercentProcessAllocated($process) //uses an accumulator over all computers
then
   mediumReward;
   if ($percentAllocated > $process.getThreshold()) {
      mediumReward = $process.getThreshold();
   }
   else {
      mediumReward = $percentAllocated;
   }
   softReward = $percentAllocated;
   scoreHolder.addMultiConstraintMatch(0, mediumReward, softReward);

上面的伪流口水被大大简化了,只是想说明我们是如何同时得到两级奖励的。

问题是,我看不到使用约束流应用多约束匹配的任何好方法。我看到的所有示例在应用惩罚或奖励方法之后都会自动添加终止符,这样就不能再修改分数了。我看到执行我的规则的唯一方法是制定两条规则,这两条规则在他们的奖励要求之外是相同的。

如果可能的话,我非常希望避免运行同样的约束两次,那么是否有办法一次惩罚多个级别的分数呢?

另外,为了预期这个问题的可能答案,不可能将我们的域模型分割成两个进程(一个进程从0%到阈值,另一个进程从阈值到100%)。我已经掩盖的部分积累涉及链接这两个部分,如果它们是单独的对象,那么执行起来太昂贵了。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-11-21 21:44:22

目前在约束流API中没有任何方法可以做到这一点。约束权重假定为常数。

如果你必须这样做,你可以利用这一事实,即确实没有“中等”得分。HardMediumSoftScore的中间部分只是软性的另一个层次。因此,0hard/1medium/2soft在实践中的行为将与0hard/1000002soft相同。如果您选择一个足够高的常数来乘以中间部分,您可以让HardSoftScoreHardMediumSoftScore一样工作,并同时实现您的用例。

是黑客吗?是。我喜欢吗?不是的。但它确实解决了你的问题。

另一种方法是利用节点共享。我将用一个例子来展示它胜过千言万语:

代码语言:javascript
复制
UniConstraintStream<Person> stream = constraintFactory.forEach(Person.class);
Constraint one = stream.penalize(HardSoftScore.ONE).asConstraint("Constraint 1")
Constraint two = stream.penalize(HardSoftScore.TEN).asConstraint("Constraint 2")

这看起来像是执行了两次的两个约束。在CS-Drools中,就是这样。但是can实际上可以优化这一点,并且只执行一次流,在最后执行两种不同的惩罚。

这不是一个很好的编程模型,您失去了API的流畅性,您需要切换到非默认的CS实现。但再次-如果你绝对需要做你想做的事,这将是另一种方式。

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

https://stackoverflow.com/questions/74524963

复制
相关文章

相似问题

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