Поддерживает ли OptaPlanner оптимизацию и ограничения для непрерывных переменных?


Я читаю противоречивые вещи в документации.

С одной стороны, этот отрывок, по-видимому, указывает на то, что возможны непрерывные переменные планирования:

Диапазон плановых значений - это набор возможных плановых значений для переменная планирования. Этот набор может быть дискретным (например, строки 1, 2, 3 или 4) или непрерывный (например, любой двойной между 0.0 и 1.0).

С другой стороны, при определении переменной планирования необходимо указать ValueRangeProvider аннотация поля, используемого для набора значений:

Реализация решения имеет метод, который возвращает коллекцию. Какой-нибудь значение из этой коллекции является возможным значением планирования для этого переменная планирования.

Оба этих фрагмента находятся в одном разделе документации (http://docs.jboss.org/drools/release/latest/optaplanner-docs/html_single/#d0e2518 )

Итак, что это? Могу ли я использовать полный double в качестве переменной планирования, или мне нужно чтобы ограничить его диапазон значениями в конкретном Collection?

Глядя на фактические алгоритмы, я не вижу ни одного, который действительно подходит для оптимизации непрерывных переменных, поэтому я сомневаюсь, что это возможно, но было бы неплохо прояснить и сделать это явным.

1 5

1 ответ:

Мы работаем над полной поддержкой непрерывных переменных. Но в настоящее время (в 6.0.0.CR2) он еще не поддерживается прилично.

Диапазоны значений действительно могут быть непрерывными диапазонами, но водопровод для их фактического использования еще не существует. В последнее время мы добились хорошего прогресса, см. https://issues.jboss.org/browse/PLANNER-160 .

Вот как это будет работать: Вы сможете использовать аннотацию @ValueRangeProvider для метода, который возвращает ValueRange (вместо Collection) тоже.

A ValueRange будет интерфейсом, поддерживающим выбор случайного значения, получение размера, ... Из коробки мы будем поддерживать IntValueRange, DoubleValueRange, BigDecimalValueRange, ... (Детали реализации: мы переоснастим эти методы возврата коллекции в CollectionValueRange.)

Тогда реализации ValueSelector будут использовать это напрямую.

Что касается пригодности для оптимизации непрерывных переменных:

  • JIT случайный выбор будет очень быстрым и эффективным с точки зрения памяти.
  • если у вас есть NP-полная/NP-сложная задача, тогда OptaPlanner будет отличным выбором. Если у вас есть только непрерывные переменные (а не одна дискретная переменная), то маловероятно, что ваша проблема является NP-полной (если только ваши ограничения не опровергают это), и в этом случае вам лучше использовать пользовательский, ручной полиномиальный алгоритм (потому что он не является NP-полным, поэтому есть "легкое" решение).