我有一个有效的 optaplanner/Timefold 解决方案。它提供了一个在白天向业务提供实时反馈的解决方案。但是更改请求会临时排队,因此我需要克隆解决方案来测试任何请求是否有可行的解决方案,然后再将其进一步提交到主解决方案中。为此,我克隆了当前用于测试的最佳解决方案,如下所示:
SolutionDescriptor solutionDescriptor = SolutionDescriptor.buildSolutionDescriptor(DistributionSolution.class, MoverEntity.class, LoaderEntity.class );
FieldAccessingSolutionCloner<DistributionSolution> distSolCloner = new FieldAccessingSolutionCloner<>(solutionDescriptor);
DistributionSolution clonedSolution = distSolCloner.cloneSolution(currentDistributionSolution);
但是对解决方案和实体类进行硬编码似乎很脆弱,我可以使用solverConfig.xml,但这是另一种硬编码,它可以移动到工厂等。但我正在寻找一种更动态的方式来获取初始化解决方案克隆器。我查看了 TimeFoldProcesser.class,因为它似乎完全使用反射来实现这一点,但不确定如何在运行时访问它?关于如何解决这个问题有什么想法吗?
请注意,
SolutionDescriptor
不是公共API;你正在做一些你一开始就不应该做的事情。
我不完全确定为什么你需要这样做;如果您想检查任何特定问题是否有可行的解决方案,您应该运行求解器。没有什么可以阻止您同时运行多个求解器 - 一个用于您的实际问题,另一个用于测试假设。
也就是说,Timefold Solver 将很快推出一项功能来帮助您解决此问题;我们将其称为“推荐适配 API”,它旨在为您的问题提供超快速的答案:“我可以将这个新实体放在当前解决方案中的最佳位置吗?”
Wrt。 “硬编码实体和解决方案”,我根本不理解问题的这一部分。配置需要写在某处——无论是在
SolverConfig
还是在solverConfig.xml
中;它一定在某个地方。
Wrt。
TimefoldProcessor
- 如果您正在使用 Quarkus,那么您已经在使用它了。如果您不使用 Quarkus,则无法使用它。