Ejemplo n.º 1
0
def big_m_model():

    with open('Pickled_Data', 'rb') as f:
        rd = pickle.load(f)

    model = ConcreteModel()
    #-----------------------------------------------------------------------------
    #                           DECLARE MODEL PARAMETERS
    #-----------------------------------------------------------------------------

    model.STORES = Set(initialize=rd.STORES)
    model.PRODUCTS = Set(initialize=rd.PRODUCTS)
    model.FASHION = Set(initialize=rd.FASHION)
    model.VENDORS_Q = Set(initialize=rd.VENDORS_Q)
    model.VENDORS_P = Set(initialize=rd.VENDORS_P)
    model.VENDORS = Set(initialize=rd.VENDORS)
    model.TIMES = Set(initialize=rd.TIMES)
    model.PICKING = Set(initialize=rd.PICKING)
    model.PUTAWAY = Set(initialize=rd.PUTAWAY)

    model.SP = model.STORES * model.PRODUCTS
    model.VP = model.VENDORS * model.PRODUCTS
    model.ST = model.STORES * model.TIMES
    model.PT = model.PRODUCTS * model.TIMES
    model.VT = model.VENDORS * model.TIMES
    model.VPT = model.VENDORS * model.PRODUCTS * model.TIMES
    model.SPT = model.STORES * model.PRODUCTS * model.TIMES


    model.OMEGA_Q = Set(initialize=rd.Omega_q, dimen=2)
    model.OMEGA_P = Set(initialize=rd.Omega_p, dimen=2)

    model.T_minus_One = Param(model.TIMES, initialize=rd.T_minus_One)

    def K_init(model, s): return 10000000
    model.K_s = Param(model.STORES, initialize=K_init)

    def L_init(model): return 0
    model.L = Param(initialize=L_init)

    model.Script_Q = Param(initialize=15000)

    model.phi_put = Param(initialize=1.0)
    model.phi_pick = Param(initialize=1.0)
    model.gamma = Param(initialize=0.5)

    model.pt = Param(initialize=1)
    model.tb = Param(initialize=rd.tb)
    model.te = Param(initialize=rd.te)
    model.ty = Param(initialize=rd.ty)

    model.Demand = Param(model.STORES, model.PRODUCTS, model.TIMES, initialize=rd.Demand)

    model.V_p = Param(model.PRODUCTS, initialize=rd.V_p)
    model.V_q = Param(model.FASHION, initialize=rd.V_q)
    model.W_p = Param(model.PRODUCTS, initialize=rd.W_p)
    model.W_q = Param(model.FASHION, initialize=rd.W_q)

    X_ivq = {tup:rd.X_ivq[tup] for tup in model.OMEGA_Q}
    model.X_ivq = Param(model.OMEGA_Q, initialize=X_ivq)
    model.X_osq = Param(model.STORES, model.FASHION, initialize=rd.X_osq)
    model.C_alpha = Param(initialize=rd.C_alpha)
    model.C_beta = Param(initialize=rd.C_beta)

    def C_hp_init(model, p): return .01

    model.C_hp = Param(model.PRODUCTS, initialize=C_hp_init)
    model.C_hq = Param(model.FASHION, initialize=C_hp_init)


    def C_hsp_init(model, s, p): return .05

    model.C_hsp = Param(model.STORES, model.PRODUCTS, initialize=C_hsp_init)
    model.C_hsq = Param(model.STORES, model.FASHION, initialize=C_hsp_init)


    model.C_fv = Param(model.VENDORS, initialize=rd.C_fv)
    model.C_fs = Param(model.STORES, initialize=rd.C_fs)
    model.C_vv = Param(model.VENDORS, initialize=rd.C_vv)
    model.C_vs = Param(model.STORES, initialize=rd.C_vs)


    model.Lambda_put = Param(model.PUTAWAY, initialize=rd.lambda_put)
    model.MHE = Param(model.PUTAWAY, initialize=rd.MHE)
    model.Lambda_pick = Param(model.PICKING, initialize=rd.lambda_pick)
    model.Cth_put = Param(model.PUTAWAY, initialize=rd.C_put)
    model.Cth_pick = Param(model.PICKING, initialize=rd.C_pick)

    #-----------------------------------------------------------------------------
    #                           DECLARE MODEL VARIABLES
    #-----------------------------------------------------------------------------

    model.alpha_put = Var(bounds=(0.0, 500),
                           within=NonNegativeIntegers)

    model.alpha_pick = Var(bounds=(0.0, 500),
                           within=NonNegativeIntegers)

    model.theta_put = Var(model.PUTAWAY, within=Binary)
    model.theta_pick = Var(model.PICKING, within=Binary)

    model.MHE_cost = Var(model.PUTAWAY, within=NonNegativeIntegers)


    model.beta_put = Var(model.TIMES,
                         within=NonNegativeIntegers)

    model.beta_pick = Var(model.TIMES,
                         within=NonNegativeIntegers)

    model.tau_sq = Var(model.STORES, model.FASHION,
                         within=NonNegativeIntegers)

    model.rho_vqt = Var(model.OMEGA_Q, model.TIMES,
                         within=Binary)

    model.rho_sqt = Var(model.STORES, model.FASHION, model.TIMES,
                         within=Binary)

    model.x_vpt = Var(model.OMEGA_P, model.TIMES,
                         within=NonNegativeIntegers)

    model.x_spt = Var(model.STORES, model.PRODUCTS, model.TIMES,
                         within=NonNegativeIntegers)

    model.y_pt = Var(model.PRODUCTS, model.TIMES,
                         within=NonNegativeIntegers)

    model.y_spt = Var(model.STORES, model.PRODUCTS, model.TIMES,
                         within=NonNegativeIntegers)

    model.y_sqt = Var(model.STORES, model.FASHION, model.TIMES,
                         within=NonNegativeIntegers)

    model.z_spt = Var(model.STORES, model.PRODUCTS, model.TIMES,
                         within=NonNegativeIntegers)

    model.z_sqt = Var(model.STORES, model.FASHION, model.TIMES,
                         within=NonNegativeIntegers)

    model.n_vt =  Var(model.VENDORS, model.TIMES,
                         within=NonNegativeIntegers)

    model.n_st =  Var(model.STORES, model.TIMES,
                         within=NonNegativeIntegers)



    def objective_rule(model):
        Workers_Cost = model.Ca * (model.alpha_put + model.alpha_pick) + \
                       model.Cb * sum((model.beta_put[t] + model.beta_pick[t])
                                       for t in model.TIMES)

        MHE_Cost = summation(model.MHE_cost)

        Tech_Cost = summation(model.Cth_put, model.theta_put) + \
                    summation(model.Cth_pick, model.theta_pick)


        Holding_Cost =  sum(model.C_hp[p] * model.y_pt[p,t]
                            for p in model.PRODUCTS for t in model.TIMES)
        Holding_Cost += sum(model.C_hq[q] * model.X_osq[s,q] * model.tau_sq[s,q]
                            for s in model.STORES for q in model.FASHION)
        Holding_Cost += sum(model.C_hsp[s,p] * model.y_spt[s,p,t]
                            for s in model.STORES for p in model.PRODUCTS for t in model.TIMES)
        Holding_Cost += sum(model.C_hsq[s,q] * model.y_sqt[s,q,t]
                            for s in model.STORES for q in model.FASHION for t in model.TIMES)


        Fixed_Shipping_Cost =  sum(model.C_fv[v] * model.n_vt[v,t]
                                  for v in model.VENDORS for t in model.TIMES)
        Fixed_Shipping_Cost += sum(model.C_fs[s] * model.n_st[s,t]
                                  for s in model.STORES for t in model.TIMES)


        Var_Shipping_Cost =  sum(model.C_vv[v] * model.W_p[p] * model.x_vpt[v,p,t]
                                  for v, p in model.OMEGA_P for t in model.TIMES)
        Var_Shipping_Cost += sum(model.C_vv[v] * model.W_q[q] * model.X_ivq[v,q] * model.rho_vqt[v,q,t]
                                  for v, q in model.OMEGA_Q for t in model.TIMES)
        Var_Shipping_Cost += sum(model.C_vs[s] * model.W_p[p] * model.x_spt[s,p,t]
                                  for s in model.STORES for p in model.PRODUCTS for t in model.TIMES)
        Var_Shipping_Cost += sum(model.C_vs[s] * model.W_q[q] * model.X_osq[s,q] * model.rho_sqt[s,q,t]
                                  for s in model.STORES for q in model.FASHION for t in model.TIMES)


        FS_Expr = (Workers_Cost + MHE_Cost + Tech_Cost + Holding_Cost
                                + Fixed_Shipping_Cost + Var_Shipping_Cost)

        return FS_Expr

    model.objective = Objective(sense=minimize)


    def BigM_MHE_LOWER_rule(model, i):
        expr = model.MHE_COST[i]
        expr -= sum(model.MHE[i] * (model.alpha_put + model.beta_put[t])
                    for t in model.TIMES)
        return (-model.M_MHE * (1 - model.theta_put[i]), expr, None)

    model.BigM_MHE_LOWER = Constraint(model.PUTAWAY, model.TIMES)

    def BigM_MHE_UPPER_rule(model, i):
        expr = model.MHE_COST[i]
        expr -= sum(model.MHE[i] * (model.alpha_put + model.beta_put[t])
                    for t in model.TIMES)
        return (None, expr, model.M_MHE * (1 - model.theta_put[i]))

    model.BigM_MHE_UPPER = Constraint(model.PUTAWAY, model.TIMES)

    def ConstraintFour_rule(model, i, t):
        Four_expr1 = sum(model.x_vpt[v,p,t] for v, p in model.OMEGA_P)
        Four_expr1 += sum(model.X_ivq[v,q] * model.rho_vqt[v,q,t] for v, q in model.OMEGA_Q)
        Four_expr2 = model.Lambda_put[i] * (model.alpha_put + model.phi_put * model.beta_put[t])
        return (Four_expr1 - Four_expr2 <= model.BigM * (1 - model.theta_put[i]))

    model.ConstraintFour = Constraint(model.PUTAWAY, model.TIMES)


    def ConstraintFive_rule(model, j, t):
        Five_expr1 = sum(model.x_spt[s,p,t] for s in model.STORES for p in model.PRODUCTS)
        Five_expr1 += sum(model.X_osq[s,q] * model.rho_sqt[s,q,t] for s in model.STORES for q in model.FASHION)
        Five_expr2 = model.Lambda_pick[j]  * (model.alpha_pick + model.phi_pick * model.beta_pick[t])
        return (Five_expr1 - Five_expr2 <= model.BigM * (1 - model.theta_pick[j]))

    model.ConstraintFive = Constraint(model.PICKING, model.TIMES)



    # Constraint Six
    def ConstraintSixPutaway_rule(model, t):
        Six_expr1 = model.beta_put[t]
        Six_expr2 = model.gamma * model.alpha_put
        return (Six_expr1 - Six_expr2 <= 0)

    model.ConstraintSixPutaway = Constraint(model.TIMES)



    def ConstraintSixPicking_rule(model, t):
        Six_expr1 = model.beta_pick[t]
        Six_expr2 = model.gamma * model.alpha_pick
        return (Six_expr1 - Six_expr2 <= 0)

    model.ConstraintSixPicking = Constraint(model.TIMES)



    # Constraint Seven
    def ConstraintSeven_rule(model, v, q, s):
        Seven_expr1 = model.tau_sq[s,q]
        Seven_expr2 =  sum(t * model.rho_sqt[s, q, t] for t in model.TIMES)
        Seven_expr2 -= sum(t * model.rho_vqt[v, q, t] for t in model.TIMES)
        return (Seven_expr1 - Seven_expr2 == 0)

    model.ConstraintSeven = Constraint(model.OMEGA_Q, model.STORES)



    # Constraint Eight
    def ConstraintEight_rule(model, s, q):
        Eight_expr1 = model.tau_sq[s,q]
        return (model.pt - Eight_expr1 <= 0)

    model.ConstraintEight = Constraint(model.STORES, model.FASHION)



    # Constraint Nine
    def ConstraintNine_rule(model, s, q):
        Nine_expr1 = sum(t * model.rho_sqt[s, q, t] for t in model.TIMES)
        Nine_expr2 = model.ty - model.L
        return (Nine_expr1 - Nine_expr2 <= 0)

    model.ConstraintNine = Constraint(model.STORES, model.FASHION)



    # Constraint Ten
    def ConstraintTenVendor_rule(model, v, q):
        Ten_expr1 = sum(model.rho_vqt[v, q, t] for t in model.TIMES if model.tb <= t <= model.te)
        return (Ten_expr1 - 1 == 0)

    model.ConstraintTenVendor = Constraint(model.OMEGA_Q)



    def ConstraintTenStore_rule(model, s, q):
        Ten_expr1 = sum(model.rho_sqt[s, q, t] for t in model.TIMES if model.tb <= t <= model.ty)
        return (Ten_expr1 - 1 == 0)

    model.ConstraintTenStore = Constraint(model.STORES, model.FASHION)

    # Constraint Ten Prime
    def ConstraintTenPrimeVendor_rule(model, v, q, t):
        if not model.tb <= t <= model.ty:
            return model.rho_vqt[v, q, t] == 0
        else:
            return Constraint.Skip

    model.ConstraintTenPrimeVendor = Constraint(model.OMEGA_Q, model.TIMES)

    def ConstraintTenPrimeStore_rule(model, s, q, t):
        if not model.tb <= t <= model.ty:
            return model.rho_sqt[s, q, t] == 0
        else:
            return Constraint.Skip

    model.ConstraintTenPrimeStore = Constraint(model.STORES, model.FASHION, model.TIMES)

    # Constraint Eleven and Twelve
    def ConstraintEleven_rule(model, s, p, t):
        assert model.L == 0

        Eleven_expr1 = model.z_spt[s,p,t]
        Eleven_expr2 = model.x_spt[s,p,t]
        return (Eleven_expr1 - Eleven_expr2 == 0)

    model.ConstraintEleven = Constraint(model.STORES, model.PRODUCTS, model.TIMES)


    # Constraint Thirteen
    def ConstraintThirteen_rule(model, s, q, t):
        assert model.L== 0
        if model.tb <= t <= model.ty:
            Thirteen_expr1 = model.z_sqt[s,q,t]
            Thirteen_expr2 = model.X_osq[s,q] * model.rho_sqt[s,q,t]
            return (Thirteen_expr1 - Thirteen_expr2 == 0)
        else:
            return Constraint.Skip

    model.ConstraintThirteen = Constraint(model.STORES, model.FASHION, model.TIMES)

    # Constraint Fourteen and Fifteen
    def ConstraintFourteen_rule(model, p, t):
        Fourteen_expr1 = sum(model.x_vpt[v, p, t] for v, pee in model.OMEGA_P if pee == p)
        Fourteen_expr1 -= sum(model.x_spt[s, p, t] for s in model.STORES)
        Fourteen_expr2 = model.y_pt[p,t] - model.y_pt[p,model.T_minus_One[t]]
        return (Fourteen_expr1 - Fourteen_expr2 == 0)

    model.ConstraintFourteen = Constraint(model.PRODUCTS, model.TIMES)



    # Constraint Sixteen and Seventeen
    def ConstraintSixteen_rule(model,s,p,t):
        Sixteen_expr1 = model.z_spt[s, p, t]
        Sixteen_expr1 -= model.Demand[s,p,t]
        Sixteen_expr2 = model.y_spt[s,p,t] - model.y_spt[s,p,model.T_minus_One[t]]
        return (Sixteen_expr1 - Sixteen_expr2 == 0)

    model.ConstraintSixteen = Constraint(model.STORES, model.PRODUCTS, model.TIMES)



    # Constraint Eighteen
    def ConstraintEighteen_rule(model,s,q,t):
        if model.tb <= t <= model.ty:
            if t == 1:
                Eighteen_expr1 = model.z_sqt[s, q, t]
                Eighteen_expr2 = model.y_sqt[s,q,t]
                return (Eighteen_expr1 - Eighteen_expr2 == 0)
            else:
                Eighteen_expr1 = model.z_sqt[s, q, t]
                Eighteen_expr2 = model.y_sqt[s,q,t] - model.y_sqt[s,q,model.T_minus_One[t]]
                return (Eighteen_expr1 - Eighteen_expr2 == 0)
        else:
            return Constraint.Skip

    model.ConstraintEighteen = Constraint(model.STORES, model.FASHION, model.TIMES)



    # Constraints Nineteen
    def ConstraintNineteen_rule(model, s, t):
        Nineteen_expr1 =  sum(model.V_p[p] * model.z_spt[s, p, t] for p in model.PRODUCTS)
        Nineteen_expr1 += sum(model.V_q[q] * model.z_sqt[s, q, t] for q in model.FASHION)
        Nineteen_expr2 = model.K_s[s]
        return (Nineteen_expr1 - Nineteen_expr2 <= 0)

    model.ConstraintNineteen = Constraint(model.STORES, model.TIMES)



    # Constraints Twenty
    def ConstraintTwenty_rule(model, v, t):
        if v in model.VENDORS_P:
            Twenty_expr1 =  sum(model.W_p[p] * model.x_vpt[v,p,t] for ve, p in model.OMEGA_P
                                                           if ve == v)
        else:
            Twenty_expr1 = 0

        if v in model.VENDORS_Q:
            Twenty_expr1 += sum(model.W_q[q] * model.X_ivq[v,q] * model.rho_vqt[v,q,t]
                            for ve, q in model.OMEGA_Q if ve == v)

        Twenty_expr2 = model.Script_Q * model.n_vt[v,t]
        return (Twenty_expr1 - Twenty_expr2 <= 0)

    model.ConstraintTwenty = Constraint(model.VENDORS, model.TIMES)


    # Constraints TwentyOne
    def ConstraintTwentyOne_rule(model, s, t):
        TwentyOne_expr1 =  sum(model.W_p[p] * model.x_spt[s,p,t] for p in model.PRODUCTS)
        TwentyOne_expr1 += sum(model.W_q[q] * model.X_osq[s,q] * model.rho_sqt[s,q,t] for q in model.FASHION)
        TwentyOne_expr2 = model.Script_Q * model.n_st[s,t]
        return (TwentyOne_expr1 - TwentyOne_expr2 <= 0)

    model.ConstraintTwentyOne = Constraint(model.STORES, model.TIMES)

    return model