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

如何基于DataFrame利用JuMP构建三维变量的最小化目标函数?

JuMP三维决策变量目标函数的正确实现

问题背景

已定义以下索引向量:

Product=["A", "B", "C"]
Factory=["F1","F2"]
Sub=["A1","A2","B1","B2","C1","C2"]

对应成本参数DataFrame如下:

ProductFactorySubCost
AF1A110
AF2A18
BF1B120
CF2C212

需要构建最小化目标函数:
$\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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 15:45:02