2014-02-05 3 views
0

У меня есть набор уравнений. У меня также есть набор значений и результаты для уравнения. Что-то вроде:Решение уравнений как CSP

a + b + c = x 

и некоторые выделения могут быть:

1 + 1 + 1 = 3 

2 + 3 + 4 = 9 

Однако фактические уравнения намного больше и может содержать некоторые функции, например, логарифмы.

Теперь мне нужно изменить результат заданного набора так, чтобы (1) уравнение становилось равным определенному значению xx и (2) параметры менялись как можно меньше.

Я думал, что я мог бы решить эту проблему, как ПЕС путем изменения eqation к

(a + ax) + (b + bx) + (c + cx) = xx 

где а, Ь и с соответствуем старым ценностям и ах, Ой и ое различие, которые должны быть применены к соответствующим старым значениям. И xx будет результатом, который я хочу получить у уравнения. Обратите внимание, что a, b, c, xa, xb, cx и т. Д. Являются целыми значениями, а xx всегда будет находиться на некотором расстоянии от x, то есть xx - d < x < xx + d.

В CSP a, b, c и xx будут рассматриваться как факты проблемы, ax, bx, cx будет рассматриваться как переменная планирования, а уравнение (a + ax) + (b + bx) + (c + cx) = xx будет жестким ограничением. Минимизация всех топора, ab, ac будет мягким ограничением. Я не вижу здесь объекта планирования.

global HardSoftScoreHolder scoreHolder; 


rule "changeIsBad" 
    when 
     DeltaVariable($delta : delta) 
    then 
     scoreHolder.addSoftConstraintMatch(kcontext, -Math.abs(delta)); 
end 

rule "equationMustBeEqual" 
    // No idea? 
end 

Но я не могу понять, как это происходит дальше. Возможно ли Optaplanner для такого рода проблем? Кажется, все PlanningVariable s должны поступать из списка и должны быть экземплярами, тогда как у меня есть только целые значения. Является ли моя модель правильной?

+0

Линейный подход к программированию может быть проще. Вы считали это? –

+0

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

ответ

1

Вы можете обернуть каждый целочисленные переменные в классе сущностей, например:

@PlanningEntity 
public class MyEntity { 

    private Integer myVariable; 

    @PlanningVariable(...) 
    public Integer getMyVariable() {...} 
    ... 
} 

Кроме того, использование диапазона планирования единицы для определения диапазона каждых переменного (поскольку она различается в зависимости от объекта), см официальных документов раздел «4.3.5.2.2 ValueRangeProvider на объекте планирования» (и не используйте SwapMove, я думаю, только ChangeMove).

Но в целом, я не уверен на 100%, если это правильный инструмент для работы. Мне было бы интересно узнать, к чему приводит ваш опыт в этом случае.

PS: Начиная с 6.1.0.Beta1 (еще не выпущено, но ночные часы доступны), у нас есть IntValueRange, как описано в nightly docs в разделе «4.3.5.2.4. ValueRangeFactory», который более эффективен для этих видов случаев использования.

+0

Спасибо за подсказку. Имея один ValueRangeProvider для переменной имеет смысл для меня. Я дам вам знать результаты. – Mene

Смежные вопросы