我有一个任务分配问题需要优化。由于约会窗口和休息时间,我已决定在允许的间隙内使用“ Chained Through Time Pattern”。我正在使用LocalDateTime和Duration类来获取与日期/时间相关的值。
我为应用程序提供的最大内存为2000兆字节,并且我正在500个班次中优化4000个任务(50个工作人员x 10天)...这意味着4000个规划实体和500个锚点。该应用程序设置为最多运行8小时。
CH相位快速而轻松地缩放,然后LS相位开始并且平稳进行。但是,随着时间的流逝,直到抛出OOME为止,内存使用率越来越高。
似乎,如果我禁用了所有流口水规则(通过在其when
条件前加上false &&
,从而使这些规则永不被评估),这会使程序运行得更快,内存使用率提升速度也更快。在3分钟内(而不是数小时内)抛出OOME。
我的配置如下(省略了提前终止条件):
<solver>
<environmentMode>NON_REPRODUCIBLE</environmentMode>
<moveThreadCount>AUTO</moveThreadCount>
<solutionClass>...</solutionClass>
<entityClass>...</entityClass>
...
<scoreDirectorFactory>
<scoreDrl>...</scoreDrl>
<initializingScoreTrend>ONLY_DOWN</initializingScoreTrend>
</scoreDirectorFactory>
<constructionHeuristic>
<constructionHeuristicType>ALLOCATE_ENTITY_FROM_QUEUE</constructionHeuristicType>
<entitySorterManner>DECREASING_DIFFICULTY</entitySorterManner>
<valueSorterManner>DECREASING_STRENGTH</valueSorterManner>
<changeMoveSelector/>
</constructionHeuristic>
<localSearch>
<unionMoveSelector>
<changeMoveSelector/>
<swapMoveSelector/>
<tailChainSwapMoveSelector/>
<subChainChangeMoveSelector/>
<subChainSwapMoveSelector/>
</unionMoveSelector>
<acceptor>
<lateAcceptanceSize>200</lateAcceptanceSize>
</acceptor>
<forager>
<acceptedCountLimit>1</acceptedCountLimit>
</forager>
</localSearch>
</solver>
下面是一个优化运行的示例,该运行可以在4小时内获得OOME:
run @ 3 hours in (almost OOME)
run @ 4 hours in (OOME)