使用Scipy线性建模求解时出现全NaN结果的问题求助
问题分析与解决
你尝试用线性规划寻找三种元素每周成本最低的组合,但求解结果全为NaN,核心问题是约束条件设置错误导致问题无解,具体原因和修正方案如下:
错误原因
不等式约束逻辑完全颠倒
你原本想表达「每个元素占比≥25%」,但代码里的约束写成了:A_ub = np.array([[-0.25, -0.25, -0.25]]) b_ub = np.array([-1])对应数学式为:
-0.25w -0.25c -0.25b ≤ -1,化简后是w+c+b ≥4,但你同时设置了等式约束w+c+b=1,两个约束完全冲突,导致线性规划无可行解,因此返回NaN。目标函数冗余取负
linprog默认是最小化目标函数,你要最小化总成本,直接用价格作为系数即可,不需要取负数(取负后变成最大化负成本,虽数学上等价,但易混淆)。
修正后的代码
我们用bounds参数直接设置每个变量的上下界(更直观),同时修正目标函数:
import numpy as np from scipy.optimize import linprog wprices = np.array([205.5, 215, 225]) cprices = np.array([216.5, 214, 219]) bprices = np.array([184.5, 192, 202]) # 最小占比要求 min_pct = 0.25 num_weeks = len(wprices) # 目标函数:每周的三种元素价格,直接最小化总成本 c = np.array([wprices, cprices, bprices]).T # 等式约束:三种元素占比总和为1 A_eq = np.array([[1, 1, 1]]) b_eq = np.array([1]) # 每个变量的上下界:占比≥25%,上限由等式约束自动限制 bounds = [(min_pct, None), (min_pct, None), (min_pct, None)] optimal_percentages = [] for week in range(num_weeks): result = linprog(c[week], A_eq=A_eq, b_eq=b_eq, bounds=bounds) if result.success: optimal_percentages.append(result.x * 100) # 转换为百分比 else: optimal_percentages.append([np.nan, np.nan, np.nan]) # 输出结果 print("每周最优占比:") for idx, pct in enumerate(optimal_percentages): print(f"第{idx+1}周:W={pct[0]:.2f}%, C={pct[1]:.2f}%, B={pct[2]:.2f}%")
代码说明
- 目标函数:直接使用每周的三种元素价格,
linprog自动最小化w*wprice + c*cprice + b*bprice,契合成本最低的需求。 - 约束设置:用
bounds直接定义每个元素占比≥25%,避免复杂的不等式矩阵,逻辑更清晰。 - 等式约束:保证三种元素占比总和为100%,与最小占比约束无冲突(0.25×3=0.75 ≤1,存在可行解空间)。
运行修正后的代码即可得到每周的最优占比组合。
内容的提问来源于stack exchange,提问作者PierreCera
相关产品推荐
相关产品推荐

