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
相关产品推荐
相关产品推荐

