向Pyomo模型添加多个piecewise_nd块时遇属性错误的求助
作业车间调度中Pyomo多维分段线性化报错及优化方案求助
问题背景
我在作业车间调度场景中引入了一个多元非线性函数,该函数基于作业在指定机器上的开始时间和空闲时间计算数值,属于无间断的光滑凹函数。调度模型代码参考了作业车间调度的标准教程,当前需要使用piecewise_nd函数对该非线性函数做线性化处理,且要为每个(作业,机器)对分配独立的piecewise_nd块。
报错信息
执行代码中model.add_component(f'piecewise_{j}_{m}', piecewise)语句时,触发如下错误:
AttributeError: 'piecewise_nd_cc' object has no attribute 'valid_model_component'
核心代码片段
import pyomo.environ as pyo from pyomo.core.kernel.piecewise_library.transforms_nd import piecewise_nd from scipy.spatial import Delaunay # 定义线性化辅助变量 model.cost = pyo.Var(model.TASKS, bounds=(0, None)) # 生成三角剖分与对应的函数值 triangulation = Delaunay(points) # points为任意二维数组 values = f(*triangulation.points.T) # 遍历所有(作业,机器)对,创建分段线性化块 for j,m in model.TASKS: var_list = [model.start[j,m], model.idle[j,m]] piecewise = piecewise_nd(triangulation, values=values, input=var_list, output=model.cost[j,m], bound='eq', repn='cc') # 将生成的piecewise_nd块添加到模型 model.add_component(f'piecewise_{j}_{m}', piecewise) # 设置目标函数 model.objective = pyo.Objective(expr = sum([model.cost[j,m] for j,m in model.TASKS]), sense = pyo.minimize)
已尝试的解决方案
我曾参考Pyomo官方论坛中的相关方法,但add_component函数仍无法正常处理piecewise_nd对象,上述错误依旧出现。
需求
- 解决当前
add_component添加piecewise_nd对象时的报错问题 - 或者提供一种在循环中批量添加多个多维分段线性化模型的更优方案
- 理想情况下,希望实现类似Pyomo原生Piecewise对象的功能——支持通过索引集参数直接创建批量实例
补充说明:完整代码可查看对应的GitHub笔记本。
内容的提问来源于stack exchange,提问作者Victor Ruela
相关产品推荐
相关产品推荐

