我想知道是否可以使用Pyomo解决此类问题:
变量:z(界限=(0,1),S,平方,Loc1
sq = -z *(z-1)
如果(z <= Loc1-0.2或z> = Loc1 + 0.2):S = 0
否则,如果z <= Loc1:S = 0.6 *(z-Loc1 + 0.2)/0.2
否则:S = 0.6 *(Loc1 + 0.2-z)/0.2
最大化(S * sq)
根据此定义,S在Loc1-0.2和Loc + 0.2之间为非零,从(Loc-0.2)处的0上升到Loc1处的0.6,然后又回到(Loc1 + 0.2)处的0。
sq是平方函数,其根在0和1处,最大平方(z = 0.5)= 0.25。
因此,解决问题的方法将是z = 0.5,Loc1 = 0.5,sq = 0.25和S = 0.6(在这些位置,sq和S均为最大值)。
我尝试使用分段线性约束,但是问题是在布尔表达式中使用变量(例如,如果z 感谢您的帮助! 编辑:它可以与类似的东西一起工作:from pyomo.environ import *
m = ConcreteModel()
m.z = Var(bounds=(0,1))
m.S = Var()
m.sq = Var()
m.Loc1 = Var(initialize=0.65)
def sq_func(m):
return m.sq == -(m.z)*(m.z-1)
m.sqcon = Constraint(rule=sq_func)
rangep = [0,0,0.6,0,0]
bpts=[0,0.3,m.Loc1,0.8,1]
m.source=Piecewise(m.S,m.z,pw_pts=bpts,pw_repn='DCC',pw_constr_type='EQ',f_rule=rangep)
def obj(m):
return m.S*m.sq
m.obj = Objective(rule = obj,sense=maximize)
results = SolverFactory('ipopt').solve(m)
print("Loc1: ",value(m.Loc1), "\nz: ", value(m.z), "\nS: ",value(m.S), "\nsq: ",value(m.sq),"\nS*sq: ",value(m.sq)*value(m.S))
我试图在Pyomo中使用分段线性约束。我想知道为什么rangep = [0,0,0.6,0,0]和bpts = [0,0.3,m.Loc1,0.8,1]?如何获得这些值?