如何在Linopy优化模型中访问已创建的变量实例?
Linopy模型中访问变量实例的问题与解决方案
背景
我正在为能源管理系统的实时控制器搭建Linopy模型。由于不同家庭的组件配置不同,每次运行实时控制(rtc)时的优化问题存在差异,因此需要动态创建变量与约束,首要任务是构建平衡约束。目前变量创建已完成,但添加约束时无法正确访问模型中的变量——使用model.variables仅能获取变量名称字符串,而非变量实例,导致编写约束时报错。
问题
如何从Linopy模型中访问变量实例(例如通过类似model.get_variable(name='demand')的方式)?
错误示例
以下是复现问题的极简代码:
from linopy import Model # 优化组件(简化为家庭用电需求和光伏发电量) demand = 300 # 单位:W(需要满足的家庭用电需求) pv = 200 # 单位:W(光伏最大发电量) grid = 1000 # 单位:W(电网最大供电量) # 初始化模型 model = Model() # 创建变量 model.add_variables(name='demand', lower=demand, upper=demand, integer=True) model.add_variables(name='pv', lower=0, upper=pv, integer=True) model.add_variables(name='grid', lower=0, upper=grid, integer=True) # 动态创建平衡约束 balance = 0 for variable in model.variables: if variable == 'demand': balance -= variable elif variable in ['pv', 'grid']: balance += variable else: raise ValueError(f'变量 \"{variable}\" 不支持') model.add_constraints(balance == 0, name='balance') print(model)
运行代码后会触发类型错误,字符串无法与整数进行运算:
Traceback (most recent call last): File "example.py", line 20, in <module> balance -= variable TypeError: unsupported operand type(s) for -=: 'int' and 'str'
解决方案
感谢@Kapocsi提供的解决方案:
from linopy import Model # 优化组件(简化为家庭用电需求和光伏发电量) demand = 300 # 单位:W(需要满足的家庭用电需求) pv = 200 # 单位:W(光伏最大发电量) grid = 1000 # 单位:W(电网最大供电量) # 初始化模型 model = Model() # 创建变量 model.add_variables(name='demand', lower=demand, upper=demand, integer=True) model.add_variables(name='pv', lower=0, upper=pv, integer=True) model.add_variables(name='grid', lower=0, upper=grid, integer=True) # 动态创建平衡约束 balance = model.add_variables(name='balance', lower=0, upper=0, integer=True) for variable_name, variable in model.variables.items(): if variable_name == 'demand': balance -= variable elif variable_name in ['pv', 'grid']: balance += variable else: pass model.add_constraints(balance == 0, name='balance') print(model.constraints['balance'])
运行后输出:
Constraint `balance` -------------------- +1 balance - 1 demand + 1 pv + 1 grid = 0
内容的提问来源于stack exchange,提问作者M0leiro
相关产品推荐
相关产品推荐

