Choco Solver 数学表达式生成

Mat*_*ias -1 java constraint-programming choco

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

x @ y ? z = r
Run Code Online (Sandbox Code Playgroud)

在哪里:

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

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

  • ? r是一位正整数

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

自从我做约束(满足)编程以来已经有 10 多年了,但我相信 C(S)P(最好通过 Choco 的方式)是一个适合在这里应用的工具。这是正确的,有人可以帮助我开始吗?

小智 5

您当然可以使用像 choco 这样的 CP 求解器对此类问题进行建模。您需要查看文档教程以获取更多详细信息,但您需要:

  • 创建一个Model
  • 声明整数变量(IntVar)为xyz
  • 要将它们与约束联系起来,我建议使用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();
Run Code Online (Sandbox Code Playgroud)

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