我有一个(相当)简单的Pyomo模型,有5个参数和一组48(表示时间间隔)。如果我使用特定的数据文件,GLPK绝对可以正常工作:
# Data file
param : n := 48;
param : E_demand :=
1 231.674545
2 223.328638
3 218.047274
4 212.285910
5 214.539544
6 213.940455
7 216.871637
8 205.824183
9 208.905001
(这继续以类似的方式继续到索引48和4个更多参数)。
但是如果我使用另一个(只是稍微不同的)数据文件,问题需要更长的时间才能解决(从不到一秒钟到超过20分钟,我没有费心去找多久)。如果我只是将其中两个参数更改为其值的约1/3(如下所示),则问题需要更长时间才能解决。
param : E_demand :=
1 76.464996
2 69.815002
3 71.355003
4 75.004997
5 72.360001
6 71.065002
7 70.669998
8 71.809998
9 72.309998
我认为问题必须与缩放有关,因为如果我逐渐将较小的值从一个数据文件替换到另一个数据文件,则问题需要更长的时间,直到它变得非常慢。有没有办法改变使用Pyomo的glpk缩放?使用不同的解算器可能会解决这个问题吗?
对于ConcreteModel
,您可以通过检查参数值并在模型公式中应用相关的缩放因子,在模型构建期间始终实现某种形式的缩放。
关于变量/约束缩放的类似讨论可以在Pyomo问题页面上找到:https://github.com/Pyomo/pyomo/issues/219
你可以试试gurobi求解器。从个人经验来看,我认为gurobi比GLPK更好,更稳定,因为大的选择问题。如果您的选择问题是LP,那么当您将数据文件更改为原始文件的1/3时,它不会产生任何解决方案的差异。因为它是一样的,例如:
def constraint(m, n):
m.E_demand[n] <= m.x
无论是Demand[1] = 200
还是73
都没有任何区别。但是,我并不真正了解你的模型,所以这只是一个假设。
这里是gurobi求解器:http://www.gurobi.com/,它也可以免费用于学术目的。