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

线性规划问题:预算内最大化购股数的Python代码异常求助

问题排查与修正方案

核心问题分析

你的代码存在两个关键错误:

  1. 目标函数定义错误:linprog默认执行最小化目标函数,但你的需求是最大化股票总数(X+Y+Z),却错误地将股票价格作为目标系数。这会让算法选择总花费最低的方案——也就是买0只股票,最终得到x全为0的结果。
  2. 未输出优化结果:你在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 07:25:18