Использование Optaplanner для сортировки элементов в списке

В настоящее время мы оцениваем возможность использования optaplanner в нашем проекте по оптимизации графика работы режущего оборудования.

Насколько эффективен optaplanner при сортировке списка элементов на основе правил?

Немного предыстории:

Заказчик ожидает от нас, что инструмент должен оптимизировать график работы режущих станков на таком удалении, чтобы свести к минимуму время их простоя, используя следующие факторы:

  1. Заказы с высоким приоритетом должны сначала проходить через машину. (Тяжелая оценка)
  2. затем заказы приближаются к установленному сроку. (Средний балл)
  3. Сведите к минимуму частоту смены продукта в расписании, так как при каждом изменении машина должна отключаться на X минут для работы по очистке. (Мягкая оценка)
  4. Сведите к минимуму изменение положения ножа между рисунками. Оператор устанавливает каждое изменение положения ножа в течение 5 минут. (Мягкая оценка)
  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

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

Сообщите мне, если мне нужно предоставить дополнительную информацию (моя первая публикация здесь).

Заранее благодарим за поддержку.


person Z-Zen    schedule 02.04.2015    source источник
comment
Поскольку правило 5 является мягким весом, оно будет конкурировать с правилами 3 и 4, если не будет решения, которое полностью соответствует всем правилам (чего никогда не бывает на практике).   -  person Geoffrey De Smet    schedule 02.04.2015
comment
Я не понимаю, как правило сортировки по номеру элемента выполняет то, что вы хотите в правиле 5.   -  person Geoffrey De Smet    schedule 02.04.2015


Ответы (1)


Некоторые идеи для рассмотрения: сделайте правило 3 и 4 средним баллом (переключитесь на HardMediumSoftScore), потому что правило 5 начинается с «если все вышеперечисленное одинаково», поэтому оно действительно заслуживает своего собственного уровня баллов, самого низкого.

Взгляните на раздел документации об «ограничениях справедливости». Простое наказание для каждой задачи квадратом разницы между ее orderNumber и orderNumber предыдущей задачи может уже сделать то, что вы хотите. Описание правила 5 оставляет некоторую возможность для интерпретации (например, дважды 1 порядковый номер слишком поздно, хуже, чем один раз 5 порядковых номеров слишком поздно?).

person Geoffrey De Smet    schedule 02.04.2015
comment
спасибо Джеффри за быстрый ответ. Прочитав ваш ответ и комментарии, действительно имеет смысл поместить правило 5 в отдельный раздел, и вы правы, сформулированное для него правило слюни действительно не имеет никакого смысла, поскольку мы не включаем разницу между itemNumber. это нам очень помогло ;-) - person Z-Zen; 03.04.2015