model.T = Param(model.k, initialize={'A': 0.0015, 'B': 0.0020}, doc='Transport Costs')
model.TC = Param(model.k, initialize={'A': 50000, 'B': 30000}, doc='Truck Costs')
model.P = Param(model.k, initialize={'A': 5.2, 'B': 6.0}, doc='Product Price')
model.R = Param(model.k, initialize={'A': 35, 'B': 45}, doc="Hours of Work")

## Define variables ##
model.X = Var(model.i, model.j, model.k, within=NonNegativeIntegers, doc="Product k flow from i to j")
model.M = Var(model.i, within=Binary, doc="Manufacturing plant i exists")
model.NT = Var(model.i, model.j, within=NonNegativeIntegers, doc="Trucks Required")
model.MSA = Var(model.s, model.i, model.sub_a, within=NonNegativeIntegers, doc="Sub Item A flow from s to i")
model.MSB = Var(model.s, model.i, model.sub_b, within=NonNegativeIntegers, doc="Sub Item B flow from s to i")

## Define constraints ##
def Demand(model, j, k):
    return sum(model.X[i, j, k] for i in model.i) <= model.CD[j, k]
model.Demand = Constraint(model.j, model.k, rule=Demand, doc='Supply Demand')

def Capacity(model, i):
    return sum(model.X[i, j, k]*(model.R[k]/1000) for j in model.j for k in model.k) <= 25000*model.M[i]
model.Capacity = Constraint(model.i, rule=Capacity, doc='Manufacturer Capacity')

def Trucks(model, i, j):
    return model.NT[i, j] >= ((5/3)*model.X[i, j, 'A'] + model.X[i, j, 'B'])/30000
model.Trucks = Constraint(model.i, model.j, rule=Trucks, doc='Trucks Required')

def SubDemandA(model, i, sub_a):
    return sum(model.MSA[s, i, sub_a] for s in model.s) == sum(model.X[i, j, 'A'] for j in model.j)
model.SubDemandA = Constraint(model.i, model.sub_a, rule=SubDemandA, doc='Sub Items for A')

def SubDemandB(model, i, sub_b):
    return sum(model.MSB[s, i, sub_b] for s in model.s) == sum(model.X[i, j, 'B'] for j in model.j)