【问题标题】:object with one indice not iterable具有一个索引的对象不可迭代
【发布时间】:2020-10-16 20:27:13
【问题描述】:

当我尝试优化模型时,我总是得到不可迭代的对象。

目标是以最低的燃料成本用动力装置 a、b、c 来满足需求。

是因为我只有一个指数吗?我该如何解决这个问题?

df_demand = pd.read_excel('...')
df_timestep = pd.read_excel('...')
df_fuel = pd.read_excel('...')
m = gp.Model('try1')

demand_model = df_demand['HeatDemand'].copy()
fuel_model = df_fuel.copy()

cost_oil = fuel_model['Oil']
cost_coal = fuel_model['Coal']
cost_co2 = fuel_model['CO2']
cost_gas = fuel_model['Gas']



T = range(len(df_timestep))

Q_a = m.addVars(T, vtype=GRB.CONTINUOUS, name='heat a')
Q_b = m.addVars(T, vtype=GRB.CONTINUOUS, name='heat b')
Q_c = m.addVars(T, vtype=GRB.CONTINUOUS, name='heat c')

Y = m.addVars(T, vtype=GRB.BINARY, name='Status Anlage')


m.addConstrs((Q_a[t] <= 150*Y[t] for t in T), name='a Max.Leistung')
m.addConstrs((Q_a[t] >= 60*Y[t] for t in T), name='a Min. Leistung')
m.addConstrs((Q_b[t] <= 150*Y[t] for t in T), name='b Max.Leistung')
m.addConstrs((Q_b[t] >= 60*Y[t] for t in T), name='b Min. Leistung')
m.addConstrs((Q_c[t] <= 221*Y[t] for t in T), name='c Max.Leistung')
m.addConstrs((Q_c[t] >= 88.4*Y[t] for t in T), name='c Min. Leistung')


m.update()

以下部分不可迭代

m.update()
m.setObjective(quicksum(Q_a[t]*cost_gas[t]+Q_b[t]*cost_coal[t]+Q_c[t]*cost_oil[t]+
                    对于 T 中的 t),GRB.MINIMIZE)
m.optimize()

【问题讨论】:

  • 请访问并阅读stackoverflow.com/help。在主题和问题文本中也要使用正确的大写字母。
  • 什么是T?如果它只有 1,那么您应该删除所有这些生成器表达式。另外,请发布错误消息 - 无法帮助您了解您提供的信息量。
  • T 是每个时间序列的索引(所以对于 0:00 然后 1:00 ....)

标签: python pandas optimization iterable gurobi


【解决方案1】:

您可以编写一个小循环来检查各个数据结构:

for t in range(T):
    print(Q_a[t])
    print(cost_gas[t])
    print(Q_b[t])
    print(cost_coal[t])
    print(Q_c[t])
    print(cost_oil[t])

或者至少检查大小是否一致,例如:

assert len(cost_oil) == len(T)

您制定目标的方式也存在问题。有一个尾随 +,所以看起来最后一个 summand 丢失了。

【讨论】:

    猜你喜欢
    • 2019-11-09
    • 2018-04-01
    • 2017-12-18
    • 2021-09-29
    • 2023-01-16
    • 1970-01-01
    • 1970-01-01
    • 2011-07-23
    • 1970-01-01
    相关资源
    最近更新 更多