簡體   English   中英

如何修復 Cplex 中的“無解決方案”錯誤

[英]How can I fix "No solution" error in Cplex

我有一個關於多產品、多層次供應鏈網絡的 model 網絡包括以下數量:1. 固定地點的制造地點,2. 未知地點的倉庫和配送中心(從一組潛在地點中選擇),3 .固定位置的客戶區。 這是一個混合整數線性規划優化問題。 需要確定的決策包括要建立的倉庫和配送中心的數量、位置和容量,需要在網絡中建立的運輸鏈路,以及物料的流量和生產率。 目標是總成本最小化。 model 仍然運行,但它只顯示我插入的數據,沒有解決方案 這是我的數據的鏈接: https://drive.google.com/drive/folders/1-hHGvR0j2y6ojsBQIi?ussharing .mod

 int bigM=100000000;
 range M=1..6; // number of warehouse
 range K=1..15; // number of DC
 range KSS=1..3;
 range notKSS=4..15;
 range L=1..18; // number of customer zone
 range J=1..3; // number of plant
 range I=1..14; // number different type of product
 range E=1..6; // number of resources
 range R=1..4; //
 range place=1..3; // 1 UK, 2 ES, 3 IT
 int m;
 int k;
 int l;
 int j;
 int i;
 int e;
 int r;
  //table 3
 float p_ije0[1..6, 1..3*14] = ...;
 float p_ije[i in I, j in J, e in E] = p_ije0[e,i+14*(j-1)];
 float r_je[J][E]=...;
 float p_max[I][J]=...; // max capacity production of product i by plant j (table 2)
 float cp[J][I]=...; //unit production cost (table 4)
 float c_wm[M]=...; //establish cost of warehouse at position m (table 5)
 float c_dk[K]=...; //establish cost of DC at position k (table 5)
 float c_wh[I][M]=...;//handling cost wh m handle product i (table 5)
 float c_dh[I][K]=...;//handling cost dc k handle product i (table 5) 
 //table 7
 float c_ijm0[1..3,1..14*6]=...;
 float c_ijm[i in 1..14,j in 1..3,m in 1..6]=c_ijm0[j,i+6*(m-1)];// 
 //table 8
 float c_imk0[1..6,1..14*15]=...; 
 float c_imk[i in 1..14,m in 1..6,k in 1..15]=c_imk0[m,i+14*(k-1)];//unit transportation cost from wh m to dc k of product family f (table 8)
 //table 9
 float c_ikl0[1..15,1..14*18]=...;
 float c_ikl[i in 1..14,k in 1..15, l in 1..18]=c_ikl0[k,i+14*(l-1)]; //unit transportation cost from dc k to customer zone l of product family f (table 9)
 
 float c_r[R]=...; //transportation cost relative to the flow range (table 10)
 float d_li[I][L]=...;// product demand of product i in zone l(table 11)
 int w_max=14000; // max wh capa
 int w_min=10; //
 float ca_j[place]=...; // production capacity of plant j (table 12)
 float c_j[place]=...;// manufaturing cost of plant j (table 12)
 //table 13
 float c_w[place]=...;// infrastructure cost of wh m 
 float c_wt[place]=...;//warehouse throughput 
 float c_hw[place]=...; // wh handling cost 
 //table 14
 float c_d[place]=...;// infrastructure cost of dc k 
 float c_dt[place]=...;// dc throughput 
 float c_hd[place]=...; // dc handling cost 
 //table 14
 int d_max=7000;//max dc capa
 int d_min=10;
 int a=1;
 int b=1;
 int q_bound[R]=...;
 int q_lower[R]=...;
 float cost_upper[R]=...;
 float cost_lower[R]=...;
 dvar boolean y1[M]; // 1 if warehouse at position m is established, otherwise 0
 dvar boolean y2[K]; // 1 if dc at position k is establish, otherwise 0
 dvar boolean x1[M][K]; // 1 if warehouse m supply DC k
 dvar boolean x2[K][L]; // 1 if DC k supply customer zone l 
 dvar float w[M]; // capacity of warehouse m
 dvar float d[K]; // capacity of DC k
 dvar float p[I][J]; // production rate of product i by plant j
 dvar float q1[I][J][M]; // rate of flow of product i from plant j to warehouse m
 dvar float q2[I][M][K]; // rate of flow of product i from warehouse m to DC k
 dvar float q3[I][K][L]; // rate of flow of product i from DC k to customer zone l
 dvar boolean z1[I][J][M][R];
 dvar boolean z2[I][M][K][R];
 dvar boolean z3[I][K][L][R];
 dvar float Q_1[I][J][M][R];
 dvar float Q_2[I][M][K][R];
 dvar float Q_3[I][K][L][R];


 
 
 minimize (sum(m in M) c_wm[m]*y1[m] + sum(k in K) c_dk[k]*y2[k] +sum(i in I, j in J) cp[j][i]*p[i][j] + sum(i in I, m in M) c_wh[i][m]*(sum(j in J)q1[i][j][m])+sum(i in I, k in K)c_dh[i][k]*(sum( m in M)q2[i][m][k]))+ sum( i in I, j in J, m in M)c_ijm[i][j][m]+sum(i in I, m in M, k in K)c_imk[i][m][k]+sum(i in I, k in K, l in L)c_ikl[i][k][l]);

 subject to {
   forall(m in M, k in K)
     x1[m][k] <= y1[m]; // (1)
   forall (k in KSS)
    sum(m in M) x1[m][k]==y2[k]; //(2)
   forall (m in M,k in notKSS)
     x1[m][k]<=y2[k];  //(3)
   forall (k in K,l in L)
     x2[k][l]<=y2[k]; //(4)
   forall(l in L)
     sum(k in K) x2[k][l]==1; //(5)
   forall (i in I, j in J, m in M)
     q1[i][j][m] <= 40*y1[m]; //(6)
   forall (i in I, m in M, k in K)
     q2[i][m][k] <= 40*x1[m][k]; //(7)
   forall (i in I, l in L, k in K)
     q3[i][k][l] <= 40*x2[k][l]; //(8)
   forall ( m in M, k in K)
     sum(i in I)q2[i][m][k]>=2*x1[m][k]; //(9)
   forall ( k in K, l in L)
     sum(i in I)q3[i][k][l]>=2*x2[k][l];  //(10)
   forall( i in I,j in J)
   p[i][j]==sum(m in M) q1[i][j][m]; //(11)
   forall(i in I, m in M)
     sum(j in J) q1[i][j][m]== sum(k in K) q2[i][m][k]; //(12)
   forall(i in I, k in K)
     sum(m in M) q2[i][m][k]==sum(l in L) q3[i][k][l]; //(13)
   forall(i in I, l in L)
     sum(k in K) q3[i][k][l]== d_li[i][l];  //(14)
   forall(i in I, j in J)
     5<=p[i][j] && p[i][j]<=p_max[i][j]; //(15)
   forall(j in J, e in E)
    sum(i in I)p_ije[i][j][e]*p[i][j]<= r_je[j][e] ; //(16)
   forall(m in M)
      w[m]<=w_max*y1[m] &&  w[m]>=w_min*y1[m] ;  //(17)  
   forall (k in K)  //18
      d[k]<=d_max*y2[k] && d[k]>=d_min*y2[k];
   forall(m in M)
     w[m]>=sum(i in I, k in K)a*q2[i][m][k]; //(19)
   forall (k in K)
     d[k]>=sum(i in I, l in L)b*q3[i][k][l]; //(20)
   forall(i in I, j in J) //(21)
     p[i][j]>=0;  
   forall(i in I, j in J, m in M) //(22)
     q1[i][j][m]>=0;
   forall(i in I, m in M,k in K)
     q2[i][m][k]>=0; //(23)
   forall(i in I, k in K, l in L)
     q3[i][k][l]>=0; //(24)    
   forall(i in I, j in J, m in M)
   sum(r in R) z1[i][j][m][r]==1; //(29)
   forall(i in I, j in J, m in M, r in R)
     q_bound[r]*z1[i][j][m][r]>=Q_1[i][j][m][r] && q_lower[r]*z1[i][j][m][r]<=Q_1[i][j][m][r]; //(30)
   forall(i in I, j in J, m in M)
     sum(i in I)q1[i][j][m]== sum(r in R)q_bound[r]; //(31)
   forall(i in I, j in J, m in M) //(32)
     c_ijm[i][j][m]==sum(r in R) (cost_lower[r]*z1[i][j][m][r]+(q_bound[r]-q_lower[r]*z1[i][j][m][r])*(cost_upper[r]-cost_lower[r])/(q_bound[r]-q_lower[r]));
   forall(i in I, m in M, k in K) //(33)
     sum(r in R)z2[i][m][k][r]==1;     
   forall(i in I, m in M, k in K, r in R) //(34)
       q_bound[r]*z2[i][m][k][r]>=Q_2[i][m][k][r] && q_lower[r]*z2[i][m][k][r]<=Q_2[i][m][k][r];  
   forall(i in I, m in M, k in K) //(35)
     sum(i in I)q2[i][m][k]==sum(r in R)q_bound[r];  
   forall(i in 1..3, m in 1..6, k in 1..15) //(36)
     c_imk[m][i][k]==sum(r in R) (cost_lower[r]*z2[i][m][k][r]+(q_bound[r]-q_lower[r]*z2[i][m][k][r])*(cost_upper[r]-cost_lower[r])/(q_bound[r]-q_lower[r]));  
   forall(i in I, k in K, l in L) //(37)
     sum(r in R)z3[i][k][l][r]==1; 
   forall(i in I, k in K, l in L, r in R) //(38)
       q_bound[r]*z3[i][k][l][r]>=Q_3[i][k][l][r] && q_lower[r]*z3[i][k][l][r]<=Q_3[i][k][l][r]; 
   forall(i in I, k in K, l in L) //(39)
     sum(i in I)q3[i][k][l]==sum(r in R)q_bound[r];
   forall(i in I, k in K, l in L) //(40)
     c_ikl[i][k][l]==sum(r in R) (cost_lower[r]*z3[i][k][l][r]+(q_bound[r]-q_lower[r]*z3[i][k][l][r])*(cost_upper[r]-cost_lower[r])/(q_bound[r]-q_lower[r]));
}

這是 my.dat 文件:

SheetConnection Edata("data.xlsx");
p_max from SheetRead(Edata ,"p_max");
cp    from SheetRead(Edata ,"cp");
c_wm  from SheetRead(Edata ,"c_wm");
c_dk  from SheetRead(Edata ,"c_dk");
c_wh  from SheetRead(Edata ,"c_wh1");
c_dh  from SheetRead(Edata ,"c_dh");
c_r   from SheetRead(Edata ,"c_r");
d_li  from SheetRead(Edata ,"d_li");
ca_j  from SheetRead(Edata ,"ca_j");
c_j   from SheetRead(Edata ,"c_j");
c_w   from SheetRead(Edata ,"c_w");
c_wt  from SheetRead(Edata ,"c_wt");
c_hw  from SheetRead(Edata ,"c_hw");
c_d   from SheetRead(Edata ,"c_d");
c_dt  from SheetRead(Edata ,"c_dt");
c_hd  from SheetRead(Edata ,"c_hd");
p_ije0 from SheetRead(Edata ,"p_ije0");
c_ijm0 from SheetRead(Edata ,"c_ijm");
c_imk0 from SheetRead(Edata ,"c_imk");
c_ikl0 from SheetRead(Edata,"c_ikl");
r_je from SheetRead(Edata ,"r_ej");

q_bound from SheetRead(Edata,"q_bound");
q_lower from SheetRead(Edata,"q_lower");
cost_upper from SheetRead(Edata,"cost_upper");
cost_lower from SheetRead(Edata,"cost_lower");

如果您將約束命名為“使決策優化變得簡單”中的沖突和放松,您將能夠更好地理解問題所在。

以您的 model 為例,如果我們只保留

//minimize (sum(m in M) c_wm[m]*y1[m] + sum(k in K) c_dk[k]*y2[k] +sum(i in I, j in J) cp[j][i]*p[i][j] + sum(i in I, m in M) c_wh[i][m]*(sum(j in J)q1[i][j][m])+sum(i in I, k in K)c_dh[i][k]*(sum( m in M)q2[i][m][k]))+ sum( i in I, j in J, m in M)c_ijm[i][j][m]+sum(i in I, m in M, k in K)c_imk[i][m][k]+sum(i in I, k in K, l in L)c_ikl[i][k][l];

 subject to {


   forall(i in I, j in J)
     {
     ct15a:5<=p[i][j] ;
     ct15b:p[i][j]<=p_max[i][j]; //(15)
   }     

}

那么我們將在 IDE 中看到 ct15a 和 ct15b 之間的沖突

87  [-Infinity,0]   [-Infinity,5]   ct15b[1][2]
87  [-Infinity,0]   [-Infinity,5]   ct15b[5][1]
87  [-Infinity,0]   [-Infinity,5]   ct15b[5][3]
87  [-Infinity,0]   [-Infinity,5]   ct15b[6][3]
87  [-Infinity,0]   [-Infinity,5]   ct15b[8][2]
87  [-Infinity,0]   [-Infinity,5]   ct15b[9][2]
87  [-Infinity,0]   [-Infinity,5]   ct15b[10][2]
87  [-Infinity,0]   [-Infinity,5]   ct15b[11][1]
87  [-Infinity,0]   [-Infinity,5]   ct15b[12][3]
87  [-Infinity,0]   [-Infinity,5]   ct15b[14][2]
87  [-Infinity,0]   [-Infinity,5]   ct15b[14][3]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM