#optaplanner
#optaplanner
Вопрос:
Я хочу иметь функцию типа, если время вычисления становится слишком большим, мы прерываем вычисление маршрутизации и отправляем лучшее решение на данный момент времени. Есть ли такая функция в optaplanner?
Ответ №1:
Например, в приложении с графическим интерфейсом вы бы начали решать в фоновом (рабочем) потоке. В этом сценарии вы можете остановить решатель асинхронно, вызвав solver.terminateEarly()
из другого потока, обычно потока пользовательского интерфейса, при нажатии кнопки остановки.
Если это не то, что вы ищете, читайте дальше.
При условии, что под вычислением вы на самом деле подразумеваете время, затраченное на решение, у вас есть несколько вариантов, как остановить solver. Помимо асинхронного завершения, описанного в первом абзаце, вы можете использовать синхронное завершение:
- Используйте время, потраченное на завершение, если вы заранее знаете, сколько времени хотите посвятить решению.
- Используйте завершение с не улучшенным временем, потраченным, если вы хотите прекратить решение, если решение не улучшается в течение указанного промежутка времени.
- Используйте завершение с лучшим результатом, если вы хотите прекратить решение после достижения определенного результата.
Синхронное завершение определяется перед запуском решателя и выполняется либо конфигурацией решателя XML, либо с помощью SolverConfig
API. Другие условия завершения см. в документации OptaPlanner.
Наконец, в случае, если вы говорите о вычислении баллов, и вычисление баллов за один ход (изменение решения) занимает слишком много времени, то вы, скорее всего, делаете что-то неправильно. Чтобы OptaPlanner мог эффективно выполнять поиск в пространстве решений, вычисление баллов должно быть быстрым (не менее 1000 вычислений в секунду).
Например, в задаче о маршруте транспортного средства время в пути или расстояния на дороге должны быть известны в то время, когда вы начинаете решать. Вы не должны замедлять вычисление оценки с помощью сложных вычислений, которые могут быть выполнены заранее.