如何基于DataFrame利用JuMP构建三维变量的最小化目标函数?
JuMP三维决策变量目标函数的正确实现
问题背景
已定义以下索引向量:
Product=["A", "B", "C"] Factory=["F1","F2"] Sub=["A1","A2","B1","B2","C1","C2"]
对应成本参数DataFrame如下:
| Product | Factory | Sub | Cost |
|---|---|---|---|
| A | F1 | A1 | 10 |
| A | F2 | A1 | 8 |
| B | F1 | B1 | 20 |
| C | F2 | C2 | 12 |
需要构建最小化目标函数:
$\text{Min } 10x[A,F1,A1] + 8x[A,F2,A1] + 20x[B,F1,B1] + 12x[C,F2,C2]$
其中不在DataFrame中的决策变量系数默认为0。
原代码的问题
你尝试的代码存在两个核心问题:
- 当没有匹配
(product, factory, sub)的行时,data.Cost[data.Product==product,data.Factory==factory,data.SubProduct==sub]会返回空数组,JuMP无法处理空数组与变量的乘法操作。 - 遍历所有三维索引组合会包含大量无效项,运行效率较低。
正确实现方式
方式一:直接遍历DataFrame有效行
这种方式只处理DataFrame中存在的成本项,不存在的变量因系数为0无需加入目标函数,简洁高效:
@objective(model, Min, sum(row.Cost * x[row.Product, row.Factory, row.Sub] for row in eachrow(data)))
方式二:通过字典映射成本(适合需遍历所有变量的场景)
先构建成本字典,再用get方法默认返回0处理不存在的项:
# 构建三元组到成本的映射字典 cost_dict = Dict((row.Product, row.Factory, row.Sub) => row.Cost for row in eachrow(data)) # 生成目标函数 @objective(model, Min, sum(get(cost_dict, (p, f, s), 0) * x[p, f, s] for p in Product, f in Factory, s in Sub))
内容的提问来源于stack exchange,提问作者omutlu
相关产品推荐
相关产品推荐

