Чоко Солвер поколение математических выражений
Я хочу использовать Choco Solver для написания Java-программы, которая генерирует математические задачи, которые удовлетворяют ряду ограничений. Проблемы должны принять следующую форму:
x @ y ∆ z = r
Куда:
x
,y
&z
являются положительными целыми числами, не обязательно отличающимися друг от друга, причем одно из них имеет длину 2 цифры, а два других - 1 цифру@
&∆
являются операторами +, - или * (обратите внимание, что оба могут также обозначать одного и того же оператора)r
является положительным 1-значным целым числом
Я хочу генерировать эти математические задачи "по требованию" (как, например, по одному), и они должны быть рандомизированы (то есть не должно быть никакого шаблона или фиксированного порядка в сгенерированных задачах).
Прошло уже более 10 лет с тех пор, как я занимался программированием с ограничением (удовлетворением), но я считаю, что C(S)P (предпочтительно с помощью Choco) является подходящим инструментом для применения здесь. Это правильно и может кто-нибудь помочь мне начать?
2 ответа
Вы, конечно, можете смоделировать такую проблему с помощью решателя CP, такого как choco. Вам нужно взглянуть на документацию и руководства для получения более подробной информации, но вам потребуется:
- создать
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
комбинируются в зависимости от вашего случайного селектора. Затем вы можете попытаться закодировать выражение с помощью ограничений таблицы или позволить решателю выбрать.
Все есть в документации и официальных руководствах ( http://choco-tuto.readthedocs.io/en/latest/). Если вы чувствуете, что это слишком сложно, посмотрите на этот ультра простой пример ( https://www.cosling.com/choco-solver/hello-world). Он показывает, как сделать a+b<8, из чего вы можете сделать: x@y=A A delta z =r (через арифм и / или ограничение по времени)