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

ORTools线性规划:跨供应商购物篮采购成本最小化模型扩展及次优解求解问询

多供应商购物篮采购成本最小化模型扩展需求

我是约束规划与ORTools领域的新手,目前希望解决经典的「多供应商间购物篮采购成本最小化」问题。我已基于Python/ORTools,采用「商品-各供应商采购量」的变量矩阵,实现了尽可能采购完整目标购物篮时的最低成本计算逻辑,现需要对现有模型扩展以下能力:

  • 纳入阶梯运费规则:不同供应商的运费规则存在差异,且运费与从该供应商采购的商品总数量挂钩,例如:供应商1采购量≤5件时运费为1美元,>5件时运费为2美元;供应商2采购量≤5件时运费为1美元,>5件时免运费。
  • 纳入店铺积分抵扣规则:需优先使用持有的店铺积分抵扣采购成本。
  • 支持缺库存场景下的最优次解输出:当无法采购到完整目标购物篮时(例如目标采购10件商品,但全平台所有供应商仅能提供5件库存),可输出最优方案——即在尽可能采购更多目标商品的前提下总成本最低的采购计划;当前现有代码仅会提示无可行解,可通过将代码第18行的items[0] = 10修改为该值触发该场景。

目前我不清楚该从何方向查找解决方案,现有代码如下:

from ortools.linear_solver import pywraplp

# 各供应商对应商品的单价
# 例如商品2在供应商2处的采购价为0.05美元
allStockPrice = {}
allStockPrice[0] = [10, 11]
allStockPrice[1] = [0.15, 0.20]
allStockPrice[2] = [0.04, 0.05]

# 各供应商对应商品的库存数量
allStockQty = {}
allStockQty[0] = [1, 6]
allStockQty[1] = [0, 2]
allStockQty[2] = [5, 1]

# 计划采购的各商品目标数量
items = {}
items[0] = 5
items[1] = 2
items[2] = 1

# 构建求解器变量数组
# 对应每个商品从各供应商处的采购量
variable_list = [[]] * len(items)
variable_list[0] = [[]] * len(allStockPrice[0])
variable_list[1] = [[]] * len(allStockPrice[0])
variable_list[2] = [[]] * len(allStockPrice[0])

def configure_objective(solver):
    global allStockPrice, variable_list

    objective = solver.Objective()

    # 每个变量对应的系数为对应商品的采购单价
    for i in items:
        for j in range(len(allStockPrice[0])):
            objective.SetCoefficient(variable_list[i][j], allStockPrice[i][j])

    objective.SetMinimization()

    return objective

def configure_constraints(solver):
    global allStockPrice, allStockQty, items, variable_list

    # 约束:单种商品的总采购量等于目标采购量
    for i in items:
        solver.Add(sum(variable_list[i]) == items[i])

    # 约束:单供应商的单商品采购量不超过对应库存
    for i in items:
        for j in range(len(allStockPrice[0])):
            solver.Add(variable_list[i][j] <= allStockQty[i][j])

def configure_variables(solver):
    global allStockPrice, allStockQty, items

    # 定义采购量变量的取值范围为0到目标采购量
    for i in items:
        for j in range(len(allStockPrice[0])):
            variable_list[i][j] = solver.IntVar(0, items[i], str('x_i%i_v%i' % (i, j)))

    return variable_list

def solve(solver):
    result_status = solver.Solve()
    return result_status


def print_solution(solver, result_status, variable_list, constraint_list):
    if result_status == solver.OPTIMAL:
        print('求解成功。')
        print(('本次求解耗时 %f 毫秒' % solver.wall_time()))
        print(('最优目标函数值 = %f' % solver.Objective().Value()))
        var_sum = 0

        for variable in variable_list:
            for vendor in variable:
                print(('%s = %f' % (vendor.name(), vendor.solution_value())))
                var_sum += vendor.solution_value()
        print(('所有变量取值总和 = %f' % var_sum))

        print('进阶求解信息:')
        print(('求解共执行 %d 次迭代' % solver.iterations()))

        for variable in variable_list:
            for vendor in variable:
                print(('%s: 缩减成本 = %f' % (vendor.name(), vendor.reduced_cost())))

    elif result_status == solver.INFEASIBLE:
        print('未找到可行解。')
    elif result_status == solver.POSSIBLE_OVERFLOW:
        print('部分输入数值过大,可能触发整数溢出问题。')

solver = pywraplp.Solver('SolveSimpleSystem', pywraplp.Solver.GLOP_LINEAR_PROGRAMMING)

variable_list = configure_variables(solver)
configure_constraints(solver)
objective = configure_objective(solver)

result_status = solve(solver)

print_solution(solver, result_status, variable_list, None)

内容的提问来源于stack exchange,提问作者Stephen Butler

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.23 16:06:07