Pyomo: TypeError: unhashable type: 'OrderedScalarSet'

Pyomo: TypeError: unhashable type: 'OrderedScalarSet'

亲爱的,
我也是 Python 和 Pyomo 的新手。

我正在创建一个抽象模型,下面是与我的错误相关的集合、参数和变量:

套数:
SCUC.UP = 设置()
SCUC.zone = 设置()
来自 .dat 文件
“设置:= G1 G2 G3 G4 G5 G6;
设置区域 := Z1 Z2 Z3;"

参数: SCUC.Pmi = 参数(SCUC.UP)
SCUC.zonal_UP = 参数(SCUC.UP, SCUC.zone)
来自 .dat 文件
“参数 Pmi :=
G1 300.0
G2 200.0
G3 350.0
G4 210.0
G5 200.0
G6 240.0;
参数 zonal_UP :=
G1 Z1 1
G2 Z1 1
G3 Z1 0
G4 Z1 0
G5 Z1 0
G6 Z1 0
G1 Z2 0
G2 Z2 0
G3 Z2 1
G4 Z2 1
G5 Z2 0
G6 Z2 0
G1 Z3 0
G2 Z3 0
G3 Z3 0 G4 Z3 0
G5 Z3 1
G6 Z3 1;"

变量:
SCUC.UP_gz = Var(SCUC.zone)
SCUC.DPg_g = Var(SCUC.UP, within = Reals)

我正在尝试键入三个约束,我需要将 variables/parameters 的向量与参数向量相乘以获得标量值。 这里的约束公式:

def zonal_gen_rule(SCUC,z):  
    return SCUC.UP_gz[z]  ==  SCUC.Pmi[SCUC.UP] * SCUC.zonal_UP[SCUC.UP,z] + SCUC.zonal_UP[SCUC.UP,z] * SCUC.DPg_g[SCUC.UP]
SCUC.zonal_gen = Constraint(SCUC.zone, rule=zonal_gen_rule)

但是当我午餐构建实例时出现以下错误:

TypeError:无法散列的类型:'OrderedScalarSet'

它也尝试用 numpy 转置向量,但没有成功。

希望有人能帮助我。

第一个原因:当您尝试将可变类型对象作为键插入到字典中时,会发生此类错误。可变对象是那些值可以在 运行 时间更改的对象,例如:列表是可变对象。

第二个原因:您已经在 class 中实现了 __eq__ 方法,因此哈希不再适用于您的 class,您可以通过实现 __hash__ 来解决这个问题class.

中的方法

在你的情况下,你的对象看起来是不可散列的。尝试在 class.

中实现 __hash__ 方法

您可以在此处了解有关这些方法的更多信息:https://docs.python.org/3/reference/datamodel.html

您收到该错误是因为您将 整个集合 传递给表达式,而不是集合中的一个元素。由于整个集合是“不可散列的”,您会收到错误

SCUC.UP_gz[z]  ==  SCUC.Pmi[SCUC.UP] * ...
                               ^
                            this is illegal... it is the whole set

不清楚您要根据问题的上下文做出什么类型的约束......这意味着不清楚您是否打算对 SCUC.UP 的成员求和或使每对的约束...因此下面的示例显示了执行此操作的“两种方式”。

另外,在大写字母的使用上稍微标准化将有助于您排除故障。约定是所有变量都是小写的,但是,集合表示法中的约定有时对集合名称有上限,对成员有小写....无论哪种方式,一致性是故障排除的关键。

from pyomo.environ import *

SCUC = ConcreteModel('example')

# SETS
SCUC.ups = Set(initialize=['G1', 'G2', 'G3'])
SCUC.zones = Set(initialize=['Z1', 'Z2'])

# PARAMS
SCUC.pmi = Param(SCUC.ups, initialize=2)  # junk initialization...
SCUC.zonal_up = Param(SCUC.ups, SCUC.zones, initialize=3)

# VARIABLES
SCUC.u = Var(SCUC.zones)
SCUC.d = Var(SCUC.ups)

# CONSTRAINTS
# "for each" (up, zone) pair...
def zonal_gen_rule(SCUC, zone, up):
    return SCUC.u[zone] == SCUC.pmi[up] * SCUC.zonal_up[up, zone] \
                           + SCUC.zonal_up[up, zone] * SCUC.d[up]
SCUC.zonal_gen_1 = Constraint(SCUC.zones, SCUC.ups, rule=zonal_gen_rule)

# "for each zone, sum the ups"
def zonal_gen_rule_2(SCUC, zone):
    return SCUC.u[zone] == sum(SCUC.pmi[up] * SCUC.zonal_up[up, zone] \
                           + SCUC.zonal_up[up, zone] * SCUC.d[up] for up in SCUC.ups)
SCUC.zonal_gen_2 = Constraint(SCUC.zones, rule=zonal_gen_rule_2)

SCUC.pprint()

产量:

...

2 Constraint Declarations
    zonal_gen_1 : Size=6, Index=zonal_gen_1_index, Active=True
        Key          : Lower : Body                  : Upper : Active
        ('Z1', 'G1') :   0.0 : u[Z1] - (6 + 3*d[G1]) :   0.0 :   True
        ('Z1', 'G2') :   0.0 : u[Z1] - (6 + 3*d[G2]) :   0.0 :   True
        ('Z1', 'G3') :   0.0 : u[Z1] - (6 + 3*d[G3]) :   0.0 :   True
        ('Z2', 'G1') :   0.0 : u[Z2] - (6 + 3*d[G1]) :   0.0 :   True
        ('Z2', 'G2') :   0.0 : u[Z2] - (6 + 3*d[G2]) :   0.0 :   True
        ('Z2', 'G3') :   0.0 : u[Z2] - (6 + 3*d[G3]) :   0.0 :   True
    zonal_gen_2 : Size=2, Index=zones, Active=True
        Key : Lower : Body                                              : Upper : Active
         Z1 :   0.0 : u[Z1] - (6 + 3*d[G1] + 6 + 3*d[G2] + 6 + 3*d[G3]) :   0.0 :   True
         Z2 :   0.0 : u[Z2] - (6 + 3*d[G1] + 6 + 3*d[G2] + 6 + 3*d[G3]) :   0.0 :   True