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

能否用OR-Tools解决运输成本优化问题?适配模型及实施思路咨询

运输成本优化问题的OR-Tools解决方案及可行性分析

1. 能否用OR-Tools解决?适配模型及要点

完全可以用OR-Tools解决这个问题,它属于**0-1整数线性规划(ILP)**范畴,本质是包裹到运输商的最优分配问题,不属于装箱或调度类模型(装箱聚焦多物品装入容器的空间利用,调度侧重时间维度的资源安排,这里是静态的单件包裹-运输商匹配)。

核心建模要点:

  • 变量定义:创建0-1变量 x[p][i],其中p代表包裹,i代表运输商。x[p][i] = 1表示包裹p由运输商i配送,0则表示不选择该组合。
  • 目标函数:最小化总运输成本,即 sum(x[p][i] * provider[i]["cost_per_item"] for all p, i)
  • 约束条件:
    • 每个包裹必须被分配给恰好一个运输商:sum(x[p][i] for all i) = 1,对每个包裹p
    • 仅允许可行的分配组合:如果包裹p的重量超过运输商i的max_weight,或最长尺寸超过longest_dim,则强制x[p][i] = 0(可通过预处理过滤无效变量,或在模型中添加约束)

OR-Tools实现思路:

用OR-Tools的linear_solver模块(推荐SCIP求解器),步骤如下:

  1. 初始化求解器
  2. 创建所有可行的0-1变量(跳过不符合运输商限制的包裹-运输商组合)
  3. 添加每个包裹必须分配一次的约束
  4. 设置最小化总成本的目标函数
  5. 求解并输出结果

2. 是否需要先做可行性分析?

是的,可行性分析是必要的,但无需单独拆分为独立步骤,可融入建模前的预处理阶段:

  • 首先检查每个包裹是否存在至少一个能承接它的运输商(满足重量、尺寸限制)。如果有包裹无可用运输商,问题直接无解。
  • 预处理时过滤掉所有不可行的包裹-运输商组合,减少模型变量数量,提升求解效率,避免求解器处理无效分配选项。

示例代码(Python)

from ortools.linear_solver import pywraplp

# 包裹数据
packages = {
    "package_one": {"weight": 10, "longest_dim": 120},
    "package_two": {"weight": 12, "longest_dim": 60}
}

# 运输商数据
providers = {
    "provider_one": {"max_weight": 10, "longest_dim": 150, "cost_per_item": 3.99},
    "provider_two": {"max_weight": 25, "longest_dim": 200, "cost_per_item": 10.99},
    "provider_three": {"max_weight": 15, "longest_dim": 100, "cost_per_item": 4.99}
}

# 初始化求解器
solver = pywraplp.Solver.CreateSolver('SCIP')
if not solver:
    exit()

# 创建变量:仅保留可行的包裹-运输商组合
x = {}
for p_name, p_data in packages.items():
    for i_name, i_data in providers.items():
        # 检查是否满足运输商限制
        if p_data["weight"] <= i_data["max_weight"] and p_data["longest_dim"] <= i_data["longest_dim"]:
            x[(p_name, i_name)] = solver.IntVar(0, 1, f'x_{p_name}_{i_name}')

# 约束1:每个包裹必须分配给恰好一个运输商
for p_name in packages:
    solver.Add(sum(x[(p_name, i_name)] for i_name in providers if (p_name, i_name) in x) == 1)

# 目标函数:最小化总成本
objective = solver.Objective()
for (p_name, i_name), var in x.items():
    objective.SetCoefficient(var, providers[i_name]["cost_per_item"])
objective.SetMinimization()

# 求解
status = solver.Solve()

# 输出结果
if status == pywraplp.Solver.OPTIMAL:
    print(f"最低总成本: {solver.Objective().Value():.2f}")
    for (p_name, i_name), var in x.items():
        if var.solution_value() == 1:
            print(f"包裹 {p_name} 由运输商 {i_name} 配送")
else:
    print("无可行解决方案")

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 21:39:19