Вопрос или проблема
У меня есть проблема, где мне нужно назначить значения Money в Java моим сущностям с этой очень простой идеей в моем PlanningEntity
:
@ProblemFactCollectionProperty
@ValueRangeProvider(id = "amountFacts")
private Set<Money> amountFacts;
@PlanningVariable(valueRangeProviderRefs = "amountFacts")
private Money amount;
В большинстве случаев это работает вполне нормально, однако я столкнулся с конкретной проблемой, когда планировщик не может найти (возможное) рабочее решение.
Странная часть:
Optaplanner находит решение, если я заменяю Set
на List
.
Я перепроверил, и факты остаются теми же. Если я сортирую List
, он снова не может найти решение. Таким образом, если решение иногда находится, это, похоже, зависит от порядка фактов в коллекции фактов.
Увеличение таймаутов, чтобы дать планировщику больше времени, не помогает, к сожалению.
Ответ или решение
Вопрос о порядке фактов в коллекции ProblemFactCollectionProperty
в OptaPlanner действительно имеет важное значение для нахождения правильного решения. В вашем случае вы сталкиваетесь с ситуацией, когда изменение типа коллекции с Set
на List
влияет на возможность нахождения решения планировщиком. Давайте разберем этот вопрос более подробно.
Контекст
OptaPlanner – это библиотека для решения задач планирования и оптимизации, использующая алгоритмы искусственного интеллекта. Она работает на основе определения переменных, фактов и правил, которые помогают сформировать оптимальное решение проблемы. Ваша ситуация касается того, как порядок фактов в коллекции может отразиться на решении.
Порядок фактов
1. Особенности Set
и List
-
Set
: представляет собой коллекцию, которая не хранит порядок добавления элементов и не допускает дублирования. Это приводит к тому, что при каждом его использовании планировщик может получать разные наборы фактов, так как порядок их обработки может варьироваться. -
List
: в отличие отSet
, этот тип коллекции сохраняет порядок добавления элементов. Поэтому, если вы используетеList
, порядок обработки фактов будет стабильным, что может обеспечить более последовательное и предсказуемое поведение планировщика.
2. Влияние порядка на поиск решения
Когда OptaPlanner работает с ProblemFactCollectionProperty
, он может учитывать порядок элементов при генерации и оценке возможных решений. Если элементы фактов добавляются в случайном порядке, это может привести к различным путям в процессе поиска решений и, как следствие, к ситуации, когда решение не будет найдено.
В вашем случае, когда вы заменяете Set
на List
, порядок фактов становится фиксированным. Это может объяснять, почему планировщик иногда находит решение. Однако, если вы сортируете List
, это может привести к тому, что ранее стильные пути поиска решения больше не будут актуальны, и OptaPlanner не сможет найти решение.
Рекомендации
-
Оставить
List
без сортировки: Поскольку вы уже заметили, что планировщик лучше справляется с нахождением решения, когда используетList
, рекомендую использовать этот подход без дальнейшей сортировки элементов. -
Проверка значений: Убедитесь, что значения, которые вы добавляете в
List
, не содержат дубликатов и не нарушают другие правила вашей задачи. -
Отладка и наблюдение: Используйте средства отладки и профилирования для анализа выбранных значений и маршрутов, которые планировщик выбирает во время обработки. Это поможет вам понять, какое влияние оказывает порядок на успешность поиска решения.
Заключение
Вопрос порядка фактов в коллекции неспроста вызывает проблемы в ваших задачах. Рекомендуется детально проанализировать способы хранения фактов и их влияние на общую эффективность планировщика. Используя List
, вы можете получить больше контроля над порядком и, возможно, добиться более качественных решений.
При соблюдении этих рекомендаций, вам удастся оптимизировать вашу задачу и сделать работу с OptaPlanner более продуктивной. OptaPlanner предлагает множество настроек и возможностей, поэтому важно тщательно подойти к выбору необходимых коллекций для ваших сущностей.