逐列公式CPLEX-在列中添加新约束集

时间:2013-08-06 13:53:20

标签: c callable cplex

我使用C / C ++的可调用库来编写集合分区公式。我使用柱状配方。 我有两组约束。

每当我添加列时,我都会使用:

for (i = 1; i <= colIdx ; i++) {   //For all columns
   ...
     status = CPXaddcols(env, lp, 1, colNum, obj, cmatbeg, cmatind , cmatval,
        lb, ub, NULL);}

然而; colNum,cmatind和约束意义对于这两个约束集是不同的。如果我使用另一个CPXaddcols作为第二个约束集,它会添加新变量,但我只想在给定列中添加新行。

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

是的,您可以通过一次调用CPXaddcols.

为您的CPLEX问题添加多行(约束)

请确保在致电CPXcreateprob之后,在您拨打上面的CPXaddcols之前,您已拨打适当的CPXnewrows来通知CPLEX这些限制是非零的

由于CPLEX帮助说明here

CPXaddcols cannot add coefficients in rows that do not already exist (that is, in rows with index greater than the number returned by CPXgetnumrows); 
[...]
The routine CPXnewrows can be used to add empty rows before adding new columns via CPXaddcols. 

另外,只需确保添加变量时colNum实际上是指您要在新列中添加的非零值的数量。

This example有一个实例,每次调用CPXaddcols都会将变量添加到两个约束中。

特别仔细查看这部分代码:

    /* Add flow variables */

   for (j = 0; j < NUMEDGES; j++) {
      ind[0] = orig[j];  /* Flow leaves origin */
      val[0] = -1.0;
      ind[1] = dest[j];  /* Flow arrives at destination */
      val[1] =  1.0;

      name[0] = buffer;
      sprintf(buffer, "x%d%d", orig[j], dest[j]);

      status = CPXaddcols (env, lp, 1, 2, &unitcost[j], &zero, ind, val,
                           NULL, NULL, name);

希望有所帮助。