繁体   English   中英

矩阵 Choco3 中列的约束

[英]Constraint for column in matrix Choco3

我最近开始使用 Java 的 Choco3 库进行约束编程,但我遇到了一个不知道如何解决的问题

我创建了矩阵

IntVar[][] matrix = VariableFactory.boundedMatrix("Matrix", 31, 14, 0, 3, solver);

我为行设置约束:

IntVar numberOfDays = VariableFactory.bounded("NumberOfDays", 5, 5, solver);
IntVar numberOfShortDays = VariableFactory.bounded("NumberOfShortDays", 2, 2, solver);
IntVar numberOfNights = VariableFactory.bounded("NumberOfNights", 5, 6, solver);

for (IntVar[] row : matrix ) {
    solver.post(ICF.among(numberOfDays, row, new int[]{1}));
    solver.post(ICF.among(numberOfShortDays, row, new int[]{2}));
    solver.post(ICF.among(numberOfNights, row, new int[]{3}));
}

现在我想为列设置特定的约束:

IntVar numberOfDayShifts = VariableFactory.bounded("NumberOfDayShifts", 2, 4, solver);
IntVar numberOfNightShifts = VariableFactory.fixed(2, solver);

solver.post(ICF.among(numberOfDayShifts, oneColumn, new int[]{1, 2}));
solver.post(ICF.among(numberOfNightShifts, oneColumn, new int[]{3}));

你知道我怎样才能做到这一点吗?

编辑:我试图通过以下代码转置矩阵并将其放入另一个变量中:

IntVar[][] transposedMatrix= VariableFactory.boundedMatrix("TransposedMatrix", 14, 31, 0, 3, solver);

for (int i = 0; i < 31; i++) {
    for (int j = 0; j < 14; j++) {
        transposedMatrix[j][i] = matrix[i][j];
    }
}

并设置前面提到的约束,但是对于复杂度低得多的矩阵(3x14),解决它所需的时间比我预期的要长得多(超过 1 小时,然后我停止了它),所以我什至无法想象需要多少时间解决 31x14 问题...还有其他可能的解决方案吗?

您可以使用 ArrayUtils.getColumn(matrix, colIndex);

最好,

Jean-Guillaume Fages www.cosling.com

使用 ArrayUtils 有更好的方法来做到这一点:

    IntVar[][] transposedMatrix;
    transposedMatrix = matrix.clone();
    org.chocosolver.util.tools.ArrayUtils.transpose(transposedMatrix);

(因为我来晚了一点,也许当你问你的问题时这个功能不存在)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM