Могут ли факты optaplanner быть массивами?

Я хочу загрузить большое количество фактов, 3 миллиона расстояний между точками, и я хочу знать, можно ли предоставить факты optaplanner с помощью структуры данных с возможностью поиска, такой как массив. Я считаю, что использование списка для хранения такого количества значений приведет к длительному поиску. Я использую скоринг Drools.


person user2952819    schedule 05.08.2014    source источник
comment
Я работаю над примером со 100к точками и реалистичными расстояниями между ними. Проблема в том, что сохранение всех расстояний (100k) ² невозможно, потому что 2D-массив (20k) ² 32-битных int занимает почти 2 ГБ оперативной памяти (на любом языке, а не только в java).   -  person Geoffrey De Smet    schedule 06.08.2014


Ответы (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.

person Geoffrey De Smet    schedule 06.08.2014