def define_model(**kwds): model = ConcreteModel() model.x = Var(INDEX_SET, bounds=(-5, 4)) # domain variable model.Fx = Var(INDEX_SET) # range variable model.p = Param(INDEX_SET, initialize=1.0) model.obj = Objective(expr=sum_product(model.Fx), sense=kwds.pop('sense', maximize)) model.piecewise = Piecewise(INDEX_SET, model.Fx, model.x, pw_pts=DOMAIN_PTS, f_rule=F, **kwds) #Fix the answer for testing purposes model.set_answer_constraint1 = Constraint(expr=model.x[1] == -5.0) model.set_answer_constraint2 = Constraint(expr=model.x[2] == -3.0) model.set_answer_constraint3 = Constraint(expr=model.x[3] == -2.5) model.set_answer_constraint4 = Constraint(expr=model.x[4] == -1.5) model.set_answer_constraint5 = Constraint(expr=model.x[5] == 2.0) model.set_answer_constraint6 = Constraint(expr=model.x[6] == 3.5) model.set_answer_constraint7 = Constraint(expr=model.x[7] == 4.0) return model
def define_model(**kwds): model = ConcreteModel() model.x = Var(INDEX_SET1, INDEX_SET2, bounds=(0,6)) # domain variable model.Fx = Var(INDEX_SET1, INDEX_SET2) # range variable model.p = Param(INDEX_SET1, INDEX_SET2, initialize=1.0) model.obj = Objective(expr=sum_product(model.Fx), sense=kwds.pop('sense',maximize)) model.piecewise = Piecewise(INDEX_SET1,INDEX_SET2,model.Fx,model.x, pw_pts=DOMAIN_PTS, f_rule=F, **kwds) #Fix the answer for testing purposes model.set_answer_constraint1 = Constraint(INDEX_SET2,rule= lambda model,t2,t3: model.x['1',t2,t3] == 0.0) model.set_answer_constraint2 = Constraint(INDEX_SET2,rule= lambda model,t2,t3: model.x['2',t2,t3] == 3.0) model.set_answer_constraint3 = Constraint(INDEX_SET2,rule= lambda model,t2,t3: model.x['3',t2,t3] == 5.5) model.set_answer_constraint4 = Constraint(INDEX_SET2,rule= lambda model,t2,t3: model.x['40',t2,t3] == 6.0) return model
def define_model(**kwds): model = ConcreteModel() model.x = Var(INDEX) # domain variable model.Fx = Var(INDEX) # range variable model.obj = Objective(expr=sum_product(model.Fx)+sum_product(model.x), sense=kwds.pop('sense',maximize)) model.piecewise = Piecewise(INDEX,model.Fx,model.x, pw_pts=DOMAIN_PTS, f_rule=F, unbounded_domain_var=True, **kwds) #Fix the answer for testing purposes model.set_answer_constraint1 = Constraint(expr= model.x[1] == 0.5) # Fx1 should solve to 0 model.set_answer_constraint2 = Constraint(expr= model.x[2] == 1.0) # model.set_answer_constraint3 = Constraint(expr= model.Fx[2] == 0.5) # model.set_answer_constraint4 = Constraint(expr= model.x[3] == 1.5) # Fx3 should solve to 1 model.set_answer_constraint5 = Constraint(expr= model.x[4] == 2.5) # Fx4 should solve to 1.5 return model
def ub_indices_init(model): return [(t1, t2, i) for t1 in INDEX_SET1 for t2 in INDEX_SET2 for i in xrange(len(PIECEWISE_PTS[t1, t2]))] model.SOS_indices = Set(INDEX_SET1, INDEX_SET2, dimen=3, ordered=True, initialize=SOS_indices_init) model.ub_indices = Set(ordered=True, dimen=3, initialize=ub_indices_init) model.x = Var(INDEX_SET1, INDEX_SET2) model.Fx = Var(INDEX_SET1, INDEX_SET2) #Add SOS1 variable to model model.y = Var(model.ub_indices, within=NonNegativeReals) def constraint1_rule(model, t1, t2): return model.x[t1, t2] == sum(model.y[t1, t2, i] * PIECEWISE_PTS[t1, t2][i] for i in xrange(len(PIECEWISE_PTS[t1, t2]))) def constraint2_rule(model, t1, t2): return model.Fx[t1, t2] == sum(model.y[t1, t2, i] * F(PIECEWISE_PTS[t1, t2][i]) for i in xrange(len(PIECEWISE_PTS[t1, t2])))
INDEX_SET = [1,2] PIECEWISE_PTS = {1:[1,2,3], 2:[1,2,3]} F = lambda x: x**2 model = ConcreteModel() def SOS_indices_init(model,t): return [(t,i) for i in xrange(len(PIECEWISE_PTS[t]))] def ub_indices_init(model): return [(t,i) for t in INDEX_SET for i in xrange(len(PIECEWISE_PTS[t]))] model.SOS_indices = Set(INDEX_SET,dimen=2, ordered=True, initialize=SOS_indices_init) model.ub_indices = Set(ordered=True, dimen=2,initialize=ub_indices_init) model.x = Var(INDEX_SET) model.Fx = Var(INDEX_SET) #Add SOS2 variable to model model.y = Var(model.ub_indices,within=NonNegativeReals) def constraint1_rule(model,t): return model.x[t] == sum(model.y[t,i]*PIECEWISE_PTS[t][i] for i in xrange(len(PIECEWISE_PTS[t])) ) def constraint2_rule(model,t): return model.Fx[t] == sum(model.y[t,i]*F(PIECEWISE_PTS[t][i]) for i in xrange(len(PIECEWISE_PTS[t])) ) def constraint3_rule(model,t): return sum(model.y[t,j] for j in xrange(len(PIECEWISE_PTS[t]))) == 1 model.obj = Objective(expr=sum_product(model.Fx), sense=maximize) model.constraint1 = Constraint(INDEX_SET,rule=constraint1_rule) model.constraint2 = Constraint(INDEX_SET,rule=constraint2_rule) model.constraint3 = Constraint(INDEX_SET,rule=constraint3_rule) model.SOS_set_constraint = SOSConstraint(INDEX_SET, var=model.y, index=model.SOS_indices, sos=2)