OptaPlanner : 二维问题,只检查一维的所有组合

OptaPlanner : 2 dimension problem, check all combinations in one dimension only

我正在解决一个问题,包括使用 OptaPlanner 将项目分组。

目前medium是通过内网HTTP调用来计算的,所以我尝试优化hard score计算以减少HTTP调用次数。

目前我使用了以下算法,它 return 在我的很多用例中得到了正确的结果。

<scoreDirectorFactory>
 <initializingScoreTrend>ANY</initializingScoreTrend>   
 <easyScoreCalculatorClass>com.project.GroupingScoreCalculator</easyScoreCalculatorClass>
</scoreDirectorFactory>

<constructionHeuristic />

现在,我得到一个案例,即 OptaPlanner 未使用此配置测试最佳解决方案。 我捕获了一些解决方案并绘制了它们(见下图)。

预期:

  1. 我想要 OptaPlanner return 我的 S6 解决方案而不是 S1。由于构造启发式算法,我认为目前它是正常的,但我不知道我需要使用哪种算法。
  2. 例如,S1&S7和S2&S8对我来说是一样的,如果组中的项目相同,则组数不影响分数。如果我同时进行了测试,我将对同一解决方案进行重复的 HTTP 调用。 (如果我别无选择,我会尝试实现 OptaPlanner 文档中提到的缓存系统)

我不是算法专家,我在构建这个算法的过程中通过实践学习。

通过阅读文档,我认为穷举搜索将检查 S1 和 S6,但也会检查 S7 和 S8。据我了解,本地搜索和详尽搜索不会自动停止。有什么方法可以检查 Item 维度的所有组合并自动停止吗?

默认情况下,OptaPlanner 运行构造启发式和本地搜索。通过配置 Construction Heuristic,您禁用了本地搜索。 相反,尝试通过添加终止来限制本地搜索。您可以在全局级别执行此操作,也可以仅在本地搜索级别执行此操作:

<constructionHeuristic/>
<localSearch>
   <termination>
        <stepCountLimit>100</>
   </>
</>

有不同形式的终止(参见文档),但最常见的是 spentLimit 和 unimprovedSpentLimit。

穷举搜索将自动停止。在非平凡的情况下,它可能需要几十亿年才能这样做,因为 ES 无法扩展。