-1

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

x @ y ∆ z = r

在哪里:

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

  • @&∆</code> are operators +, - or * (note that both can also stand for the same operator)

  • ‎<code>r是一个正的 1 位整数

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

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

4

2 回答 2

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();

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

于 2017-11-16T08:46:52.510 回答
1

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

于 2017-11-16T08:37:02.520 回答