首页 文章

我应该使用gurobi线性化或尝试用python解决MINLP,还是尝试完全不同的方法?

提问于
浏览
1

我对此很陌生,所以我只是想拍摄并希望我尽可能准确,你会认为它值得回答 .

我正在尝试优化(最小化)成本/数量模型,其中两者都是连续变量 . 应尽量减少全球成本,但这取决于总量,这取决于具体成本 .

到目前为止我的代码看起来像这样:

# create model
m = Model('Szenario1')

# create variables 
X_WP = {}
X_IWP = {}

P_WP = {}
P_IWP = {}

for year in df1.index:
    X_WP[year] = m.addVar(vtype=GRB.CONTINUOUS, name="Wärmepumpe%d" % year)
    X_IWP[year] = m.addVar(vtype=GRB.CONTINUOUS, name="Industrielle Wärmepumpe%d" % year)

    #Price in year i =  Base.price * ((Sum of newly installed capacity + sum of historical capacity)^(math.log(LearningRate)/math.log(2)))
    P_WP[year] = P_WP0 * (quicksum(X_WP[year] for year in df1.index) ** (learning_factor)
    P_IWP[year] = m.addVar(vtype=GRB.CONTINUOUS, name="Preis Industrielle Wärmepumpe%d" % year)

X_WP[2016] = 0
X_IWP[2016] = 0

# Constraints and Objectives 
for year in df1.index:
    m.addConstr((X_WP[year]*VLST_WP+X_IWP[year]*VLST_IWP == Wärmemenge[year]), name="Demand(%d)" % year)
    obj = quicksum(
    ((X_WP[year]-X_WP[year-1])*P_WP[year]+X_WP[year]*Strompreis_WP*VLST_WP)+
    ((X_IWP[year]-X_IWP[year-])*P_IWP[year]+X_IWP[year]*Strompreis_EHK*VLST_IWP)
    for year in Wärmemenge.index)

 m.setObjective(obj, GRB.MINIMIZE)
 m.update()
 m.optimize()

X是数量,P是价格 . WP和IWP是两种不同的技术(稍后将添加更多) . 由于X和P相乘,问题是非线性的,现在我还没有找到一个解决方案,以便为gurobi提供一个可以处理的目标 .

我的在线研究和stackoverflow基本上让我得出结论,我可以用gurobi进行线性化和求解,找到另一个可以解决这个MINLP的解算器,或者以Gurobi可以解决的方式制定我的目标 . 由于我已经熟悉了Gurobi,这将是我的首选 .

关于什么是最好的建议?将不胜感激!

1 回答

  • -1

    我建议使用Pyomo重写你的Python代码 .

    这是Python的通用优化建模框架,可以为Gurobi以及许多其他优化工具构建有效的输入 .

    特别是,它允许您使用Ipopt作为后端,它确实解决了(至少某些)非线性问题 . 即使Ipopt无法解决您的非线性问题,使用Pyomo将允许您快速测试,然后如果事情无法解决,则可以轻松地回到Gurobi中的线性化表示 .

相关问题