对于使用 oemof (solph) 和 CBC 求解器的小能量模型,求解器时间似乎过高

Solver time seems to be to high for a small energy model using oemof (solph) with CBC solver

我用 oemof 建立了一个有 6 总线的电力能源系统。每条总线都有一个简单的输入。总线 1 双向连接到总线 2(2 个变压器)。总线 2 以相同的方式连接到总线 3。 ……总线6连接到总线1。因此它是一个环形结构。每辆公共汽车都有一个洗手池。 公交车1还通过燃气发电厂与燃气公交车相连。气体总线有 1 个能量输入。 现在我开始将总线 1 上的一个需求与 8760 个时间步长(一年)连接起来。我让程序解决这个能量系统中每个对象的流动。 40 秒后我得到了解决方案。 但我的目标是解决系统中有更多需求的问题。所以我在2路总线上集成了第二个需求。现在计算时间大约是3分钟。对于 3 路公交车的第三次需求,计算时间为 15 分钟。而且每辆公交车都有需求,需要40多分钟。

我的处理器是 i5 4670K 3.4 GHz。

我的问题是:为什么CBC求解器需要这么多时间来解决能源系统中需求更多的问题?有什么原因吗?

你现在知道求解器的具体工作原理了吗?我找不到任何答案

系统有一个需求:

128382 Obj 1.6384541e+013 Primal inf 6.0004356e+008 (5) Dual inf 2.5973983e-006 (1)
Primal infeasible - objective value 1.6384541e+013
PrimalInfeasible objective 1.638454066e+013 - 128382 iterations time 36.552 

系统有两个需求:

155933 Obj 1.1686988e+014 Primal inf 3.7517663e+010 (20494)
Primal infeasible - objective value 1.1686988e+014
PrimalInfeasible objective 1.16869879e+014 - 155933 iterations time 1728.062 

我同意 40 分钟对于这么小的系统来说似乎太长了。

通常情况下,如果问题不可行,求解器时间会显着增加。因此,您应该确保在添加额外的需求对象后问题仍然可以解决。顺便说一句,不同的单位(或前缀)是典型的错误来源。

解决问题的一种简单方法是向每辆公交车(余额)添加无限的过剩和短缺对象。确保短缺源对于求解器来说比所有其他对象都更昂贵,否则它可能会被用来代替你的发电厂。

oemof.solph 看起来像这样(例如 bus_1):

from oemof import solph

# shortage bus_1
solph.Source(label='shortage_1',
             outputs={bus_1: solph.Flow(variable_costs=50000)})

# excess bus_1
solph.Sink(label='excess_1', inputs={bus_1: solph.Flow()})

如果将这些对象添加到每辆公交车上,您的问题就可以解决。之后您可以检查结果。如果这些汇点和源点的总和大于零,则没有它们问题将无法解决。现在您可以分析结果以找出问题所在。