
param NumofProduct:=5;
param NumofDC:=10;

set I:= 1.. NumofProduct;

set K:= 1..NumofDC;

set J := 1..5;
/* mesin */

set A := 1..5;
/* pemasok */

set M := 1..4;
/* bahan baku */

set T := 1..10;
/* horison perencanaan */


#VARIABEL
var b {i in I, k in K, t in T}, integer >= 0;
var y {i in I, t in T}, integer >= 0;
var qpw{i in I, t in T}, integer >= 0;
var u {i in I, t in T}, integer >= 0;
var p {i in I, m in M, t in T} >= 0;
var qpwm {t in T} , integer >= 0;
var qpf {i in I, t in T}, integer >= 0;
var qpfm {t in T}, integer >= 0;
var qsf {m in M, t in T}, integer >= 0;
var qsfm {t in T}, integer >= 0;
var g {a in A, m in M, t in T} , integer >= 0;
#var up {i in I, t in T}, binary, >=0,<=1;
#var x {i in I, j in I, t in T}, binary, >=0,<=1;

/*var opl{i in I, t in T};
var dpl{i in I};

/*var owr{i in I, k in K, t in T};
var d{i in I, t in T}, integer >= 0;
var pos{i in I,t in T}, integer >= 0;
var neg{i in I,t in T}, integer >= 0;*/



#PARAMETER STATEMENT

param SP {i in I, k in K};
/* harga 1 unit produk i di DC k */

param CPFW {i in I};
/* biaya untuk memindahkan 1 unit produk i dari pabrik ke warehouse */

param CPWDC {i in I, k in K};
/* biaya untuk memindahkan 1 unit produk i dari warehouse ke DC k */

param CSPW{i in I};
/* biaya inventory produk i di warehouse */

param CF{i in I};
param CFM :=8;

param VC{i in I};

param CR{m in M, i in I};

param CSPF{i in I};

param CSSF{m in M};

param FC{i in I};

param LT{a in A};

param RP{i in I};

param CH{i in I, j in I};

param DWR{i in I, k in K};

param COSF{a in A,m in M};

param BU{i in I};

param BD{i in I};


#OBJECTIVE FUNCTION
maximize z : ( sum{i in I} sum{k in K} SP[i,k]* sum{t in T} b[i,k,t]*48 ) -
            (( sum {i in I}sum{t in T} CPFW[i] *  y[i,t] ) + ( sum{i in I} sum{k in K} sum{t in T} CPWDC[i,k] *  b[i,k,t] ) +
                ( sum {i in I}sum{t in 1..9} CSPW[i] *  qpw[i,t+1] + sum {m in M} sum{t in 1..9}CSSF[m] *  qsf[m,t+1] + sum {i in I} sum{t in 1..9}CSPF[i]* qpf[i,t+1]) +
                ( sum {a in A} sum {m in M} sum {t in T} COSF[a,m]*g[a,m,t]) +
               (sum{t in T} sum{i in I} (u[i,t]*VC[i])) ) ;

/*minimize z : (( sum {i in I}sum{t in T} CPFW[i] *  y[i,t] ) + ( sum{i in I} sum{k in K} sum{t in T} CPWDC[i,k] *  b[i,k,t] ) +
                ( sum {i in I}sum{t in 1..9} CSPW[i] *  qpw[i,t+1] + sum {m in M} sum{t in 1..9}CSSF[m] *  qsf[m,t+1] + sum {i in I} sum{t in 1..9}CSPF[i]* qpf[i,t+1]) +
                ( sum {a in A} sum {m in M} sum {t in T} COSF[a,m]*g[a,m,t]) +
               (sum{t in T} sum{i in I} sum{j in I}  u[i,t]*VC[i]) ) ;*/


#constraint

#demand constraint
s.t. demand{i in I, k in K} : sum {t in T}b[i,k,t] = DWR[i,k];
s.t. demand1{i in I, t in T}: sum {k in K}b[i,k,t] <= if t=1 then 0 else qpw [i,t];
s.t. demand2{i in I, t in T}: y[i,t] <= qpf [i,t];
s.t. demand3{m in M, t in T}: sum {i in I} p[i,m,t] <= qsf [m,t];


#inventori produk di warehouse
s.t. prodwar{i in I, t in T}: qpw[i,t] =
   if t=1 then 0
   else
   qpw[i,t-1] + y[i,t-1] - sum{k in K} b[i,k,t-1];

s.t. batasinv{t in T} : sum {i in I} qpw[i,t] <= 26208;

#inventori pabrik
s.t. prodpab {i in I, t in T} : qpf[i,t] =
   if t=1 then 0
   else qpf[i,t-1] + (u[i,t-1]) - y[i,t-1];
s.t. batasinvpab1{t in T} : sum {i in I} qpf[i,t] <= 2880;


s.t. bbpab {m in M, t in T}: qsf[m,t] =
   if t=1 then 0
   else qsf[m,t-1] + sum{a in A} g[a,m,t-1] - sum {i in I} p[i,m,t-1] ;
s.t. batasinvpab2{t in T} : sum {m in M} qsf[m,t] <= 45000;

#routing
s.t. r1{t in T} : sum{i in I} y[i,t]*48*RP[i] <= 5000;
s.t. r2{k in K, t in T} : sum{i in I} b[i,k,t]*48*RP[i] <= 2000;

#produksi
s.t. p1{t in T} : sum {i in I} CF[i]*u[i,t] <= 24;
s.t. p2{i in I, m in M, t in T} : u[i,t]* CR[m,i] =  p[i,m,t];


/*# constraint is active when b = 0
s.t. c1 : x <= x1 + b * M;
# constraint is active when b = 1
s.t. c2 : x >= x2 - (1 - b) * M;*/

#urutan produksi
#s.t. p10 {i in I,t in T} : up[i,t] = (u[i,t] + 2);
#s.t. p10 {t in T}: sum{i in I} up[i,t] <= 1 ;
#s.t. p11 {i in I, t in T} : u[i,t] <= 0 + (up[i,t]*2500);
#s.t. p12 {i in I, t in T} : u[i,t] >= 0 - ((1-up[i,t])*2500);
#s.t. p12 {i in I, t in T} : up[i,t] >= (1-u[i,t]);
#up[j,t] = 0, up[j,t-1] =0
#s.t. p12 {i in I, t in T}: d[i,t] = u[i,t]/u[i,t];
/*s.t. p13 {i in I, j in I, t in T} : x[i,j,t] >=
   if t=1 then 0
   else
   if i=j then 0
   else up[i,t] + up[j,t]-1;
#up[j,t] + up[i,t] -1;
#(up[j,t]*0 +1) + (up[i,t]*0 +1);
#s.t.  p12 {i in I, j in I, t in T} : x[i,j,t] >= (u[i,t]/SP[j,t]*9);*/

/*s.t. p10 {i in I,t in T} : u[i,t] = pos[i,t] -neg[i,t];
s.t. p11 {i in I,t in T} : pos[i,t] <= 9999*up[i,t];
s.t. p12 {i in I,t in T} : neg[i,t] <= 9999*(1-up[i,t]);*/



# constraint is active when b = 0
#s.t. c1 {i in I, t in T}: u[i,t] <= 1 + up[i,t] * 100;
# constraint is active when b = 1
#s.t. c2 {i in I, t in T}: u[i,t] >= 1 - (1 - up[i,t]) * 100;
#(u[j,t]*0 +1) + (u[i,t]*0 +1) -1 ;

solve;
#DATA STATEMENT
data;


#harga jual produk /unit
param SP :												1	2	3	4	5	6	7	8	9	10:=
1	19762.81	17867.17	13428.57	14854.87	14961.86	11849.27	13688.07	11946.22	12471.12	15032.07
2	48574.93	42487.07	26136	32813.07	33156.65	23160.55	29065.87	23471.92	25157.62	33382.13
3	11482.46	11430.57	15314.65	11348.13	11351.06	11265.86	11316.19	11268.52	11282.88	11352.98
4	3559.33	3320.82	2889.67	2941.81	2955.27	2563.65	2795.01	2575.84	2641.89	2964.11
5	2979.66	3092.67	3952	3272.26	3265.88	3451.44	3341.82	3445.66	3414.37	3261.69;

#biaya transportasi produk dari pabrik ke warehouse /dus
param CPFW := 1	2.4
2	5.09
3	2.98
4	1.47
5	1.55;

#biaya transportasi produk dari warehouse ke DC /unit
param CPWDC :								1	2	3	4	5	6	7	8	9	10:=
1	19762.81	17867.17	13428.57	14854.87	14961.86	11849.27	13688.07	11946.22	12471.12	15032.07
2	48574.93	42487.07	26136	32813.07	33156.65	23160.55	29065.87	23471.92	25157.62	33382.13
3	11482.46	11430.57	15314.65	11348.13	11351.06	11265.86	11316.19	11268.52	11282.88	11352.98
4	3559.33	3320.82	2889.67	2941.81	2955.27	2563.65	2795.01	2575.84	2641.89	2964.11
5	2979.66	3092.67	3952	3272.26	3265.88	3451.44	3341.82	3445.66	3414.37	3261.69;


#biaya simpan produk di warehouse /dus
param CSPW := 1	65.96395847
2	139.7166642
3	81.86838811
4	40.38609703
5	42.50155925;

#biaya simpan bahan di pabrik /kg
param CSSF :=1	5.85
2	3.13
3	3.20
4	5.20;

#biaya simpan produk di pabrik /dus
param CSPF := 1	28.28
2	59.89
3	35.1
4	17.31
5	18.22;

#biaya pembelian bahan baku /kg
param 	COSF : 										1	2	3	4:=
1	18000	10000	8000	1000000000
2	14400	8000	1000000000	1000000000
3	1000000000	1000000000	1000000000	1000000000
4	1000000000	1000000000	1000000000	14000
5	1000000000	1000000000	9600	16800;

#waktu produksi setiap produk (jam)
param CF := 1	0.011136
2	0.02784
3	0.011228976
4	0.01886818
5	0.01886818;

#biaya variabel produksi /batch
param VC := 1	82.32
2	174.36
3	102.168
4	50.4
5	53.04;

#conversion rate dari bahan baku menjadi batch (kg/batch)
param CR :													1	2	3	4	5:=
1	1	0	0	0	0
2	0	0	0	1	1
3	0	1	0	0	0
4	0	0	1	0	0;



#biaya tetap produksi
param FC := 1	16464
2	87180
3	20604.2028
4	17078.95629
5	17973.56828;

#lead time pengiriman pemasok
param LT := 1	4
2	1
3	2
4	3
5	4
6	3
7	2


8	2
9	2
10	2
11	3
12	2
13	2
14	1
15	2
16	2
17	4
18	3
19	2
20	1;

#biaya konversi produk ke berat (unit-kg)
param RP := 1	0.12
2	0.3
3	0.12
4	0.06
5	0.06;

#pesanan setiap DC (dalam batch)
param DWR :						1	2	3	4	5	6	7	8	9	10:=
1	0	0	0	0	0	0	520	0	0	520
2	0	0	0	0	0	0	0	208	416	208
3	0	0	0	0	0	0	0	0	0	0
4	0	0	0	0	0	0	307	0	0	307
5	0	0	0	0	0	0	0	0	0	0;

#biaya changeover produksi produk
param CH : 							1	2	3	4	5:=
1	0	4540.625	11351.5625	10594.79167	5297.395833
2	4540.625	0	3783.854167	12108.33333	12108.33333
3	11351.5625	3783.854167	0	3783.854167	5297.395833
4	10594.79167	12108.33333	3783.854167	0	4540.625
5	5297.395833	12108.33333	5297.395833	4540.625	0;

#konversi batch ke unit
param BU := 1	25000
2	10000
3	24793
4	14755
5	14755;

#konversi batch ke dus
param BD:= 1	520
2	208
3	516
4	307
5	307;


end;
