Google OR-Tools求解含多变量max函数的目标函数问题咨询
问题根因
你遇到的报错来自两个问题:
- 语法错误:你将
max()调用直接写在了列表推导式的range()参数位置,不符合Python语法逻辑 - 逻辑错误: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
相关产品推荐
相关产品推荐

