Шоколадный решатель старого класса

Я нашел этот код для решения программы магического квадрата с помощью решателя шоколада:

public static void main(String[] args) {
    int n = 4;
    System.out.println("Magic Square Problem with n = " + n);

    Problem myPb = new Problem();

    IntVar[] vars = new IntVar[n * n];
    for (int i = 0; i < n; i++)
        for (int j = 0; j < n; j++) {
        vars[i * n + j] = myPb.makeEnumIntVar("C" + i + "_" + j, 1, n * n);
    }
    IntVar sum = myPb.makeEnumIntVar("S", 1, n * n * (n * n + 1) / 2);

    myPb.post(myPb.eq(sum, n * (n*n + 1) / 2));
    for (int i = 0; i < n * n; i++)
        for (int j = 0; j < i; j++)
        myPb.post(myPb.neq(vars[i], vars[j]));

    int[] coeffs = new int[n];
    for (int i = 0; i < n; i++) {
       coeffs[i] = 1;
    }

    for (int i = 0; i < n; i++) {
    IntVar[] col = new IntVar[n];
    IntVar[] row = new IntVar[n];

    for (int j = 0; j < n; j++) {
        col[j] = vars[i * n + j];
        row[j] = vars[j * n + i];
    }

    myPb.post(myPb.eq(myPb.scalar(coeffs, row), sum));
    myPb.post(myPb.eq(myPb.scalar(coeffs, col), sum));

    myPb.solve();
}    

Но класс «Проблема», кажется, был заменен классом «Модель». Правильно ли использовать Model.intVar вместо Problem.makeEnumIntVar? Какой будет текущая функция, которая заменит Problem.neq, Problem.eq и Problem.scalar?


person user3742929    schedule 28.11.2017    source источник


Ответы (1)


Похоже, у вас есть какой-то устаревший код. Выражения

Problem.scalar and Problem.eq

можно выразить как

int capacity = 34;  // max capacity
int[] volumes = new int[]{7, 5, 3};

 // Problem.scalar
model.scalar(new IntVar[]{obj1, obj2, obj3}, volumes, "=", capacity).post();

// Problem.eq   
model.arithm(obj1, "=", obj2).post(); 

Приведенный выше код, например, выражает ограничение, согласно которому скалярное произведение равно capacity и что obj1 должно быть равно obj2.

Дополнительная литература и ресурсы:

Здесь вы найдете новейшее руководство с примерами кода: choco tutorial

Наконец, вы также можете ознакомиться с тестовыми примерами на github:https://github.com/chocoteam/choco-solver/tree/master/src/test/java/org/chocosolver/solver

Особенно вам могут быть интересны тесты для переменных и выражений.

Еще несколько примеров кода можно найти здесь: дополнительные примеры кода

person Tobi Tiggers    schedule 02.12.2017