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

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

范嘉
2023-03-14

我正在处理一个问题,其中包括把项目成组与Optaplanner。

  • 硬分数是用约束条件计算的。如果至少有一个约束条件不满足,则为-1,否则为0
  • 中等分数只有在hard=0的情况下才计算,它是每组价格的加法
  • 如果价格计算被禁用,则软得分仅用于优选包含更多项目的组

目前,在一个intranet网络中,介质是通过HTTP调用来计算的,因此我尝试优化硬分值计算来减少HTTP调用次数。

目前,我使用以下算法,它返回了正确的结果与我的许多用例。

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

<constructionHeuristic />

现在,我得到了一个案例,最佳解决方案没有通过使用这种配置的OptaPlanner进行测试。我捕获了一些解决方案并绘制了它们(见下图)。

  • 通过OptaPlanner测试S1并保留其解,但它不是真正的最优解。
  • S2,S3,S4,S5经测试但不满足硬限制条件,故介质=0
  • S7和S8当前没有测试,我不希望它们被测试(我将在下面解释)

预期:

  1. 我希望OptaPlanner返回给我S6解决方案,而不是S1。由于构造启发式算法,我认为它目前是正常的,但我不知道我需要使用哪种算法。
  2. 例如S1和S7和S2和S8对我来说是相同的,如果组内项目相同,组的数量不影响分数。如果我得到了这两个测试,我将有重复的HTTP调用相同的解决方案。(如果没有选择,我将尝试实现OptaPlanner文档中提到的缓存系统

我不是一个算法专家,我是在实践中学习,同时构建这个。

通过阅读文档,我认为穷举搜索将检查S1和S6,但也将检查S7和S8。据我所知,本地搜索和穷尽搜索不会自动停止。有没有办法检查物料html" target="_blank">维度的所有组合并自动停止?

共有1个答案

闾丘炫明
2023-03-14

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

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

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

彻底搜索将自动停止。在非常重要的情况下,它可能需要几十亿年才能做到这一点,因为ES没有规模。

 类似资料:
  • 问题内容: 我正在尝试检查2D数组中每个元素的相邻值,但是当我到达数组的边或角落时,得到了IndexOutOfBoundsException。例如,如果我的数组是: | 2 | 4 | 2 | 7 | 8 | | 8 | 1 | 0 | 5 | 6 | | 0 | 3 | 1 | 5 | 2 | | 1 | 9 | 7 | 2 | 0 | 我知道8的所有邻居都是7,5和6,但是我的陈述并没有正确检

  • 本文向大家介绍php实现给二维数组中所有一维数组添加值的方法,包括了php实现给二维数组中所有一维数组添加值的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了php实现给二维数组中所有一维数组添加值的方法。分享给大家供大家参考,具体如下: 给二维数组中所有的一维数组添加值(索引和关联) 运行结果: 运行结果: 更多关于PHP相关内容感兴趣的读者可查看本站专题:《PHP数组(Array)

  • 本文向大家介绍将二维数组转为一维数组的2种方法,包括了将二维数组转为一维数组的2种方法的使用技巧和注意事项,需要的朋友参考一下 如何将下面的二维数组转为一维数组。 第一种方法: 第二种方法: 以上两种解法print_r($names);后的结果为: 注意:array_column();可以有第三个参数,如 $n = array_column($msg, 'name', 'id'); print_r

  • 问题内容: 我对多维数组有这个问题。 给定以下多维数组: 我想检查它的值并找到重复项(即键0、2和3),仅留下一个键-值对删除其他键,结果是这样的: 我怎样才能做到这一点?? 问题答案: 这将使用以下命令从阵列中删除重复项:

  • 问题内容: 检查数组是 原始值的平面数组 还是 多维数组 的最有效方法是什么? 没有实际循环遍历数组并在其每个元素上运行的方法,有没有办法做到这一点? 问题答案: 简短的答案是,如果“第二维”可能在任何地方,您都必须至少隐式​​循环才能做到。如果必须在第一项中,您只需 但是,我能找到的最有效的通用方法是在数组上使用一个foreach循环,每当找到一个命中点时就会短路(至少隐式循环比直接的for()