Я хочу загрузить большое количество фактов, 3 миллиона расстояний между точками, и я хочу знать, можно ли предоставить факты optaplanner с помощью структуры данных с возможностью поиска, такой как массив. Я считаю, что использование списка для хранения такого количества значений приведет к длительному поиску. Я использую скоринг Drools.
Могут ли факты optaplanner быть массивами?
Ответы (1)
Да, проблемные факты могут быть массивами. Факты о проблемах также могут иметь поля, которые являются массивами. Чтобы использовать их в подсчете очков Drools, вам нужно вернуть их из метода getProblemFacts()
как Collection
, но просто обернуть их в ArrayList
, и вы не испытаете заметного замедления производительности: это однократный удар при инициализации и как только поскольку они находятся в Drools workingMemory
, эта коллекция getProblemFacts () забыта.
Обратите внимание, что ArrayList
(который реализует интерфейс List
, который, в свою очередь, реализует Collection
) имеет те же характеристики масштабируемости памяти и производительности, что и массив. Я имею в виду, что у него есть некоторые накладные расходы, но они не влияют на накладные расходы BigO. Также обратите внимание, что настоятельно рекомендуется использовать new ArrayList(int initialCapacity)
вместо конструктора без аргументов, если у вас есть какая-либо оценка необходимого размера.
Сущности планирования в настоящее время должны быть коллекциями, потому что @PlanningEntityCollectionProperty
в настоящее время поддерживает только возвращаемый тип Collection
. Не стесняйтесь создавать jira, в которой мы также должны поддерживать массив - или даже вносить PR на github, который его реализует :)
В настоящее время диапазоны плановых значений должны быть List
или числовыми границами. Не стесняйтесь делать jira или PR, что мы также должны поддерживать там массив, это просто вопрос копирования-вставки ListValueRange
в ArrayValueRange
.