OptaPlanner для маршрутизации транспортных средств - PullRequest
1 голос
/ 21 апреля 2020

Я пытаюсь решить VRP с OptaPlanner. Я написал весь код с поставщиком ограничений, объектами планирования и решениями для планирования и т. Д. c. Вопрос в том, что я пытаюсь получить решение по

        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);

, но это вызывает бесконечное ожидание решения. Есть ли идеи, в чем причина? Заранее спасибо.

1 Ответ

2 голосов
/ 21 апреля 2020

Вы не настроили условие завершения решателя. Например, если вы хотите, чтобы решатель решал задачи в течение 60 секунд, добавьте следующее:

solverConfig.withTerminationConfig(new TerminationConfig().withSecondsSpentLimit(60L));

Обратите внимание, что в представленном вами примере решатель запускается в главном потоке и блокирует его до тех пор, пока не будет выполнено условие завершения, а затем перестает решать добровольно. Поскольку в вашем примере такого условия не существует, он решает и блокирует поток навсегда.

В качестве альтернативы используйте API SolverManager для решения проблемы асинхронно (в рабочем потоке):

int problemId = 1;
SolverManager<Solution, Integer> solverManager = SolverManager.create(
        solverConfig, new SolverManagerConfig());
SolverJob<Solution, Integer> solverJob = solverManager.solve(problemId, solutionDef);
// wait some time, then terminate solver manager
solverManager.terminateEarly(problemId);
Solution bestSolution = solverJob.getFinalBestSolution();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...