我对此很陌生,所以我只是想拍摄并希望我尽可能准确,你会认为它值得回答 .
我正在尝试优化(最小化)成本/数量模型,其中两者都是连续变量 . 应尽量减少全球成本,但这取决于总量,这取决于具体成本 .
到目前为止我的代码看起来像这样:
# 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 回答
我建议使用Pyomo重写你的Python代码 .
这是Python的通用优化建模框架,可以为Gurobi以及许多其他优化工具构建有效的输入 .
特别是,它允许您使用Ipopt作为后端,它确实解决了(至少某些)非线性问题 . 即使Ipopt无法解决您的非线性问题,使用Pyomo将允许您快速测试,然后如果事情无法解决,则可以轻松地回到Gurobi中的线性化表示 .