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
相关产品推荐
相关产品推荐

