Choco Solver数学表达式生成

时间:2017-11-15 21:08:22

标签: java constraint-programming choco

我想使用Choco solver编写一个Java程序来生成满足许多约束的数学问题。 问题必须采取以下形式:

x @ y ∆ z = r

其中:

  • xy& z是正整数,不一定彼此不同,其中一个长2位,另外两个长1位

  • @& 是运算符+, - 或*(请注意,两者也可以代表同一个运算符)

  • r是一个正的1位整数

我想“按需”生成这些数学问题(如同一个,当时),并且需要随机化(即在生成的问题中不应该没有模式或固定顺序)。

自从我完成约束(满意度)编程以来已经超过10年,但我相信C(S)P(最好是通过Choco),是适用于此处的工具。 这是正确的,有人可以帮助我开始吗?

2 个答案:

答案 0 :(得分:3)

您当然可以使用像choco这样的CP求解器来模拟这样的问题。 您需要查看documentationtutorials以获取更多详细信息,但您需要:

  • 创建Model
  • IntVarxy
  • 声明整数变量(z
  • 将它们与约束相关联,我建议使用IntVar表达式API来简化声明。这样的API允许构建算术,逻辑和关系表达式,如。

这是一个简单的例子:

Model model = new Model();
IntVar x = model.intVar(0, 9);
IntVar y = model.intVar(0, 9);
IntVar z = model.intVar(0, 9);
int r = 10;
x.add(y).sub(z).eq(r).post(); 
model.getSolver().showSolutions(
    () -> String.format("%d + %d - %d = %d",
            x.getValue(), y.getValue(), z.getValue(), r));
model.getSolver().findAllSolutions();

组合addsubmul的方式取决于您的随机选择器。 然后,您可以尝试使用表约束对表达式进行编码,或让解算器选择。

答案 1 :(得分:1)

所有内容都在文档和官方教程中(http://choco-tuto.readthedocs.io/en/latest/)。如果你觉得这太复杂了,请看这个超简单的例子(https://www.cosling.com/choco-solver/hello-world)。它显示了如何使a + b <8,你可以做到: X @ Y = A Δz= r (通过算术和/或时间约束)