线性规划问题:预算内最大化购股数的Python代码异常求助
问题排查与修正方案
核心问题分析
你的代码存在两个关键错误:
- 目标函数定义错误:
linprog默认执行最小化目标函数,但你的需求是最大化股票总数(X+Y+Z),却错误地将股票价格作为目标系数。这会让算法选择总花费最低的方案——也就是买0只股票,最终得到x全为0的结果。 - 未输出优化结果:你在
linearProblem函数中计算了opt但未打印,导致无法直观查看完整优化信息(虽然后续你贴出了结果,但代码逻辑存在缺失)。
修正后的代码
from scipy.optimize import linprog import yfinance as yf def linearProblem(price_dict): # 目标是最大化X+Y+Z,linprog仅支持最小化,因此取目标函数的负系数 obj = [-1, -1, -1] # 约束条件:X*AMZN价格 + Y*CBOE价格 + Z*CDW价格 <= 10000 lhs_ineq = [list(price_dict.values())] rhs_ineq = [10000] # 明确变量非负约束(购买数量不能为负数) bounds = [(0, None), (0, None), (0, None)] opt = linprog(c=obj, A_ub=lhs_ineq, b_ub=rhs_ineq, bounds=bounds, method="revised simplex") # 打印优化结果 print("优化详情:") print(opt) print("\n可购买的最大股票总数:", -opt.fun) print("各股票建议购买数量:", opt.x.round(2)) def getPrice(): symbol_list = ['AMZN', 'CBOE', 'CDW'] symbol_list_dict = {} for symbol in symbol_list: ticker = yf.Ticker(symbol).info market_price = ticker['regularMarketPrice'] symbol_list_dict[symbol] = market_price return symbol_list_dict if __name__ == '__main__': symbol_price_dict = getPrice() print("当前股票价格:", symbol_price_dict) linearProblem(symbol_price_dict)
修正说明
- 目标函数调整:将目标系数设为
[-1, -1, -1],通过最小化-X-Y-Z等价实现最大化X+Y+Z的需求,匹配你的核心目标。 - 明确变量边界:添加
bounds参数确保购买数量为非负整数(linprog默认变量≥0,但显式声明逻辑更清晰)。 - 结果输出优化:补充结果打印逻辑,直接输出总股票数量和各股票购买数(注意对
opt.fun取负,因为目标函数是原需求的负值)。
补充提示
linprog求解的是连续变量解,但实际购买股票必须是整数。如果需要严格的整数解,需改用支持整数线性规划的工具(如pulp库),scipy的linprog不支持整数约束。
内容的提问来源于stack exchange,提问作者D.Zou
相关产品推荐
相关产品推荐

