求解带采购数量约束的多企业产品最优采购组合(Excel/Python实现)
采购组合优化:最小化总成本(带供应商产品数量约束)
这是典型的0-1整数规划问题,下面分别给出Excel和Python的具体实现方案:
一、Excel 实现(使用Solver插件)
数据准备示例(匹配常见输入结构)
假设你的数据结构如下:
| 产品 | 企业A总价 | 企业B总价 | 企业C总价 |
|---|---|---|---|
| P1 | 100 | 120 | 95 |
| P2 | 80 | 75 | 85 |
| P3 | 150 | 140 | 160 |
额外添加决策变量区域(标记是否选择该企业的产品)、总成本计算单元格:
- 决策变量区域:比如F2:H4,单元格值为0或1,
F2表示是否选企业A的P1产品 - 总成本单元格:
J2,公式为SUMPRODUCT(B2:D4, F2:H4)
配置Solver求解
- 启用Solver插件:依次点击「文件」→「选项」→「加载项」→「转到」,勾选「规划求解加载项」
- 打开Solver:在「数据」选项卡找到「规划求解」
- 设置参数:
- 目标单元格:选择总成本单元格(如
J2),设置为「最小值」 - 可变单元格:选择决策变量区域(如
F2:H4) - 添加约束:
- 每个产品仅选一家企业:对每行决策变量设置
SUM(F2:H2)=1、SUM(F3:H3)=1、SUM(F4:H4)=1 - 企业采购产品数量上限:比如企业A最多选2种,设置
SUM(F2:F4)<=2;企业B最多选1种,设置SUM(G2:G4)<=1 - 决策变量为二进制(0或1):添加约束
F2:H4 为二进制
- 每个产品仅选一家企业:对每行决策变量设置
- 目标单元格:选择总成本单元格(如
- 求解:点击「求解」,决策变量区域值为1的单元格即为选中的企业-产品组合
二、Python 实现(使用PuLP库)
PuLP是Python中用于线性/整数规划的轻量库,适合快速实现这类优化问题。
步骤1:安装PuLP
pip install pulp
步骤2:代码实现
from pulp import LpProblem, LpVariable, LpMinimize, lpSum, value # 1. 定义基础数据 products = ["P1", "P2", "P3"] vendors = ["A", "B", "C"] # 产品-企业的采购总价字典 price = { "P1": {"A": 100, "B": 120, "C": 95}, "P2": {"A": 80, "B": 75, "C": 85}, "P3": {"A": 150, "B": 140, "C": 160} } # 企业最多可采购的产品数量约束 max_vendor_products = {"A": 2, "B": 1, "C": 3} # 2. 创建优化问题(最小化总成本) prob = LpProblem("Minimize_Purchase_Cost", LpMinimize) # 3. 定义决策变量:x[p][v] = 1表示选择企业v的产品p,0则不选 x = LpVariable.dicts("Selection", [(p, v) for p in products for v in vendors], cat="Binary") # 4. 添加目标函数:总成本 = 所有选中组合的价格之和 prob += lpSum([x[(p, v)] * price[p][v] for p in products for v in vendors]) # 5. 添加约束条件 # 约束1:每个产品必须且只能选择一家企业 for p in products: prob += lpSum([x[(p, v)] for v in vendors]) == 1, f"One_Vendor_Per_Product_{p}" # 约束2:每个企业采购的产品数量不超过上限 for v in vendors: prob += lpSum([x[(p, v)] for p in products]) <= max_vendor_products[v], f"Max_Products_Vendor_{v}" # 6. 求解问题 prob.solve() # 7. 输出结果 print(f"最小总成本: {value(prob.objective)}") print("最优采购组合:") for p in products: for v in vendors: if value(x[(p, v)]) == 1: print(f"产品{p} → 企业{v},总价{price[p][v]}")
代码说明
- 可根据实际数据修改
products、vendors、price和max_vendor_products参数 - 默认使用开源CBC求解器,若需更高性能可替换为商业求解器(如Gurobi)
内容的提问来源于stack exchange,提问作者sidhom slim
相关产品推荐
相关产品推荐

