ProjectJobScheduling的drl版本是不可用的吗?

问题描述 投票:1回答:1

使用drl配置运行ProjectJobScheduling示例似乎需要更长的数量级才能达到可行的解决方案。对于“ProjectJobSchedulingIncrementalScoreCalculator版本,它在几分钟内找到了解决复杂示例问题的可行解决方案,drl版本在两小时内找不到。

有没有办法使drl版本可用或这类问题是否需要java增量分数?

我做的唯一改变是:

<scoreDirectorFactory>
     <!--<incrementalScoreCalculatorClass>org.optaplanner.examples.projectjobscheduling.solver.score.ProjectJobSchedulingIncrementalScoreCalculator</incrementalScoreCalculatorClass>-->
   <scoreDrl>org/optaplanner/examples/projectjobscheduling/solver/projectJobSchedulingScoreRules.drl</scoreDrl>
  </scoreDirectorFactory>

编辑:使用insertLogical注释掉规则确实将我使用的问题的得分/ s提高了大约20倍。

所以,我尝试了一些不使用insertLogical的变体,每个变量都有一个规则来替换我删除的两个。(插入规则和insertedLogical的累积)它们更快,但仍然不切实际慢。

对我来说,“最好的”drl版本是为每个可能的日期添加一个问题事实,从零到截止日期,但决定到期日会改变一些事情:

rule "renewableResourceCapacity"
    salience 3
    when
        ResourceDay(  $day: usedDay)    
        $resource : Resource(renewable == true, $capacity:capacity)      

        accumulate(
            ResourceRequirement(resource == $resource,
                    $executionMode : executionMode,
                    $requirement : requirement)
            and Allocation(executionMode == $executionMode, $day >= startDate, $day < endDate);
            $used : sum($requirement);
            $used > $capacity
        )
    then
        scoreHolder.addHardConstraintMatch(kcontext, 0, $capacity - $used);
end

尽管如此,最快的drl解决方案仍然比java版慢了约100倍。而且要清楚的是,改进的drl比现有的drl快20倍,比java慢100倍。

drools optaplanner
1个回答
1
投票

DRL可能存在瓶颈规则。确定哪一个是注释规则的一种方法是,运行它1分钟,然后查看分数计算计数的差异。为每个规则(有4个或5个左右)执行此操作,您将知道哪些规则是昂贵的。

有一条规则使用insertLogical,这对性能永远不利。这将是我的主要嫌疑人。

© www.soinside.com 2019 - 2024. All rights reserved.