0

我有一组方程。我还有一组值和方程的结果。就像是:

a + b + c = x

一些分配可能是:

1 + 1 + 1 = 3

2 + 3 + 4 = 9

但是,实际方程要长得多,并且可能包含一些函数,例如对数。

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

我想我可以通过将方程式更改为 CSP 来解决这个问题

(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 对于这类问题是否可行?似乎所有PlanningVariables 都必须来自 List 并且必须是实例,而我只有整数值。我的模型正确吗?

4

1 回答 1

1

您可以将每个整数变量包装在实体类中,如下所示:

@PlanningEntity
public class MyEntity {

   private Integer myVariable;

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

此外,使用计划实体范围来定义每个变量的范围(因为每个实体都不同),请参阅官方文档部分“4.3.5.2.2. 计划实体上的 ValueRangeProvider”(并且不要使用 SwapMove,只有 ChangeMove 的 I猜测)。

但总的来说,我不能 100% 确定这是否是适合这项工作的工具。我很想知道您对这个用例的体验会产生什么结果。

PS:从 6.1.0.Beta1(尚未发布,但 nightlies 可用)开始,我们在“4.3.5.2.4.ValueRangeFactory”部分的nightly 文档中记录了 IntValueRange,这对于这类用例更有效.

于 2014-02-06T09:28:54.933 回答