质量与投资双约束下货运利润最大化的求解算法咨询
货运贸易双约束利润最大化问题解答
问题属性判定
- 该问题完全属于数学优化范畴,具体是经典的二维有界整数背包问题,属于线性组合优化的典型场景,已有非常成熟的求解方案。
可用求解算法
针对你的业务场景,两类方案都可以直接使用:
- 若商品品类在50种以内、采购上限和约束阈值都不大,可以直接用动态规划求解,时间复杂度为
O(商品数*最大载重*最大投资金额),运算速度足够满足业务需求。 - 若商品品类多、约束阈值大,更推荐用现成的整数规划求解器,比你提到的mystic库更适配这类线性优化场景,配置门槛低、求解效率高。
Python实现参考(用PuLP库,开箱即用)
PuLP是Python生态中专门用来求解线性整数规划问题的轻量库,不需要复杂的参数配置就能直接适配你的需求:
- 先安装依赖
pip install pulp
- 适配业务的代码示例
import pulp # 业务参数定义,可直接替换为你的实际数据 # 每个商品的属性:名称、采购价、售价、单位质量、最大可采购量 goods_list = [ {"name": "商品A", "buy_price": 10, "sell_price": 18, "unit_weight": 2, "max_purchase": 100}, {"name": "商品B", "buy_price": 15, "sell_price": 28, "unit_weight": 3, "max_purchase": 80}, # 可继续添加更多商品 ] truck_max_weight = 1000 # 卡车最大载重上限 total_invest_limit = 5000 # 采购总投资金额上限 # 初始化优化问题,目标为最大化利润 problem = pulp.LpProblem("FreightProfitMaximization", pulp.LpMaximize) # 定义决策变量:每个商品的采购数量,为非负整数,上限为对应商品的最大可采购量 purchase_qty = [ pulp.LpVariable(f"qty_{good['name']}", lowBound=0, upBound=good["max_purchase"], cat="Integer") for good in goods_list ] # 添加目标函数:总利润 = 所有商品的(售价-采购价)*采购量之和 problem += pulp.lpSum([ purchase_qty[i] * (goods_list[i]["sell_price"] - goods_list[i]["buy_price"]) for i in range(len(goods_list)) ]) # 添加约束条件 # 约束1:所有商品总重量不超过卡车最大载重 problem += pulp.lpSum([ purchase_qty[i] * goods_list[i]["unit_weight"] for i in range(len(goods_list)) ]) <= truck_max_weight, "WeightLimit" # 约束2:所有商品总采购金额不超过投资上限 problem += pulp.lpSum([ purchase_qty[i] * goods_list[i]["buy_price"] for i in range(len(goods_list)) ]) <= total_invest_limit, "InvestLimit" # 执行求解(关闭日志输出,有调试需求可以去掉msg参数) problem.solve(pulp.PULP_CBC_CMD(msg=False)) # 输出结果 print("=== 最优采购方案 ===") total_profit = 0 total_weight_used = 0 total_invest_used = 0 for idx, good in enumerate(goods_list): qty = int(purchase_qty[idx].value()) if qty <= 0: continue good_profit = qty * (good["sell_price"] - good["buy_price"]) good_weight = qty * good["unit_weight"] good_invest = qty * good["buy_price"] print(f"{good['name']}: 采购{qty}件 | 贡献利润{good_profit}元 | 占用载重{good_weight} | 占用资金{good_invest}元") total_profit += good_profit total_weight_used += good_weight total_invest_used += good_invest print(f"\n=== 总计 ===") print(f"总利润:{total_profit}元") print(f"总载重使用:{total_weight_used}/{truck_max_weight}") print(f"总投资使用:{total_invest_used}/{total_invest_limit}")
关于mystic库的说明
mystic更适合非线性、黑盒类的优化场景,你的需求是纯线性整数优化,不需要用到mystic,用PuLP或者Google OR-Tools这类专门的线性规划求解器效率更高,也不需要额外配置复杂的优化参数。
内容的提问来源于stack exchange,提问作者Jordan
相关产品推荐
相关产品推荐

