用于车辆路线的OptaPlanner

用于车辆路线的OptaPlanner,optaplanner,vehicle-routing,Optaplanner,Vehicle Routing,我正试图用OptaPlanner解决VRP问题。我用约束提供者、规划实体和规划解决方案等编写了所有代码。问题是,我正在尝试通过 SolverConfig solverConfig = new SolverConfig(); solverConfig.withSolutionClass(Solution.class); solverConfig.withEntityClasses(Stop.class, Standstill.class);

我正试图用OptaPlanner解决VRP问题。我用约束提供者、规划实体和规划解决方案等编写了所有代码。问题是,我正在尝试通过

        SolverConfig solverConfig = new SolverConfig();
        solverConfig.withSolutionClass(Solution.class);
        solverConfig.withEntityClasses(Stop.class, Standstill.class);
        ScoreDirectorFactoryConfig scoreDirectorFactoryConfig = new ScoreDirectorFactoryConfig();
        scoreDirectorFactoryConfig.setConstraintProviderClass(VrpConstraintProvider.class);

        solverConfig.withScoreDirectorFactory(scoreDirectorFactoryConfig);

        SolverFactory<Solution> solverFactory = SolverFactory.create(solverConfig);
        Solver<Solution> solver = solverFactory.buildSolver();

        Solution solution = solver.solve(solutionDef);
SolverConfig SolverConfig=new SolverConfig();
solverConfig.withSolutionClass(Solution.class);
solverConfig.WithEntityClass(停止类、停止类);
ScoreDirectorFactoryConfig ScoreDirectorFactoryConfig=新的ScoreDirectorFactoryConfig();
scoreDirectorFactoryConfig.setConstraintProviderClass(VrpConstraintProvider.class);
solverConfig.WithCoreDirectorFactory(scoreDirectorFactoryConfig);
SolverFactory SolverFactory=SolverFactory.create(solverConfig);
Solver Solver=solverFactory.buildSolver();
Solution Solution=求解器.solve(solutionDef);

但这导致了无休止的等待解决方案。你知道原因是什么吗?提前感谢。

您尚未配置解算器终止条件。例如,如果希望解算器求解60秒,请添加以下内容:

solverConfig.withTerminationConfig(新TerminationConfig().withSecondsPentLimit(60L));
请注意,在本例中,解算器在主线程上运行并阻止它,直到满足终止条件并自动停止解算。因为在您的示例中没有这样的条件,所以它将永远解决并阻塞线程

或者,使用
SolverManager
API异步解决问题(在工作线程上):

int problemId=1;
SolverManager SolverManager=SolverManager.create(
solverConfig,新的SolverManager配置());
SolverJob SolverJob=solverManager.solve(problemId,solutionDef);
//等待一段时间,然后终止解算器管理器
solverManager.terminateEarly(problemId);
Solution bestSolution=solverJob.getFinalBestSolution();