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

Google OR-Tools求解含多变量max函数的目标函数问题咨询

问题根因

你遇到的报错来自两个问题:

  1. 语法错误:你将max()调用直接写在了列表推导式的range()参数位置,不符合Python语法逻辑
  2. 逻辑错误:Python原生max()函数无法直接处理OR-Tools的线性变量,会触发底层比较操作,线性求解器不支持这类非线性逻辑。
多变量max函数线性化方案(最小化目标场景)

多变量max的线性化比你想象的简单,针对你要最小化max(多个线性项)的场景,无需复杂的双变量迭代或者大M约束,直接按以下步骤操作即可,支持任意数量变量:

  • 新增一个连续型辅助变量max_demand,用于表示所有demand_coeffs[j] * x[j]的最大值
  • 对每一个变量j,添加约束:max_demand >= data['demand_coeffs'][j] * x[j]
  • 目标函数改为:最小化「所有energy项的和 + max_demand」
    由于你是在做最小化优化,求解器会自动将max_demand压缩到刚好等于所有demand_coeffs[j] * x[j]的最大值,完全符合你原来的目标函数逻辑,且所有约束和目标都是线性的,可直接被OR-Tools的线性/MIP求解器处理。
修正后的代码片段
# 前面的变量定义、约束添加逻辑保持不变

# 1. 新增辅助变量表示max(demand_coeffs[j] * x[j])
max_demand = solver.NumVar(0, solver.infinity(), 'max_demand')

# 2. 添加max约束
for j in range(data['num_vars']):
    solver.Add(max_demand >= data['demand_coeffs'][j] * x[j])

# 3. 定义正确的线性目标函数
energy_sum = sum(data['energy_coeffs'][j] * x[j] / 60 for j in range(data['num_vars']))
solver.Minimize(energy_sum + max_demand)

# 求解
status = solver.Solve()
结果验证

求解完成后,你可以通过max_demand.solution_value()拿到max项的实际值,和你手动计算所有demand_coeffs[j] * x[j].solution_value()的最大值对比,二者完全相等。

内容的提问来源于stack exchange,提问作者haudarren

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 16:54:00