我使用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作为第二个约束集,它会添加新变量,但我只想在给定列中添加新行。
我该如何解决这个问题?
答案 0 :(得分:1)
是的,您可以通过一次调用CPXaddcols.
请确保在致电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);
希望有所帮助。