You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修改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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 20:45:02