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

基于Python Pulp的多变量列表与二进制变量优化问询

问题分析与修正方案

核心问题

你定义的x5是单个二进制变量,这会导致要么所有行都被纳入计算,要么全不纳入,完全不符合“每行独立控制是否选中”的需求。正确的做法是为每行创建一个独立的二进制变量x5[i]。

原代码逻辑错误

  • 目标函数中pl.lpSum([res[i]] * x5)的写法不符合Pulp规范,无法实现“选中行的结果求和”的逻辑;
  • 约束条件同样错误,变成了“所有行x4的总和乘以单个x5”,而非“选中行的x4元素总和不超过20”。

修正后的代码

import pulp as pl

x1 = [.1, .8, .2, .15, .6]
x2 = [5000, 8000, 10000, 4500, 2200]
x3 = [.1, .1, .15, .08, .1]
x4 = [5, 3, 8, 10, 2]

# 为每行创建独立的二进制变量,控制该行是否被选中
x5 = [pl.LpVariable(f'x5_{i}', cat=pl.LpBinary) for i in range(5)]

# 预计算每行的目标值系数
res = [(x1[i] * x2[i] * x3[i]) / x4[i] for i in range(5)]

# 定义最大化优化问题
test = pl.LpProblem('test_this', pl.LpMaximize)

# 目标函数:仅累加被选中行的res值
test += pl.lpSum([res[i] * x5[i] for i in range(5)])

# 约束条件:被选中行的x4元素总和不超过20
test += pl.lpSum([x4[i] * x5[i] for i in range(5)]) <= 20

# 求解模型
test.solve()

# 输出结果详情
print("各二进制变量取值(1表示选中该行,0表示未选中):")
for i in range(5):
    print(f"x5_{i} = {x5[i].value()}")

print("\n选中行的x4总和:", sum(x4[i] * x5[i].value() for i in range(5)))
print("目标函数最大值:", pl.value(test.objective))

修正说明

  1. 将单个x5变量改为列表形式,每行对应一个二进制变量,实现对每行的独立控制;
  2. 目标函数和约束条件均调整为“对应行系数×该行二进制变量”后求和,严格符合线性规划的表达逻辑;
  3. 增加了结果输出,清晰展示选中情况、约束满足度和最终目标值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 22:32:41