首页
/ Apache KIE OptaPlanner 中的穷举搜索算法详解

Apache KIE OptaPlanner 中的穷举搜索算法详解

2025-07-09 07:39:37作者:齐添朝

穷举搜索概述

穷举搜索(Exhaustive Search)是Apache KIE OptaPlanner项目中的一种优化算法,它能够保证找到全局最优解并准确识别。然而,这种算法存在严重的可扩展性问题,即使对于玩具数据集(toy data set)也难以应对,因此在真实场景中几乎无法使用。

暴力搜索(Brute Force)

算法原理

暴力搜索算法会生成并评估每一个可能的解决方案。它构建了一个搜索树,随着问题规模的增加,这个搜索树会呈指数级爆炸式增长,很快就会遇到可扩展性的瓶颈。

暴力搜索示例

重要提示:由于时间限制,暴力搜索在现实世界问题中基本不可用,这一点在"穷举搜索的可扩展性"部分有详细说明。

配置方法

暴力搜索的最简配置如下:

<solver xmlns="https://www.optaplanner.org/xsd/solver" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="https://www.optaplanner.org/xsd/solver https://www.optaplanner.org/xsd/solver/solver.xsd">
  ...
  <exhaustiveSearch>
    <exhaustiveSearchType>BRUTE_FORCE</exhaustiveSearchType>
  </exhaustiveSearch>
</solver>

分支定界(Branch and Bound)

算法原理

分支定界算法同样会探索指数级增长的搜索树节点,但它会优先调查更有希望的节点,并剪枝掉无价值的节点。

对于每个节点,算法会计算乐观边界(optimistic bound):该节点可能达到的最佳分数。如果某个节点的乐观边界低于或等于全局悲观边界(pessimistic bound),则该节点(包括其所有子节点分支)将被剪枝。

分支定界示例

技术说明:学术论文通常使用"下界"(lower bound)代替"乐观边界","上界"(upper bound)代替"悲观边界"。由于OptaPlanner是最大化分数(支持结合正负约束),为避免混淆,使用了不同的术语。

重要提示:与暴力搜索类似,分支定界在现实世界问题中也基本不可用,原因同样是时间限制。

配置方法

分支定界的最简配置:

<solver xmlns="https://www.optaplanner.org/xsd/solver" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="https://www.optaplanner.org/xsd/solver https://www.optaplanner.org/xsd/solver/solver.xsd">
  ...
  <exhaustiveSearch>
    <exhaustiveSearchType>BRANCH_AND_BOUND</exhaustiveSearchType>
  </exhaustiveSearch>
</solver>

关键配置要点:要使剪枝生效,需要设置InitializingScoreTrend。特别是当趋势设置为ONLY_DOWN(或至少在前导分数级别中包含ONLY_DOWN)时,可以剪枝大量节点。

高级配置选项包括:

  1. 节点探索类型(nodeExplorationType):

    • DEPTH_FIRST(默认):深度优先探索
    • BREADTH_FIRST:广度优先探索(不推荐)
    • SCORE_FIRST:优先探索分数更高的节点
    • OPTIMISTIC_BOUND_FIRST:优先探索乐观边界更好的节点
  2. 实体排序方式(entitySorterManner):

    • DECREASING_DIFFICULTY:先初始化难度更大的规划实体
    • DECREASING_DIFFICULTY_IF_AVAILABLE(默认)
    • NONE:按原始顺序初始化
  3. 值排序方式(valueSorterManner):

    • INCREASING_STRENGTH:按强度递增评估规划值
    • INCREASING_STRENGTH_IF_AVAILABLE(默认)
    • DECREASING_STRENGTH:按强度递减评估
    • DECREASING_STRENGTH_IF_AVAILABLE
    • NONE:按原始顺序尝试

穷举搜索的可扩展性

穷举搜索存在两大可扩展性问题:

  1. 内存消耗呈灾难性增长
  2. 性能表现急剧下降

基准测试显示,无论是暴力搜索还是分支定界,都会很快遇到性能瓶颈。例如,在N皇后问题中,几十个皇后就会触及性能墙;在云平衡问题中,这个墙会突然出现。

实际应用建议:在生产环境中,穷举搜索算法基本无用。建议改用构造启发式算法配合局部搜索,这些方法可以轻松处理数千个皇后/计算机的规模问题。

硬件限制说明:增加硬件资源对这些可扩展性问题几乎没有明显改善。摩尔定律在面对规划实体数量增加时完全无能为力。