0

現在、IBM ILOG CPLEX Optimization Studio を使用して CPLEX/OPL モデルをプログラミングしています。サブセットを含み、別のパラメーター/変数に依存する合計またはインデックスの使用に問題があります。たとえば、次の制約を確認してください: NB 2,3,4,8)。

これらの制約を適切に組み込むのを手伝ってくれる人はいますか?

添付のソース コードを見つけてください。

  //Parameter

int maxblock=...;                   //number of blocks (I)
int maxprodfam=...;             //number of product families (J)
int maxprod=...;                    //number of products (P)
int maxdemand=...;                  //number of demand elements (K)

range blocks=1..maxblock;
range prodfam=1..maxprodfam;
range products=1..maxprod;
range demandelements=1..maxdemand;

int startalpha[blocks]=...;     //earliest start time of block i
int endalpha[blocks]=...;       //latest completion time of block i
int prodtime[products]=...;     //unit production time for product p (a)
int minorsetup[products]=...;   //minor setup time per sub-lot of product p (s)
int majorsetup[prodfam]=...;        //major setup time for product family j (S)
int demand[products]=...;           //demand elements (d)

//Variablen

dvar int+ x[blocks][demandelements];    //quantity of demand element k satisfied from production in block i (x)
dvar boolean y[blocks][prodfam];        //product family assessment to blocks (y)
dvar boolean q[blocks][products];       //product assessment to blocks 
dvar boolean o[blocks];             //activation of blocks (e.g. if a prodfam is assignes to it)
dvar int+ alpha[blocks];                //start time block
dvar int+ duration[blocks];         //duration of block

 //Modell

minimize
alpha[maxblock]+duration[maxblock]; //objective function (minimize the makespan)

subject to {
 forall(i in blocks)
   NB1: //one product family assigned to each block
    sum(j in prodfam)
      y[i][j]==o[i];

 forall(i in blocks, j in prodfam)
   NB2: //production sub-lots
    sum(p in products(j))q[i][p]<=y[i][j]*abs(products(j));

 forall(i in blocks, k in demandelements(i))
   NB3: //product flow from block i into demand element k
    x[i][k]<=demand[k]*q[i][p(k)];

 forall(i in blocks)
   NB4: //block schedule
    duration[i]==sum(j in prodfam)majorsetup[j]*y[i][j]
    +sum(p in products)minorsetup[p]*q[i][p]
    +sum(k in demandelements(i))alpha[p(k)]*x[i][k];

 forall(i in 2..maxblock)
   NB5: //block starts when other block finished
    alpha[i]>=alpha[i-1]+duration[i-1];

 forall(i in blocks)
   NB6: //time window earliest start
    alpha[i]>=startalpha[i]*o[i];

 forall(i in blocks)
   NB7: //time window latest completion
    alpha[i]+duration[i]<=endalpha[i];

 forall(k in demandelements)
   NB8: //matching output and demand
    sum(i in blocks(k))x[i][k]==demand[k];
}
4

1 に答える 1

0

あなたの問題が何であるかは明らかではありませんが、制約 2 で製品 (j) のようなものをモデル化することに問題があると推測しています。インストールの一部として提供される OPL の例に、この例があります。たとえば、examples\opl\models\AssemblySequencing\Sequence モデルでは、

{string} computer[AllComputers] = ...;

したがって、たとえば次のようなことができます

{int} productsInFamily[prodfam] = ...;

編集:新しい構造を使用して...次のようなものを試してください:

 forall(i in blocks, j in prodfam)
   NB2: //production sub-lots
    sum(p in productsInFamily[j])q[i][p]<=y[i][j]*abs(products(j));

この種のデータ構造を行う方法は他にもたくさんあります。より効率的な方法もあれば、ビジネスの観点からより理にかなっている方法もあります。私は個人的に、もののセット、特にタプルのセットを扱うのが好きです。適切なデータ構造を持つことは常にモデリングに役立つため、データ構造のタイプと OPL でそれらを組み合わせる方法を理解してください。

于 2015-05-05T05:45:59.150 に答える