2017-11-08 10 views
0

私はCPLEXの実験をしていますし、「制限数」制約は問題が実行不可能になります...CPLEX実行不可能なソリューション

作業が正常上限制約なしに行われます。 ハブDCに接続しているディーラーの数を制限したいと思います。 私は数日間それを理解することはできません。

マイコード:ドキュメントのIDEとOPL> CPLEX StudioのIDE> IDEのチュートリアルで

> 
execute PARAMS { 
    cplex.tilim = 43200; 
// cplex.tilim = 10; 
} 

// parameters 
int nDealer = ...; 
int nSite = ...; 
range dealer = 1..nDealer; // destinations 
range site = 1..nSite; // distribution centers (candidate sites for hub and depot) 

int numHub = ...; 
int numDepot = ...; 
int limit = ...; 
float flow[dealer] = ...; 
float capacity[site] = ...; 
float xDealer[dealer] = ...; 
float yDealer[dealer] = ...; 
float xSite[site] = ...; 
float ySite[site] = ...; 
float dist[dealer][site]; 
float distSite[site][site]; 
float M; 

dvar boolean a[dealer][site]; // alpha_ij = 1 if dest i uses DC j 
dvar boolean b[site]; // beta_j = 1 if DC (hub) j is established 
dvar boolean c[site]; // gamma_k = 1 if DC (depot) k is established 
dvar boolean w[site][site]; // w_jk = 1 if hub j is connected to depot k. 
dvar float volume[site]; // total flow volume assigned to DC j 
dvar boolean z[dealer][site]; 

execute DISTANCE { // Euclidean Distance 
    for (var i in dealer) { 
     for (var j in site) { 
      dist[i][j] = Opl.sqrt(Opl.pow(xDealer[i] - xSite[j], 2) + Opl.pow(yDealer[i] - ySite[j], 2));  
     } 
    } 
    for (var j in site) { 
     for (var k in site) { 
      distSite[j][k] = Opl.sqrt(Opl.pow(xSite[j] - xSite[k], 2) + Opl.pow(ySite[j] - ySite[k], 2)); 
     } 
    } 
    M = 0; 
    for (var i in dealer) { 
     M += flow[i]; 
    } 
} 

// models 
minimize sum(i in dealer) flow[i] 
    * (sum(j in site) (dist[i][j] * a[i][j] + sum(k in site) distSite[k][j] * w[k][j])); 
/* wrong Obj Func 
minimize sum(i in dest, j in DC) (flow[i] * dist[i][j] * a[i][j] 
     + (sum(k in DC : j != k) (flow[i] * distDC[j][k] * w[j][k]))); // sum(f_i * sum(metro + regional)) 
*/ 

subject to { 

    sum(j in site) (b[j]) == numHub; 
    sum(k in site) (c[k]) == numDepot; 

    forall(i in dealer) { 
     sum(j in site) (a[i][j]) == 1; 

     forall(j in site) { 
      a[i][j] <= b[j] + c[j];  
     } 
    } 

    // w[j][k] <= b[j] * c[k] 
    // Hub j can be connected to a single depot. 
    forall(j in site) { 
     b[j] + c[j] <= 1; 

     // capacity restriction 
     // volume = metro + regional 
     volume[j] == sum(i in dealer) flow[i] 
        * (a[i][j] + (sum(k in site : k != j) a[i][k] * w[j][k])); 
     volume[j] <= capacity[j] + M * (1 - b[j]); // only Hub concerned with its capacity 

     forall(k in site : j != k) { 
      2 * w[j][k] <= b[j] + c[k]; 
     } 
    } 

    // at least 1 hub must be connected to depot 
    forall(k in site) { 
     sum(j in site : j != k) (w[j][k]) == c[k]; 
    } 


    forall (j in site){ 
     forall (i in dealer){ 
      ((a[i][j]+b[j])/2) <= z[i][j]; 
     } 

     sum(i in dealer) (z[i][j]) <= limit; 
    } 
} 

答えて

0

あなたはあなたを助ける取得するために実行不可能なモデルに

プラスリラックス

で顔をしている可能性があり.dat

について

0

問題のサイズや課す制限に関する情報がありません。あなたはちょうど限界をあまりにも小さくしようとしているかもしれません - 私たちは教えてくれません。

2つのことをしようとする:

まず、あなたがあなたの限界の制約を残せば、あなたは、z [i]は[J]の変数にどのような値を得るのですか?これらの価値観は合理的かつ賢明に見えますか?そうでなければ、配合や入力データに間違いがあるかもしれません。

第2に、上限に大きな値(例えば、制約のない場合のz [i] [j]の値よりも大きい)を含む制限制約を含めると、同じ解決策が得られます。制限の値を減らして、再解決してみてください。問題が実行不能になる限界値を見つけなければなりません。その限界値の周りで何が起こるかを調べ、残りのソリューション値がどうなるかを見てください。

関連する問題