我有一套方程式。我也有一组值和等式的结果。 类似的东西:
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并且必须是实例,而我只有整数值。我的模特是否正确?
答案 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”部分所述,效率更高对于这些用例。