Originally posted by: end495
Hello,
// CHIRON TEZGAHLARININ İYİLEŞTİRİLMESİ
// KÜMELER
{string} Isler=...; // İşler kümesi
int Makineler=2; // Makineler kümesi
range M=1..Makineler;
int Slotlar=card(Isler); // Slotlar kümesi
range S=1.. Slotlar;
// PARAMETRELER
float p[i in Isler]=...; // i işinin işlem süresi
int f[i in Isler][j in Isler]=...; // clamp çakışma matrisi
int d[i in Isler]=...; // i işinin teslim tarihi
float h[i in Isler]=...; // i işinin hazırlık süresi
int G=999; // büyük bir sayı
// KARAR DEĞİŞKENLERİ
dvar boolean x[i in Isler][m in M][s in S]; // i işi m makinesinin s slotuna çizelgelenmişse
dvar boolean y[i in Isler][j in Isler][m in M][s in S]; // i ve j işleri aynı makinenin ardışık slotlarına çizelgelenmişse
dvar boolean z[i in Isler][j in Isler][m in M][s in S]; // aynı ekipmanları kullanan i ve j işleri aynı makinenin ardışık slotlarına çizelgelenmişse
float t[m in M][s in S]; // m makinesinin s slotuna çizelgelenen işin başlama zamanı
float Cmax; // en büyük tamamlanma zamanı
// AMAÇ FONKSİYONU(Her bir amaç fonksiyonu ayrı ayrı çözdürülecek. Her bir amaç fonksiyonundan elde edilen optimal sonuç ağırlıklandırma amacıyla Amaç3 için parametre olarak kullanılacak.)
minimize Cmax; // Amaç1: en büyük tamamlanma zamanının en küçüklenmesi
maximize sum(i in Isler)sum(j in Isler:ord(Isler,i)!=ord(Isler,j))sum(m in M)sum(s in S)z[i][j][m][s]; // Amaç2: aynı ekipmanları kullanan işlerin aynı makinenin ardışık slotlarına çizelgelenmesinin en büyüklenmesi
// KISITLAR
subject to{
forall(i in Isler)
sum(m in M)sum(s in S)x[i][m][s]==1; // Kısıt1: Her işin yalnızca bir makinenin bir slotuna çizelgelenmesini sağlamaktadır.
forall(m in M)
forall(s in S)
sum(i in Isler)x[i][m][s]<=1; // Kısıt2: Bir makinenin bir slotuna yalnızca bir işin çizelgelenmesini sağlamaktadır.
forall(i in Isler, j in Isler:ord(Isler,i)!=ord(Isler,j))
forall(m in M)
forall(s in S:s<=Slotlar-1)
x[i][m][s]+x[j][m][s+1]-1<=y[i][j][m][s]; // Kısıt3: İki farklı iş aynı makinenin ardışık slotlarına çizelgelenmişse ilgili karar değişkenine 1 değerini atayarak bu iki iş arasındaki hazırlık zamanının oluşmasını sağlamaktadır.
forall(i in Isler, j in Isler:ord(Isler,i)!=ord(Isler,j))
forall(m in M)
forall(s in S)
f[i][j]-(1-y[i][j][m][s])<=z[i][j][m][s]; // Kısıt4: Aynı ekipmanları kullanan iki farklı iş aynı makinenin ardışık slotlarına çizelgelenmişse ilgili karar değişkenine 1 değerinin atanmasını sağlamaktadır.
forall(i in Isler, j in Isler:ord(Isler,i)!=ord(Isler,j))
forall(m in M)
forall(s in S)
G*(1-z[i][j][m][s])>=h[j]; // Kısıt5: Aynı ekipmanları kullanan iki farklı iş aynı makinenin ardışık slotlarına çizelgelenmişse j işinin hazırlık zamanı parametresine 0 değerinin atanmasını sağlamaktadır.
forall(m in M)
forall(s in S:s<=Slotlar-1)
t[m][s]+sum(i in Isler)x[i][m][s]*p[i]+sum(i in Isler)sum(j in Isler:ord(Isler,i)!=ord(Isler,j))y[i][j][m][s]*h[j]<=t[m][s+1]; // Kısıt6: Bir makinenin her bir slotundaki işin başlama zamanının belirlenmesini sağlamaktadır.
forall(m in M)
forall(s in S:s<=Slotlar-1)
sum(i in Isler)x[i][m][s+1]>=sum(i in Isler)x[i][m][s]; // Kısıt7: Bir makinenin bir sonraki slotuna bir iş çizelgelenmişse aynı makinenin bir önceki slotuna da bir işin çizelgelenmesini sağlamaktadır.
forall(i in Isler)
forall(m in M)
forall(s in S)
t[m][s]+p[i]-G*(1-x[i][m][s])<=d[i]; // Kısıt8: Bir makinenin her bir slotundaki işin teslim tarihinden önce tamamlanmasını sağlamaktadır.
forall(m in M)
t[m][Slotlar]+sum(i in Isler)x[i][m][Slotlar]*p[i]<=Cmax; // Kısıt9: Her makinenin son slotundaki işin başlama zamanının o slota çizelgelenmiş işin işlem süresiyle toplamının en büyük tamamlanma zamanından küçük ya da ona eşit olmasını sağlamaktadır.
forall(m in M)
t[m][1]==sum(i in Isler)x[i][m][1]*h[i]; // Kısıt10: Her bir makinenin ilk slotuna çizelgelenen işin başlama zamanına o işin hazırlık zamanının değerinin atanmasını sağlamaktadır.
forall(m in M)
forall(s in S)
t[m][s]>=0; // Kısıt11: İşaret kısıtını oluşturmaktadır.
Cmax>=0; // Kısıt12: İşaret kısıtını oluşturmaktadır.
}
I've got out of memory error while cplex is reading my model. I've got this error on the red highlighted constraint which is trying to do if two different jobs are scheduled in consecutive slots of same machine, the y decision variable takes 1 or 0.
#CPLEXOptimizers#DecisionOptimization