Поддерживает ли 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 ответ:
Мы работаем над полной поддержкой непрерывных переменных. Но в настоящее время (в 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-полным, поэтому есть "легкое" решение).