В настоящее время мы оцениваем возможность использования optaplanner в нашем проекте по оптимизации графика работы режущего оборудования.
Насколько эффективен optaplanner при сортировке списка элементов на основе правил?
Немного предыстории:
Заказчик ожидает от нас, что инструмент должен оптимизировать график работы режущих станков на таком удалении, чтобы свести к минимуму время их простоя, используя следующие факторы:
- Заказы с высоким приоритетом должны сначала проходить через машину. (Тяжелая оценка)
- затем заказы приближаются к установленному сроку. (Средний балл)
- Сведите к минимуму частоту смены продукта в расписании, так как при каждом изменении машина должна отключаться на X минут для работы по очистке. (Мягкая оценка)
- Сведите к минимуму изменение положения ножа между рисунками. Оператор устанавливает каждое изменение положения ножа в течение 5 минут. (Мягкая оценка)
- если все вышеперечисленное одинаково, то примените метод FIFO, чтобы самый старый элемент сначала прошел через машину. (Мягкая оценка)
Мы реализовали модель, используя chainedVariable и shadowVariable, HardMediumSoftScore и приведенные выше правила в Drools. Optaplanner очень хорошо справляется со своей работой по первым 4 правилам, но с трудом справляется с последним. Однако, когда я комментирую все остальные правила, optaplanner делает это нормально, и я вижу, что элементы сортируются правильно.
Вот правило слюни для последнего правила:
rule "sort by ItemNumber"
salience 10
when
$previousScore : Number() from accumulate(
TaskGroup(previous!=null, previous.name > name, productType == previous.productType),
sum(-1)
)
$nextScore : Number() from accumulate(
TaskGroup(nextTaskGroup!=null, nextTaskGroup.name < name, productType == nextTaskGroup.productType),
sum(-1)
)
then
scoreHolder.addSoftConstraintMatch(kcontext,$previousScore.intValue()+$nextScore.intValue());
end
Возможно, правило выражено неправильно, но нам трудно понять, почему правило не выполняет свою работу правильно при использовании в сочетании с другими правилами.
Сообщите мне, если мне нужно предоставить дополнительную информацию (моя первая публикация здесь).
Заранее благодарим за поддержку.