将方程解为CSP

时间:2014-02-05 23:41:52

标签: constraint-programming optaplanner

我有一套方程式。我也有一组值和等式的结果。 类似的东西:

a + b + c = x

并且一些分配可能是:

1 + 1 + 1 = 3

2 + 3 + 4 = 9

然而,实际的方程式要长得多,并且可能包含一些函数,例如对数。

我现在需要改变给定集合的结果,使得(1)等式变得等于特定值xx和(2)参数变化尽可能小。

我认为我可以通过改变方案

来解决这个问题
(a + ax) + (b + bx) + (c + cx) = xx

其中a,b和c对应于旧值,ax,bx和cx是需要应用于相应旧值的差异。而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将是一个硬约束。 最小化所有ax,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必须来自List并且必须是实例,而我只有整数值。我的模特是否正确?

1 个答案:

答案 0 :(得分: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,如“{3}}”中“4.3.5.2.4.ValueRangeFactory”部分所述,效率更高对于这些用例。