2

问题的简要说明。我有许多对象,我们称这个对象为 X。每个 X 可以分配给多个容器 Y。每个 Y,每个 X 需要两个。每个 X 都有一个属性 L。每个 Y 都有其 L 级别的最小规范,即分配给特定 Y 的两个 X 必须等于或超过 Y 的 L 规范。

        X is an array of structs with field L (single value) with values 0 to 5
        Y is an array of structs with field L (single value) with values 0 to 8
        CP cp = new CP();
        IIntVar[] dies = cp.IntVarArray(X.size(), 0, 10);
        IIntVar[] YvarL= cp.IntVarArray(Y.size(), 0, 10);
        for (int i = 1; i <= Y.Lenth; i++)
        {
            IIntExpr tempL = cp.IfThen(cp.Eq(dies[0], i), cp.Sum(YvarL[i], X[0].L));
            for (int j = 1; j < X.Length(); j++)
                cp.IfThen(cp.Eq(dies[j], i), cp.Sum(YvarL[i], X[j].L);
            cp.Add(cp.Ge(YvarL[i], Y[i].L)
        }

但我在第 5 行收到一个错误,说 Argument 2: Cannot convert from 'ILOG.Concert.IIntExpr' to 'ILOG.Constraint.IConstraint'

我想要完成的是,对于所有值为“i”的“死”决策变量,它们对应的 X 变量的“L”属性字段的总和必须超过 Y[i] 的“L”字段属性(这里 dies 对应于 X)

4

1 回答 1

1

Opl 是对的:cp.Sum(YvarL[i], X[0].L)是一个整数表达式,而 ifThen构造需要一个约束参数。

于 2019-12-06T17:52:55.500 回答