Моделирование ограничения с использованием Choco Solver - PullRequest
0 голосов
/ 05 декабря 2018

Я хочу смоделировать следующее ограничение в CHOCO.Любая помощь, пожалуйста

    //cSelected[i]=1 ==> ∀ j∈{1,…,i-1} xCategory[i]!= xCategory[j] 
      cSelected[i]=0, otherwise

это то, что я пытаюсь сделать

        int[] x  =      new int[]{0,  1, 0,  0, 1, 0};
        int[] xCategory  = new int[]{3,  1, 2,  2, 3, 0};
        int[] xCategorySize  = new int[]{0,  100, 200,  300};
        IntVar[] cSelected = model.intVarArray("d", 6, 0, 1);

    // 3. Post constraints
        // i want to add and post this constraint:
        //cSelected [i]=1 ==> ∀ j∈{1,…,i-1} xCategory[i]!= xCategory[j] 
        //cSelected [i]=0, otherwise

        for (int i=0; i<x.length;i++)
        sum += (1-x[i]) * cSelected[i].getValue() * xCategorySize[xCategory[i]];

1 Ответ

0 голосов
/ 06 декабря 2018

Вам нужно будет повторно ограничить ограничение для каждого теста xCategory[i]!= xCategory[j] и поместить результат преобразования в BoolVar, содержащийся в BoolVar[][] cMatrix.Затем вы публикуете ограничение or для каждого вектора BoolVar[] в этой матрице, сохраняя его в своем cSelected (который также является BoolVarArray, а не IntVarArray):

for (int i=0; i<x.length;i++){
    for (int j=0; j<x.length;j++){
        xCategory[i].neq(xCategory[j]).reifyWith(cMatrix[i][j]);
    }
    cSelected[i] = model.or(cMatrix[i]).reify();
}
...