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

Python PULP数组乘法约束优化问题求解求助

解决你的线性规划求解问题

首先,你的代码里的核心问题出在循环求和的逻辑上——你每次循环都会重新定义x,最后x只保留了最后一个j * SolarCap的两倍,根本没有把8760个项都加起来,这就导致约束条件完全不符合你的需求,自然无法得到正确结果。

下面是修正后的完整代码,我会一步步解释:

import pulp as pp

# 假设SolverWS是你的DataFrame,P2gprod是目标求和值(比如50000)
P2gprod = 50000

# 1. 初始化问题,目标是最小化SolarCap(因为目标函数是SolarCap*5,等价于最小化SolarCap)
pp.prob = pp.LpProblem("P2g", pp.LpMinimize)

# 2. 定义变量:SolarCap,下界为0
SolarCap = pp.LpVariable("SolarCap", lowBound=0)

# 3. 设置目标函数
pp.prob += SolarCap * 5  # 等价于最小化SolarCap,系数不影响最优解的取值

# 4. 正确计算所有项的总和:把每个SolarCap * SolverWS['Solar']的元素加起来
# 方法一:用循环累加(适合理解逻辑)
total_sum = 0
for j in SolverWS['Solar']:
    total_sum += j * SolarCap

# 方法二:用pandas向量运算(更高效,适合大数据集)
# total_sum = SolarCap * SolverWS['Solar'].sum()

# 5. 添加约束条件:总和等于目标值P2gprod
pp.prob += total_sum == P2gprod

# 6. 求解问题,这里可以指定求解器(比如CBC,pulp默认的求解器)
status = pp.prob.solve(pp.PULP_CBC_CMD(msg=False))  # msg=False可以关闭求解器日志

# 查看结果
print("求解状态:", pp.LpStatus[status])
print("最优SolarCap值:", pp.value(SolarCap))

关键修正点说明:

  • 求和逻辑:必须初始化一个累加变量(比如total_sum),然后在循环中逐个添加j * SolarCap,或者直接用pandas的sum()方法计算整个列的和再乘以SolarCap,后者对于8760行的数据效率更高。
  • 约束条件:确保约束是所有项的总和等于目标值,而不是最后一项的两倍。
  • 求解器选择:如果默认求解器有问题,可以显式指定PULP_CBC_CMD,这是pulp自带的开源求解器,适合这类线性规划问题。

另外,需要确保SolverWS['Solar']列的元素是数值类型(int或float),如果是字符串的话需要先转换,否则乘法会出错。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 08:45:15