当前位置: 首页 > 知识库问答 >
问题:

Optaplanner-HardMediumSoftScoreHolder-我如何强制求解器首先最小化中等分数然后最小化软分数?

江新
2023-03-14

我开始使用optaplanner来做一个poc,我会想出一个问题。我实现了硬约束,这是可以的。对一个介质约束执行同样的操作,以便处理一个可为空的计划实体,并且它是OK的。但是,我添加了一个软约束,我对最好的解决方案不满意。让我解释一下。

在没有软约束的情况下,我得到了0/-2/0的分数,并且根据数据集是最优解。当我实现软约束时,得到0/-8/-13。但对我来说,我更喜欢0/-2/-700。

我该如何管理这种行为呢?如何先最小化介质,再注意软性?

  • 我想影响对资源的服务,如果并持续一段时间。
  • MediumConstraint:未分配给资源的服务总数
  • 软约束:计算期望周期与计划优化周期之间的增量。

对我来说,我更喜欢分配每个服务(如果可能的话),而不是优化首选日期和分配之间的增量。

下面是规则

//###########################################################################
// Medium constraints
//###########################################################################      
    rule "unassigned score"
        when
            accumulate( ServiceRequestAssignment(resource == null);
                                $cnt: count(1))
        then
            scoreHolder.addMediumConstraintMatch(kcontext, -toIntExact($cnt));
    end   

// ############################################################################
// Soft constraints
// ############################################################################

rule "dateDeviance"
    when
        $request : ServiceRequestAssignment(fixDate != true, $dateDeviance: dateDeviance);
    then
        scoreHolder.addSoftConstraintMatch(kcontext, -toIntExact($dateDeviance));
end
<constructionHeuristic>
 <constructionHeuristicType>FIRST_FIT_DECREASING</constructionHeuristicType>

       </constructionHeuristic>
    <localSearch>
        <unionMoveSelector>
            <changeMoveSelector/>
            <swapMoveSelector/>
        </unionMoveSelector>
        <acceptor>
            <lateAcceptanceSize>600</lateAcceptanceSize>
        </acceptor>
        <forager>
            <acceptedCountLimit>4</acceptedCountLimit>
        </forager>
    </localSearch>

谢谢你的帮助。

共有1个答案

吴靖
2023-03-14

在一个步骤中,OptaPlanner将始终首选0/-2/-700而不是0/-8/-13,就像您想要的那样。

问题是,由于分数函数的变化,它会走另一条路,它不会同时达到相同的分数。可能有两个原因

  • 额外的分数约束降低了“分数计算速度”。使用optaplanner-benchmarker将它们相互竞争,并给它10倍的时间来证明,如果有足够的时间,它也会达到这个分数。然后找出分数约束(分数规则)中的瓶颈,并使其更快。
  • 它更容易陷入局部最优。添加其他开箱即用的移动或添加转义此类局部优化的自定义移动。

无论如何--不添加那些软评分规则不是推荐方法。虽然这样可以工作(首先在没有软约束的情况下解决它,然后从前面的解决方案开始,用软约束再次解决它),但这将是一个黑客。真正的、好的、长期的解决方案是添加它们,看看是否可以使它们更高效,设置基准标记(现在只有几行),并找出什么样的自定义移动可以使您从0/-8/-130/-7/-9999

 类似资料:
  • 问题内容: 我刚刚开始我的第二个JavaFX项目,我需要知道何时将a 最大化。在Swing中,这相当简单,可以通过使用WindowListener / Event来完成。但是,在搜索了JavaFX的Javadoc之后,我似乎找不到任何侦听a状态的方法。 有什么办法吗? 问题答案: 要了解是否最小化,可以听财产: 在即将发布的8.0版本中添加了对应的属性: 您可以在此处下载JDK 8(包括FX8)的

  • 给定一个正整数的矩阵(非正方形),其中同一行上的所有元素都是可置换的,问题是最小化列的最大和和最小和之间的差异。 例如 答案是2。 我试着天真地对它进行分类(合并)

  • 我在这个问题上使用了公认的答案:JavaFX最小化未装饰阶段,以适当地最小化我的应用程序。 然而,不幸的是,默认窗口最小化了 我知道可以在未装饰的窗口中显示动画,因为我有一个应用程序具有这种行为(PotPlayer)。 如何使用JNA制作动画? 编辑:这是一个可以正常最小化JavaFX窗口的Kotlin代码段,还添加了bounty。

  • 问题内容: 我正在使用和作为模块捆绑程序编写一个Web应用程序。到目前为止,我的代码还很轻巧,整个文件夹的大小为25 kb。 我创建的虽然是2.2 mb。使用标志运行优化后,它将捆绑包减少到700kb,这仍然非常大。 我调查了文件,文件大小为130kb。 Webpack是否可能产生如此大的文件,或者我做错了什么? webpack.config.js 编辑 package.json: 问题答案: 根

  • 问题内容: 有没有办法在所有浏览器中手动设置浏览器窗口的最小大小? 问题答案: 你可以试试 一旦视口小于600像素,您将获得一个水平滚动条。这仅适用于支持最小宽度CSS属性的现代浏览器。 我认为不可能限制用户的大小调整,也不应该!

  • 我正在制作一个Swing GUI。我没有得到如何在JPanel中最大和最小JTable。