Python Pyomo:布尔语句中带有变量的简单优化问题

问题描述 投票:1回答:1

我想知道是否可以使用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))

python boolean constraints pyomo piecewise
1个回答
0
投票

我试图在Pyomo中使用分段线性约束。我想知道为什么rangep = [0,0,0.6,0,0]和bpts = [0,0.3,m.Loc1,0.8,1]?如何获得这些值?

© www.soinside.com 2019 - 2024. All rights reserved.