# Problema Asignacin de Productos en un Centro de Distribucin Cross Docking
# Conjuntos


set PR; #conjunto de productos PR={1...np} contiene los ndices p
set PD; #conjunto de puertas de descarga PD={1...nd} contiene los ndices d 
set LA; #conjunto de lugares de almacenamiento LA={1...na} contiene los ndices a
set TL; #conjunto de tipos de lugares de almacenamiento TL={1...ta} contiene los ndices j
set PC; #conjunto de puertas de carga PC={1...nc} contiene los ndices c 
set PT; #conjunto de periodos de tiempo PT={1...tt} contiene los ndices t


#Conjuntos Inducidos en lugares de almacenamiento

set tiploc{TL} within LA;# conjunto de tipos de lugares de almacenamientoj que pertecen a los lugares de almacenamiento LA

# Parmetros


param  le{d in PD, a in LA} ; # distancia desde la puerta de descarga d hasta el lugar de almacenamiento a
param  ls{a in LA, c in PC} ; # distancia desde el lugar de almacenamiento a hasta la puera de carga c
param  kt; # capacidad del centro de almacenamiento cross docking (metros cbicos)
param  kl{a in LA} ; #  capacidad del lugar de almacenamiento a (capacidad de cada localizacin)
param  na ; # nmero total de localizaciones
param  np ; # nmero total de productos
param  nd ; # nmero total de puertas de descarga 
param  nc ; # nmero total de puertas de carga 
param  tt ; # nmero total de perodos de tiempo
param  ta ; # nmero total de tipos de localizaciones
param  ql{p in PR, d in PD, t in PT}; # cantidad del producto p que llega a la puerta de descarga d en el tiempo t
param  qs{p in PR, c in PC, t in PT}; # cantidad del producto p que sale por la puerta de carga c en el tiempo t
param  ip{p in PR, a in LA};# inventario inicial del producto p en el lugar de almacenamiento a en el tiempo t
param  it{p in PR};# inventario inicial total del producto p en todo el centro Cross-Docking
param  cl{p in PR} ; # costo de transportar la carga del producto p por metro.  
param  ci{p in PR, a in LA} ; # costo de mantener en inventario una unidad del carga del producto p en el lugar de almacenamiento a
param  M; # Nmero muy grande



# Variables


var BL{p in PR, d in PD, a in LA, t in PT}>= 0, binary; #variable binaria  que indica 1 si el producto p ingresa por la puerta de descarga d y se asigna al lugar de almacenamiento a en el tiempo t, 0 de lo contrario
var BS{p in PR, a in LA, c in PC, t in PT}>= 0, binary; #variable binaria  que indica 1 si el producto p que fue asignado al lugar de almacenamiento a sale por la puerta de carga c en el tiempo t, 0 de lo contrario
var BI{p in PR, a in LA , t in PT}>= 0, binary; #variable binaria que indica 1 si el inventario final del producto p es mayor que cero en el lugar de almacenamiento a,en el tiempo t, 0 de lo contrario
var QE{p in PR, d in PD, a in LA, t in PT}>= 0, integer; #variable entera que indica la cantidad transportada del producto p desde la puerta de descarga d, hasta el lugar de almacenamiento a, en tiempo t
var QS{p in PR, a in LA, c in PC, t in PT}>= 0, integer; #variable entera que indica la cantidad transportada del producto p desde el lugar de almacenamiento a, hasta la puerta de carga c, en el tiempo t.
var FP{p in PR, a in LA, t in PT }>= 0, integer; #variable entera que indica el inventario final del producto p en el lugar de almacenamiento a, en el tiempo t
var FT{p in PR, t in PT }>= 0, integer; #variable entera que indica el inventario final del producto p en toda la terminal en el tiempo t


# Funcin objetivo

minimize Z: (sum{p in PR, d in PD, a in LA, t in PT}(le[d,a]*BL[p,d,a,t])*(cl[p])) + (sum{p in PR,a in LA, c in PC, t in PT}(ls[a,c]*BS[p,a,c,t])*(cl[p])) + (sum{p in PR, a in LA, t in PT}(ci[p,a]*FP[p,a,t])); 


# Restricciones

subject to producto_unico_asignado_a_lugar {a in LA,t in PT}:sum{p in PR}(BI[p,a,t])<= 1;

subject to cantidad_transportada_igual_cantidad_que_llega {p in PR, d in PD, t in PT}:sum{a in LA} QE[p,d,a,t]= ql[p,d,t];

subject to lugares_de_almacenamiento {t in PT}:sum{p in PR, d in PD, a in LA}BL[p,d,a,t]<= (na*nd);

subject to lugares_de_almacenamiento_2 {t in PT}:sum{p in PR, a in LA}BI[p,a,t]<= na;

subject to cantidad_transportada_capacidad_lugar {p in PR,d in PD, a in LA, t in PT}:QE[p,d,a,t]<= BL[p,d,a,t]*kl[a]; 

subject to cantidad_transportada_salida_lugar {p in PR, a in LA,c in PC, t in PT}:QS[p,a,c,t]<= BS[p,a,c,t]*kl[a]; 

subject to cantidad_transportada_igual_cantidad_que_sale {p in PR, c in PC, t in PT}:sum{a in LA} QS[p,a,c,t]= qs[p,c,t];

subject to cantidad_entra_igual_cantidad_sale_tipo2 {j in TL,p in PR,t in PT, a in tiploc[j]:j=2}:sum{d in PD}QE[p,d,a,t] = sum{c in PC} QS[p,a,c,t];

subject to inventario_final_producto_lugar_2 {j in TL, p in PR, t in PT, a in tiploc[j]: j=2}:FP[p,a,t]= 0;

subject to inventario_final_producto_lugar_a {p in PR, a in LA, t in PT: t=1}:FP[p,a,t]= ip[p,a] + sum{d in PD} QE[p,d,a,t] - sum{c in PC} QS[p,a,c,t]; 
subject to inventario_final_producto_lugar_b {p in PR, a in LA,t in PT: t>1}:FP[p,a,t]= FP[p,a,t-1] + sum{d in PD} QE[p,d,a,t] - sum{c in PC} QS[p,a,c,t]; 

subject to inventario_final_producto_terminal_1 {p in PR, t in PT: t=1}: FT[p,t]= it[p] + sum{d in PD}ql[p,d,t] - sum{c in PC}qs[p,c,t];
subject to inventario_final_producto_terminal_2 {p in PR, t in PT: t>1}: FT[p,t]= FT[p,t-1] + sum{d in PD}ql[p,d,t] - sum{c in PC}qs[p,c,t];


subject to capacidad_lugar_d_almacenamiento {p in PR, a in LA, t in PT}:FP[p,a,t]<= BI[p,a,t]*kl[a];

subject to asignacion_un_solo_tipo_producto {d in PD, a in LA, t in PT, p1 in PR, p2 in PR: p1 <> p2}: (BL[p1,d,a,t] + BL[p2,d,a,t])<= 1; 

subject to productos_asignados_b {d in PD,a in LA, t in PT, p1 in PR, p2 in PR: p1 <> p2}: BL[p2,d,a,t] <= (1 - BI[p1,a,t])*M; 

subject to productos_asignados_c {p in PR, a in LA, t in PT}:sum{d in PD} BL[p,d,a,t] <= BI[p,a,t]*nd;











