【问题标题】:Solving equations as CSP用 CSP 求解方程
【发布时间】:2014-02-05 23:41:52
【问题描述】:

我有一组方程式。我还有一组值和方程的结果。 比如:

a + b + c = x

有些分配可能是:

1 + 1 + 1 = 3

2 + 3 + 4 = 9

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

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

我认为我可以通过将 eqation 更改为 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 都必须来自一个列表并且必须是实例,而我只有整数值。我的模型正确吗?

【问题讨论】:

  • 线性规划方法可能更简单。你考虑过吗?
  • 我不认为线性规划是可行的,因为方程不一定是线性的。

标签: constraint-programming optaplanner


【解决方案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(尚未发布,但可以使用 nightlies)开始,我们在“4.3.5.2.4.ValueRangeFactory”部分的nightly docs 中记录了 IntValueRange,这对这些更有效各种用例。

【讨论】:

  • 感谢您的提示。每个变量都有一个 ValueRangeProvider 对我来说很有意义。我会让你知道结果。
猜你喜欢
  • 2020-08-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-22
  • 2017-06-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多