【问题标题】:Returning multiple solutions to a scheduling issue with optaplanner使用 optaplanner 返回多个调度问题的解决方案
【发布时间】:2015-06-25 07:26:37
【问题描述】:

强文本您好 Optaplanner 专家,

我是 OptaPlanner 的新手,所以请原谅任何幼稚或基本的问题。我正在使用它来安排一个:

set of jobs, A, B and C, which can be completed by 5 resources, say Will, Jane, Roy, Tom, Jeff. 

这些工作中的每一个都可以由 5 种资源中的任何一种来完成。会有一些算法根据软约束来计算谁是最合适的,但我还没有。现在,我只需要想出多种解决方案,比如说

1. Will - A, Roy - B and Jeff - C
2. Roy - B, Tom - B and Jane - C
... and so on

有没有办法在 OptaPlanner 6.2.0 最终版中做到这一点?我只看到一种获得最佳解决方案的方法。我确定我错过了一些东西,只是不确定是什么。任何指针将不胜感激。

感谢您的宝贵时间,

爱丽丝

【问题讨论】:

标签: optaplanner


【解决方案1】:

可能有更好的解决方案,但我建议通过以下方式向您的求解器添加SolverEventListener

solver.addEventListener(new SolverEventListener<Solution>() {
    @Override
    public void bestSolutionChanged(BestSolutionChangedEvent<Solution> event) {
        // TODO Auto-generated method stub  
    }
});

每次找到更好的解决方案时都会调用 bestSolutionChanged 方法。从这里您需要克隆(我认为,Geoffrey 会更清楚)解决方案并将其保存到列表中(也许保留最后 5 个最佳解决方案之类的?我会检查克隆过程需要多长时间,因为该方法应该返回而不是快点。

【讨论】:

  • 这确实是推荐的方式 :) 过去,人们也攻击过BestSolutionRecaller 来提供这种行为,但不要那样做。将来,我还想完全支持开箱即用的 Pareto 优化,这将为您提供一个有趣(足够多样化)最佳解决方案的列表(请参阅文档中的“pareto”)。
  • 感谢 code4dc 和 @Geoffrey De Smet。我试过了,但我在 bestSolutionChanged 方法中没有得到超过 1 次点击。我今天没有花太多时间,但我会做更多的调试,看看到底是什么问题。
  • 啊是的...现在我记得他们为什么攻击BestSolutionRecaller:因为在侦听器方法中,bestSolutionChanged() 仅在解决方案改进时才被调用(因此分数更高),而不是当找到相同的分数...
  • 谢谢@Geoffrey De Smet。是的,两种情况下的分数都是一样的。所以看起来我最好的解决方案是黑客攻击。我查看了 optaplanner 示例,发现 BestSolutionRecaller 是一个由 DefaultSolver 在内部调用的 optaplanner 类。我找不到任何有关如何实现此行为的示例。我知道不建议这样做,但我正在考虑扩展 BestSolutionRecaller 并覆盖solvingStarted() 并更改solverScope中的某些内容。那是你的建议吗?抱歉,如果这是一个幼稚的问题,但我想确保我至少不会对这种方法搞砸太多。
  • BestSolutionRecaller 将在 Config 类中创建,可能是 SolverConfig IIRC,您可能想在那里覆盖其构建方法,请参阅文档(图片)中的最后一章以了解 Config 类与运行时类。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-11
  • 1970-01-01
  • 1970-01-01
  • 2020-09-11
  • 1970-01-01
相关资源
最近更新 更多