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

求解带采购数量约束的多企业产品最优采购组合(Excel/Python实现)

采购组合优化:最小化总成本(带供应商产品数量约束)

这是典型的0-1整数规划问题,下面分别给出Excel和Python的具体实现方案:


一、Excel 实现(使用Solver插件)

数据准备示例(匹配常见输入结构)

假设你的数据结构如下:

产品企业A总价企业B总价企业C总价
P110012095
P2807585
P3150140160

额外添加决策变量区域(标记是否选择该企业的产品)、总成本计算单元格:

  • 决策变量区域:比如F2:H4,单元格值为0或1,F2表示是否选企业A的P1产品
  • 总成本单元格:J2,公式为SUMPRODUCT(B2:D4, F2:H4)

配置Solver求解

  1. 启用Solver插件:依次点击「文件」→「选项」→「加载项」→「转到」,勾选「规划求解加载项」
  2. 打开Solver:在「数据」选项卡找到「规划求解」
  3. 设置参数:
    • 目标单元格:选择总成本单元格(如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 为二进制
  4. 求解:点击「求解」,决策变量区域值为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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 06:13:29