我想使用Choco solver编写一个Java程序来生成满足许多约束的数学问题。 问题必须采取以下形式:
x @ y ∆ z = r
其中:
x
,y
& z
是正整数,不一定彼此不同,其中一个长2位,另外两个长1位
@
& ∆
是运算符+, - 或*(请注意,两者也可以代表同一个运算符)
r
是一个正的1位整数
我想“按需”生成这些数学问题(如同一个,当时),并且需要随机化(即在生成的问题中不应该没有模式或固定顺序)。
自从我完成约束(满意度)编程以来已经超过10年,但我相信C(S)P(最好是通过Choco),是适用于此处的工具。 这是正确的,有人可以帮助我开始吗?
答案 0 :(得分:3)
您当然可以使用像choco这样的CP求解器来模拟这样的问题。 您需要查看documentation和tutorials以获取更多详细信息,但您需要:
Model
,IntVar
,x
和y
,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();
组合add
,sub
和mul
的方式取决于您的随机选择器。
然后,您可以尝试使用表约束对表达式进行编码,或让解算器选择。
答案 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 (通过算术和/或时间约束)