如何摆脱 cplex(默认)无法提取表达式之类的错误?

问题描述 投票:0回答:1

我是编程初学者,我的代码显示各种错误,例如 cplex(默认)无法提取表达式。我认为我的主要错误是我不知道如何正确地对图中的表达式进行建模:

enter image description here

这是我的 mod.-file 代码:

//Parameter


int K=...;          //Anzahl Produkttypen
int M=...;          //Anzahl Ressourcen 
int N=...;          //Anzahl Ressourcen 
int T=...;          //Anzahl Makroperioden
int S=...;          //Anzahl Mikroperioden

{int} kappa[1..M]=...;  //Set von Produkten die exklusiv auf Ressource m produziert werden
{int} sigma[1..T]=...;  //Set von Mikroperioden s für Makroperiode t


float C[1..M][1..S]=...;        //Kapazität der Produktionsmaschine m in Mikroeriode s
float CO[1..S]=...;        //Kapazität des gemeinsamen Rüstoperator in Mikroeriode s
float d[1..K][1..T]=...;  //Primärbedarfsmenge des Prouktes k in Makroeriode t
float hc[1..K]=...;      //Lagerkostensatz für Proukt k
float sc[1..K]=...;      //Rüstkostensatz für Produkt k
float tp[1..K]=...;     //Stückbearbeitungssatz für Produkt k
float ts[1..K]=...;     //Rüstzeit für Produktwechsel von Produkt i auf Produkt k

int y0[1..K]=...;       //initialer Lagerbestand für Produkt k am Anfang des Planungshorizonts
int delta0[1..K]=...;       //initialer Rüstzustand für Produkt k an Maschine m am Anfang des Planungshorizonts

int l[1..K]=...; //minimale Lagerdauer
int z[1..K]=...; //maximale Lagerdauer

execute{
   cplex.tilim = 1200;  //Zeitlimit von 20 Minuten
   }


//Entscheidungsvariable
dvar int+ q1[1..K][1..S];         //Erste Produktionsmenge des Produktes k in der Mikroperiode s
dvar int+ q2[1..K][1..S];         //Zweite Produktionsmenge des Produktes k in der Mikroperiode s
dvar int+ q[1..K][1..T];          //Produktionsmenge des Produktes k in der Makroperiode t
dvar int+ start[1..M][1..S];      //Moment indem eine ein Rüstvorgang auf Ressource m in Mikroperiode s gestartet wird
dvar int+ y[1..K][0..T];          //Lagerbestand für Produkt k am Ende von Periode t
dvar boolean gamma[1..K][0..S];   //binäre Rüstvariable für Produkt k in Mikroperiode s
dvar boolean gammahut[1..K][0..T];   //Anzahl Rüstvorgänge für Produkt k in Mikroperiode t
dvar boolean GAMMA[1..M][1..M][0..S];   //binäre Rüstübertragungsvariable falls von Maschine m auf Maschine n in Mikroperiode s gerüstet wird
dvar boolean delta[1..K][0..S];       //binäre Rüstzustandvariable für Produkt k am Ende der Mikroperiode s

dvar float+ phi[1..K][0..T][0..T]; //Anteil des Bedarfs des Produktes k aus Periode tau der in der Periode t produziert wird


//Zielfunktion: Minimierung der Kosten

minimize sum(k in 1..K,t in 1..T)(sc[k]*gammahut[k][t]+hc[k]*y[k][t]);

//Nebenbedingungen
//Nichtnegativitätsbedingungen und Binärbedingungen bei Entscheidungsvariablen definiert
subject to{

 forall(k in 1..K, t in 1..T)
  Lagerbilanzgleichung:
   y[k][t-1]+q[k][t]-y[k][t]==d[k][t];

 forall(m in 1..M, k in kappa[m], s in 1..S)
  Kapazitaetsrestriktion_1:
   q1[k][s]<=delta[k][s-1]*(C[m][s]/tp[k]);
    
 forall(m in 1..M, k in kappa[m], s in 1..S)
  Kapazitaetsrestriktion_2:
   q2[k][s]<=delta[k][s]*(C[m][s]/tp[k]);
 
 forall(k in 1..K, t in 1..T)
  Produktionsmenge:
   q[k][t]<=sum(s in sigma[t])(q1[k][s]+q2[k][s]);
 
 forall(k in 1..K, t in 1..T)
  Anzahl_Ruestvorgaenge:
   gammahut[k][t]>=sum(s in sigma[t])gamma[k][s]; 
 
 forall(m in 1..M, s in 1..S)
  Ruestzustandszwang: 
   sum(k in kappa[m])delta[k][s]==1; 

 forall(k in 1..T, s in 1..S)
  Ruestzustandsuebertragung: 
   gamma[k][s]>=delta[k][s]+delta[k][s-1];
 
 forall(m in 1..M, k in kappa[m], s in 1..S) 
  Startbedingung_1:     
   q1[k][s]*tp[k]<=start[m][s];      
  
 forall(m in 1..M, k in kappa[m], s in 1..S) 
  Startbedingung_2:     
   q2[k][s]*tp[k]<=C[m][s]-(start[m][s]+ts[k]*gamma[k][s]); 
    
 forall(m in 0..M, s in 1..S) 
  Ruestoperatorwechselzwang:     
   sum(n in 0..M: n!=m)GAMMA[n][m][s]==sum(n in 0..M: n!=m)GAMMA[m][n][s];  

 forall(m in 0..M, s in 1..S) 
  Ruestoperatorzwang:     
   sum(k in kappa[m])gamma[k][s]<=sum(n in 0..M: n!=m)GAMMA[n][m][s];  
   
 forall(m in 0..M, s in 1..S) 
  Maximale_Wechsel:     
   sum(n in 0..M: n!=m)GAMMA[n][m][s]<=1;   
 
 forall(m in 1..M, n in 1..M, s in 1..S: m!=n) 
  Koordinationsbedingung:     
   start[m][s]>=start[n][s]+sum(k in kappa[n])(ts[k]*gamma[k][s])-CO[s]*(1-GAMMA[n][m][s]);
 
 forall(m in 0..M, s in 1..S) 
  Kapazitaetsbeschraenkung_Operator:     
   start[m][s]+sum(k in kappa[m])(ts[k]*gamma[k][s])<=CO[s];

//Lagerungsbegrenzung

 forall(k in 1..K, tau in l[k]+1..T)
  Lagerungsbegrenzung:
   sum(t in tau-z[k]..tau-l[k]: t>=0) phi[k][t][tau] == d[k][tau];
    
 forall(k in 1..K, t in 1..T)
  Anteilsbedingung:
   sum(tau in t..T) phi[k][t][tau] == q[k][t];
 
 forall (k in 1..K)
  Anfangslagerbestand:                  
   y[k][0] == y0[k];
  
 forall (k in 1..K)             
  Anfangsruestzustand:
   delta[k][0] == delta0[k];
} 

这是我的数据文件:

K = 2;
M = 3;
N = 3;
T = 8;
S = 2;

kappa = [{1}, {1,2}, {2}];
sigma = [{1, 2}, {1, 2}, {1, 2}, {1, 2}, {1, 2}, {1, 2}, {1, 2}, {1, 2}];

C = [[300, 300], 
     [300, 300],
     [300, 300]];
CO = [300, 300];

d = [[10, 20, 3, 4, 8, 10, 40, 40],
     [3, 6, 7, 8, 9, 4, 7, 20]];

hc = [10, 8];
sc = [1600, 1600];
tp = [1, 1];
ts = [8, 12];

y0 = [0, 0];
delta0 = [0, 1];

l = [1, 1];
z = [5, 5];
 

我已经尝试了在大学学到的一切来让它运行。然而,这超出了我的范围。任何举行都受到高度赞赏!如果您需要任何进一步的描述,请告诉我。谢谢!

cplex opl
1个回答
0
投票

你有很多错误。

首先你因为越界而无法提取。

举个例子

forall(k in 1..T, s in 1..S)
  Ruestzustandsuebertragung: 
   gamma[k][s]>=delta[k][s]+delta[k][s-1];

可以改为

forall(k in 1..T, s in 1..S:((s-1) in 1..S) && (k in 1..K))
  Ruestzustandsuebertragung: 
   gamma[k][s]>=delta[k][s]+delta[k][s-1];

在类似的限制下

forall(m in 1..M, k in kappa[m], s in 1..S) 
  Startbedingung_2:     
   q2[k][s]*tp[k]<=C[m][s]-(start[m][s]+ts[k]*gamma[k][s]); 

您应该删除标签

forall(m in 1..M, k in kappa[m], s in 1..S) 
 // Startbedingung_2:     
   q2[k][s]*tp[k]<=C[m][s]-(start[m][s]+ts[k]*gamma[k][s]); 

或使用命名约束

© www.soinside.com 2019 - 2024. All rights reserved.