我可以 运行 自定义阶段多次生成初始解决方案以生成起始解决方案池吗?

Can I run a custom phase generating an initial solution several times to generate a pool of starting solutions?

我正在使用 Optaplanner 8.15.0 来解决重新划分问题的一个变体:具有预期收入的地理区域被组装到必须连续且应该平衡且紧凑的销售区域。

初始解决方案是由自定义阶段使用贪婪启发法生成的。之后,本地搜索爬山阶段对使用自定义移动的阶段进行了重大而明显的改进。只有这样,“真正的”优化才从禁忌搜索开始。

前两期的配置:

<customPhase>
    <customPhaseCommandClass>project.solver.SeedGrowthInitialSolution</customPhaseCommandClass>
</customPhase>
<localSearch>
    <localSearchType>HILL_CLIMBING</localSearchType>
    <moveListFactory>
        <moveListFactoryClass>project.move.SplitAndJoinMoveFactory</moveListFactoryClass>
    </moveListFactory>
    <termination>
        <unimprovedSecondsSpentLimit>60</unimprovedSecondsSpentLimit>
    </termination>
</localSearch>

事实证明,整体解决方案的质量(=分数)在很大程度上取决于第二阶段之后初始解决方案的质量。 IE。禁忌搜索将显着改进解决方案,但它无法“修复”糟糕的初始解决方案。

有没有办法运行重复前两个阶段来生成几个候选解决方案,然后继续使用其中最好的?

我目前的解决方法是手动启动多个实例,在前两个阶段后查看日志以了解所取得的分数,然后重新启动初始分数不理想的所有实例。

答案是否定的,当问题是这样指定的。但是,我们也许可以稍微更改一下问题陈述。如果您 运行 多个独立求解器,并在最后选择最佳结果,您可以将其传递给将从那里开始的新求解器。这将是 multi-bet solving 的变体。它不支持开箱即用,但使用 SolverSolverManager API 编写代码相对容易。

也就是说,您的整个方法非常不合常规。自定义构建启发式是可以理解的,自定义移动也是如此。但是,您觉得有必要将动作分成不同的阶段这一事实让我很好奇。您 benchmarked 这是最好的方法吗?

我认为使用默认的本地搜索(延迟接受),将您的自定义动作和我们的通用动作全部混合在一起,已经可以产生不错的结果。如果那没有发生,那么通常要么你的约束需要更快,要么求解器需要 运行 更长时间。对于大问题,multi-threaded 求解也有帮助。