具有一个索引的对象不可迭代
Posted
技术标签:
【中文标题】具有一个索引的对象不可迭代【英文标题】: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()
【问题讨论】:
请访问并阅读***.com/help。在主题和问题文本中也要使用正确的大写字母。 什么是T
?如果它只有 1,那么您应该删除所有这些生成器表达式。另外,请发布错误消息 - 无法帮助您了解您提供的信息量。
T 是每个时间序列的索引(所以对于 0:00 然后 1:00 ....)
【参考方案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 丢失了。
【讨论】:
以上是关于具有一个索引的对象不可迭代的主要内容,如果未能解决你的问题,请参考以下文章
具有可迭代对象的字典字典到具有多索引的可迭代对象索引的熊猫数据框
传播不可迭代实例的尝试无效。为了可迭代,非数组对象必须具有 [Symbol.iterator]() 方法
是否有办法知道对象内部是否具有不可迭代的NoneType对象