Чоко Солвер поколение математических выражений

Я хочу использовать 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 (через арифм и / или ограничение по времени)

Другие вопросы по тегам