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
亲爱的,
我也是 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