Остановка, когда решение достаточно хорошо?

#optaplanner #quarkus

#optaplanner #quarkus

Вопрос:

Я успешно внедрил решатель, который соответствует моим потребностям. Тем не менее, мне нужно запускать решатель для более чем 1500 различных «проблем» ровно в 0: 00, каждый день. Поскольку мое веб-приложение написано на ruby, я создал «микросервис» quarkus, который принимает данные, вычисляет решение и возвращает его в мое основное приложение.

В моем application.properties я устанавливаю:

 quarkus.optaplanner.solver.termination.spent-limit=5s
  

что означает, что для решения каждого запроса требуется ~ 5 секунд. Но одновременная отправка 1500 запросов приведет к перегрузке процессора на моей машине.

Есть ли способ сообщить OptaPlanner, чтобы он остановился, когда решение достаточно хорошее? (например, если оценка стабильна … ). Возможно, таким образом я смогу сократить время с 5 секунд до 1-2 секунд в зависимости от проблемы?

Каковы ваши рекомендации для моего конкретного сценария?

Комментарии:

1. Взгляните сюда . Также вы можете захотеть посмотреть здесь на пакетную обработку .

2. @k88 Спасибо! Это именно то, что я искал. Не могу поверить, что я пропустил всю эту часть документации

Ответ №1:

SolverManager автоматически ставит в очередь задания решателя, если поступает слишком много, на основе его parallelSolverCount конфигурации:

 quarkus.optaplanner.solver-manager.parallel-solver-count=3
  

В этом случае будут запущены 3 решателя параллельно. Итак, если поступит 7 наборов данных, 3 из них будут решены, а остальные 4 позже, по мере завершения работы предыдущих решателей. Однако, если вы используете moveThreadCount=2 , то каждый решатель использует как минимум 2 ядра процессора, поэтому вы используете как минимум 6 ядер процессора.

По умолчанию parallelSolverCount в настоящее время установлено значение в половину ядер вашего процессора (в настоящее время оно игнорирует moveThreadCount). В контейнерах важно использовать JDK 11 : количество процессоров в контейнере часто отличается от количества процессоров на компьютере с «голым металлом».


Вы действительно можете указать решателям OptaPlanner остановиться, когда решение достаточно хорошее, например, когда достигнут определенный результат или результат не улучшился за определенное время, или их комбинации. Посмотрите эти документы OptaPlanner.Quarkus уже предоставляет некоторые из них (остальным в настоящее время все еще требуется solverConfig.xml файл), несколько примеров Quarkus:

 quarkus.optaplanner.solver.termination.spent-limit=5s
quarkus.optaplanner.solver.termination.unimproved-spent-limit=2s
quarkus.optaplanner.solver.termination.best-score-limit=0hard/-1000soft