如何修改Pyomo的AbstractModel中可变参数并使其生效?
问题根因
你的代码存在参数名大小写拼写错误:
- 定义可变参数时使用的名称是
Nc(末尾为小写c) - 给实例赋值时错误写成了
NC(末尾为大写C),这一步相当于给实例新增了一个无关的新属性,原有参数Nc始终未被修改,所以求解时还是用的初始值。
修复方案
- 把赋值语句的参数名和定义的名称保持一致,改为
instance.Nc = 你要设置的值即可 - 如果需要多次修改参数重复求解,修改参数后可以调用
instance.C2.reconstruct()手动刷新关联了该参数的约束,避免缓存导致的不生效问题。
修正后可运行的代码示例
from pyomo.environ import * import random model = AbstractModel() model.i = RangeSet(40) model.j = Set(initialize=model.i) model.x = Var(model.i,model.j, initialize=0,within=Binary) model.y = Var(model.i, within=Binary) model.Nc=Param(initialize=5,mutable=True) def Ninit(model,i): return random.randint(0,1) model.N=Param(model.i,initialize=Ninit,mutable=True) def Dinit(model,i,j): return random.random() model.D=Param(model.i,model.j,initialize=Dinit,mutable=True) def rule_C1(model,i,j): return model.x[i,j]<=model.N[i]*model.y[j] model.C1 = Constraint(model.i,model.j,rule=rule_C1) def rule_C2(model): return sum(model.y[i] for i in model.i )==model.Nc model.C2 = Constraint(rule=rule_C2) def rule_C3(model,i): return sum(model.x[i,j] for j in model.j)==model.N[i] model.C3 = Constraint(model.i,rule=rule_C3) def rule_OF(model): return sum( model.x[i,j]*model.D[i,j] for i in model.i for j in model.j ) model.obj = Objective(rule=rule_OF, sense=minimize) opt = SolverFactory('glpk') instance = model.create_instance() # 修正拼写错误,把NC改为Nc instance.Nc = 4 # 可选:刷新关联参数的约束 instance.C2.reconstruct() results = opt.solve(instance) print('NC= ',value(instance.Nc)) print('OF= ',value(instance.obj))
内容的提问来源于stack exchange,提问作者Optimization team
相关产品推荐
相关产品推荐

