0

我想在 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]];
4

1 回答 1

0

您需要为每个测试具体化约束,xCategory[i]!= xCategory[j]并将具体化的结果放在BoolVar包含在 a 中的 a 中BoolVar[][] cMatrix。然后您发布该矩阵or中每个向量的约束BoolVar[],将其保存在您的cSelected(也是 a BoolVarArray,而不是 a 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();
}
于 2018-12-06T18:57:10.893 回答