1

C/C++ の呼び出し可能なライブラリを使用して、セット パーティショニングの定式化をコーディングします。カラム状の製剤を使用しています。制約のクラスターが 2 つあります。

列を追加するたびに、次を使用します。

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

でも; これら 2 つの制約セットでは、colNum、cmatind、および制約の意味が異なります。2 番目の制約セットに別の CPXaddcols を使用すると、新しい変数が追加されますが、特定の列内に新しい行を追加したいだけです。

この問題を解決するにはどうすればよいですか?

4

1 に答える 1

1

はい、1 回の呼び出しで CPLEX 問題に複数の行 (制約) を追加できます。CPXaddcols.

CPXcreateprob呼び出しの後、上記を呼び出す前CPXaddcolsに、適切な数の を呼び出してCPXnewrows、これらの制約がゼロでないことを CPLEX に通知していることを確認してください。

CPLEXヘルプがここに述べているように

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に、新しい列に追加するゼロ以外の値の数を実際に参照していることを確認してください。

この例には、 を呼び出すたびCPXaddcolsに変数が 2 つの制約に追加されるインスタンスがあります。

具体的には、コードの次の部分をよく見てください。

    /* 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);

それが役立つことを願っています。

于 2013-08-06T18:26:26.563 に答える