Python 如何从pyomo模型中删除集合元素(和相关组件)?

Python 如何从pyomo模型中删除集合元素(和相关组件)?,python,optimization,pyomo,Python,Optimization,Pyomo,我试图在创建模型后从pyomo集合中删除元素,以探索更小规模的优化问题实例。简言之,我的问题是:在删除集合元素后,如何确保模型的完整性? 我的方法是循环遍历Param、Var、Constraint和Expression组件,这些组件可能被更改的集合索引。(对于大型模型来说,这相当麻烦,但不确定如何进行!) 删除集合元素后调用solve()时会出现错误,在我尝试纠正这种情况时,我一直在尝试删除带有已删除集合元素索引值的Param组件 当每个组件循环时,索引键等于该集合元素值的组件将被删除。但是,它

我试图在创建模型后从pyomo集合中删除元素,以探索更小规模的优化问题实例。简言之,我的问题是:在删除集合元素后,如何确保模型的完整性?

我的方法是循环遍历Param、Var、Constraint和Expression组件,这些组件可能被更改的集合索引。(对于大型模型来说,这相当麻烦,但不确定如何进行!)

删除集合元素后调用solve()时会出现错误,在我尝试纠正这种情况时,我一直在尝试删除带有已删除集合元素索引值的Param组件

当每个组件循环时,索引键等于该集合元素值的组件将被删除。但是,它似乎不适用于pyo.Param组件,因为当您尝试为它们编制索引时,返回的是实际值,而不是组件。所以“德尔”不起作用。。。。而且,除非是可变的,否则传递一个全新的字典(需要在pyomo之外进行重组)是行不通的。也许它需要是可变的

这里有一个最小的例子。。。(具有两个集合、两个参数和一个变量)

#---构建一个模型---
my_model=pyo.ConcreteModel()
my_model.A=pyo.Set(初始化=['a1','a2'])
my_model.B=pyo.Set(初始化=['b1','b2'])
my_model.C=pyo.Set(initialize=[('a1','b1'),('a2','b1'),('a2','b2')],在=my_model.A*my_model.B内)
my_model.param1=pyo.Param(my_model.A,initialize={'a1':5,'a2':9})
my_model.param2=pyo.Param(my_model.B,initialize={'b1':1,'b2':2})
my_model.x=pyo.Var(my_model.A,my_model.B,domain=pyo.nonnegativerelals)
def约束_规则(m,a):
温度=总和([(m.param1[a]*m.x[a,b])
对于m.b]中的b)
返回5,临时,无
my_model.constraint=pyo.constraint(my_model.A,rule=constraint\u rule)
定义目标规则(m):
返回和([(m.param1[a]*m.param2[b]*m.x[a,b])
硕士学位
对于m.b]中的b)
my_umodel.objective\u expr=pyo.Expression(rule=object\u rule)
my_model.objective=pyo.objective(rule=lambda m:m.component('objective_expr'),sense=pyo.minimize)
#---现在让我们从set1中删除一个元素('a2')---
#---首先,保留数据,这样我们就不会在循环中迭代组件时试图更改组件---
temp_A=my_model.A.data().copy()
temp_B=我的模型.B.数据().copy()
temp_param1_dict={k:v代表k,v在my_model.param1.items()中]
temp_x_list=[k代表my_model.x.items()]中的k。copy()
#---进行删除---
元素_至_移除='a2'
对于温度A中的k:
如果k==要删除的元素:
my_model.A.remove(k)
对于列表中的k(临时参数):
如果k==要删除的元素:
del my_model.param1[k]
对于临时列表中的k、v:
如果k[0]==要删除的元素:
del my_model.x[k]
#---重建关联的表达式---
my_model.objective_expr.reconstruct()
my_model.constraint.Reconstructure()
#---解决---
结果=pyo.SolverFactory('ipopt').solve(my_模型,tee=True)
在我的设置(pyomo=5.6.2)中,上述代码引发异常:

AttributeError:'int'对象没有属性'\u component'
…用于行“del my_model.param1[k]”

但是,如果我只是注释掉删除参数的部分,那么我会得到另外两个错误(我认为是在预处理期间):

KeyError:90706423712
AttributeError:'NoneType'对象没有属性'getname'
(注:这基本上是对上一个问题的跟进:)

感谢您提供的任何见解