Pyomo“data = None”输出错误

时间:2016-12-01 21:02:15

标签: python python-2.7 optimization pyomo

非常感谢您查看我的问题!我是pyomo的新手,现在正试图用它来解决一个具体的模型。

以下是我的代码的一部分:

---(编辑)

def objective_rule(model):
        ans = sum(model.DAEB[t] * model.DAEP[t] for t in model.t)
        ans -= sum(model.DARUP[t] * model.RU[t] + model.DARDP[t] * model.RD[t] for t in model.t)
        ans += sum(0.5 * (sum(model.penalty[t, w]) + sum(-model.RTEP[t] * (model.DAEB[t] - ((model.RTRD[t, w] * model.RU[t]) +
               sum(model.veh_pwer_dem[t, v, w] for v in model.v))))) for t in model.t for w in model.w)
        ans += 0.95 * (model.epslon + 1 / (0.5) * sum(0.01 * model.miu[w] for w in model.w))
        return ans
  • t被定义为集合[0:23],一天的时间小时;
  • w定义为[0,1],它是不同的场景;
  • v是[0:29],30个不同的样本。

在定义目标函数之前,我还定义了一系列与上述模型变量相关的约束。

除了直到最后一步,所有事情都顺利进行,pyomo给出了:

---(编辑)

Traceback (most recent call last):
  line 61, in <module>
    myresult = result.solve(project, pricefile, reg_dispatch, SOC=0, SOC_margin=0.05)

  line 56, in solve
    opti_model, result = self.Fr_optimal_bidding_optimization(self.vehicles, pricefile, reg_dispatch, SOC)

  line 347, in Fr_optimal_bidding_optimization
    model.objective = Objective(rule=objective_rule, sense=minimize, doc='minimize the total cost')

  line 483, in __setattr__
    self.add_component(name, val)

  line 849, in add_component
    val.construct(data)

  line 307, in construct
    tmp = _init_rule(_self_parent)

  line 337, in objective_rule
    sum(model.veh_pwer_dem[t, v, w] for v in model.v))))) for t in model.t for w in model.w)

ERROR: Rule failed when generating expression for objective objective:
  line 337, in <genexpr>
    TypeError: '_GeneralVarData' object is not iterable
    sum(model.veh_pwer_dem[t, v, w] for v in model.v))))) for t in model.t for w in model.w)

ERROR: Constructing component 'objective' from data=None failed:
TypeError: '_GeneralVarData' object is not iterable
    TypeError: '_GeneralVarData' object is not iterable

首先,我对_GeneralVarData对象感到困惑,不知道它指的是什么,其次,我在目标函数中看不到问题,所以如果有人可以提供任何问题一点意见将不胜感激!!

(我也是“stackoverflow”的新手,如果我的问题没有明确说明,请在前面道歉!)

1 个答案:

答案 0 :(得分:2)

例外由第二行到最后一行中的以下代码触发:

sum(model.veh_pwer_dem[t, v, w])

这会尝试将(标量)model.veh_pwer_dem[t, v, w]视为可迭代的并对其键(索引)求和。表达式的逻辑结构似乎还存在其他问题。我强烈建议将表达式分成更小的块,以帮助您保持清晰。例如:

def objective_rule(model):
    ans = sum(model.DAEB[t] * model.DAEP[t] for t in model.t)
    ans -= sum(model.DARUP[t] * model.RU[t] + model.DARDP[t] * model.RD[t] for t in model.t)
    ans += sum(0.5 * ( sum(model.penalty[t, w] for t in model.t for w in model.w) + # ...
    #...
    return ans

关于_GeneralVarData对象是什么。 _GeneralVarData个对象是一个内部Pyomo结构,用于表示作为索引Var组件一部分的实际优化变量(您可能偶尔会看到_SimpleVar,这是用于非{}的内部实现-indexed Var组件)。作为Pyomo(以及一般的Python)中的规则,以下划线(_)开头的方法,属性和类是&#34;私有&#34;实施。