ProjectJobScheduling的drl版本是不是不能用了?
Is the drl version of ProjectJobScheduling unusable?
运行 使用 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 注释掉规则确实增加了 score/s 我正在使用的问题的大约 20 倍。
所以,我尝试了一些不使用 insertLogical 的变体,每个变体都有一个规则来替换我删除的两个。(插入规则和 insertedLogical 的累积)它们更快,但仍然慢得不切实际.
我的 "best" 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 倍。
DRL 中可能存在瓶颈规则。确定哪个规则的一种方法是注释掉规则,运行 将其注释 1 分钟,然后查看分数计算计数有何不同。对每条规则(大约有 4 条或 5 条)执行此操作,您就会知道哪些是昂贵的。
有一条规则使用了 insertLogical
,这对性能来说从来都不是什么好事。那将是我的主要嫌疑人。
运行 使用 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 注释掉规则确实增加了 score/s 我正在使用的问题的大约 20 倍。
所以,我尝试了一些不使用 insertLogical 的变体,每个变体都有一个规则来替换我删除的两个。(插入规则和 insertedLogical 的累积)它们更快,但仍然慢得不切实际.
我的 "best" 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 倍。
DRL 中可能存在瓶颈规则。确定哪个规则的一种方法是注释掉规则,运行 将其注释 1 分钟,然后查看分数计算计数有何不同。对每条规则(大约有 4 条或 5 条)执行此操作,您就会知道哪些是昂贵的。
有一条规则使用了 insertLogical
,这对性能来说从来都不是什么好事。那将是我的主要嫌疑人。