Search code examples
pythonpyomo

obtain parameters from another parameters


How to convert parameters bigger than a certain number into 1 and smaller than a certain number into 0.

For exmaple, I set parameters

model.distance = Param(model.dc,model.location,domain=NonNegativeReals)

param distance := DC1 Shelter1 0.61 DC1 Shelter2 3.32 DC1 Shelter3 9.5 DC1 Shelter4 6.52 DC2 Shelter1 6.04 DC2 Shelter2 0.51 DC2 Shelter3 1.34 DC2 Shelter4 6.06 ;

How could I obtain a new parameters say model.a that is (threshold = 2):

DC1 Shelter1 0 DC1 Shelter2 1 DC1 Shelter3 1 DC1 Shelter4 1 DC2 Shelter1 1 DC2 Shelter2 0 DC2 Shelter3 0 DC2 Shelter4 1

I know it's an easy question, but I'm new to pyomo & python. Thanks


Solution

  • Here is my total code:

    from pyomo.environ import *
    

    model = AbstractModel("Warehouse Location")

    model.location = Set() model.dc = Set()

    model.distance = Param(model.dc,model.location,domain=NonNegativeReals) model.demands = Param(model.location)

    model.x = Var(model.dc, model.location, domain=NonNegativeReals) model.y = Var(model.dc, within=Binary)

    def obj_expression(model): transportation_cost = sum(sum(2*model.y[i]*model.distance[i,j]*model.x[i,j] \ for j in model.location) for i in model.dc) fixed_cost = 300000*summation(model.y) return transportation_cost + fixed_cost model.OBJ = Objective(rule=obj_expression)

    def supply_constraints_rule(model,dc): return sum(model.x[dc,l] for l in model.location) <= 150000 model.supply_Constraint = Constraint(model.dc, rule=supply_constraints_rule)

    def supply_constraints_rule(model,dc): return sum(model.x[dc,l] for l in model.location) <= 150000 model.supply_Constraint = Constraint(model.dc, rule=supply_constraints_rule)

    def demand_constraints_rule(model, l): return sum(model.y[dc]*model.x[dc,l] for dc in model.dc) >= model.demands[l] model.demand_Constraint = Constraint(model.location, rule=demand_constraints_rule)

    This constraint requires that at least 60% of demand should be less than 2 miles from DCs

    def LOS_Constraints_rule():
    model.a = model.distance >= 2 return summation(model.a, model.x)/summation(model.x) >= 0.6 model.LOS_Constraint = Constraint(model, rule=LOS_Constraints_rule)

    opt = SolverFactory('gurobi', solver_io='python') instance = model.create_instance("Continuous Location.dat") results = opt.solve(instance) instance.display()

    And this is my data:

    set dc := DC1 DC2 DC3 DC4 DC5;

    set location := Shelter1 Shelter2 Shelter3 Shelter4 Shelter5 Shelter6 Shelter7 Shelter8;

    param distance := DC1 Shelter1 0.61 DC1 Shelter2 3.32 DC1 Shelter3 9.5 DC1 Shelter4 6.52 DC1 Shelter5 7.77 DC1 Shelter6 1.92 DC1 Shelter7 8.52 DC1 Shelter8 9.75 DC2 Shelter1 6.04 DC2 Shelter2 0.51 DC2 Shelter3 1.34 DC2 Shelter4 6.06 DC2 Shelter5 0.22 DC2 Shelter6 6.33 DC2 Shelter7 4.61 DC2 Shelter8 3.28 DC3 Shelter1 4.99 DC3 Shelter2 2.41 DC3 Shelter3 2.33 DC3 Shelter4 3.95 DC3 Shelter5 8.84 DC3 Shelter6 7.94 DC3 Shelter7 7.87 DC3 Shelter8 0.94 DC4 Shelter1 5.58 DC4 Shelter2 8.8 DC4 Shelter3 6.32 DC4 Shelter4 8.54 DC4 Shelter5 5.15 DC4 Shelter6 6.06 DC4 Shelter7 9.42 DC4 Shelter8 2.16 DC5 Shelter1 7.87 DC5 Shelter2 9.64 DC5 Shelter3 0.7 DC5 Shelter4 5.92 DC5 Shelter5 2.7 DC5 Shelter6 0.26 DC5 Shelter7 0.5 DC5 Shelter8 3.4;

    param demands := Shelter1 14000 Shelter2 8000 Shelter3 25000 Shelter4 22000 Shelter5 20000 Shelter6 17000 Shelter7 18500 Shelter8 23000 ;