智能仓储AI调度系统的路线规划:架构师的TSP问题解决

引言:从"拣货员的10公里"到TSP的生死之战

凌晨3点的电商仓储中心,灯火通明。拣货员小张推着满载的货箱,在货架间穿梭——他今天的路线是" aisle 3 → aisle 7 → aisle 2 → aisle 5 “,但实际上,这四个货架的最优顺序应该是” aisle 2 → aisle 3 → aisle 5 → aisle 7 "。仅仅因为路线规划错误,小张每天多走3公里,仓储中心每天因此多支付15%的人力成本。

这不是个例。根据《2023年智能仓储行业报告》,70%的传统仓储存在"路线冗余"问题:拣货路径重复、车辆空载率高、AGV(自动导引车)碰撞频发。而解决这些问题的核心,正是计算机科学中最经典的组合优化问题——旅行商问题(Traveling Salesman Problem, TSP)

但智能仓储中的TSP,早已不是"访问n个城市后回到起点"的抽象问题。它要处理容量约束(拣货员的货箱装不下所有货物)、时间窗口(生鲜货物必须在30分钟内拣选)、动态订单(突然新增的紧急订单)、多机器人协作(100台AGV的路径冲突)等复杂场景。

作为架构师,我们的任务不是"实现一个TSP算法",而是"用TSP的思维解决仓储的实际问题"。本文将从模型抽象→算法选择→实战落地→动态扩展四个维度,拆解智能仓储路线规划的完整逻辑。

一、从经典TSP到仓储场景的变体:问题边界的重构

1.1 经典TSP的本质:最小化闭合路径的总长度

经典TSP的定义很简单:给定n个城市和每对城市之间的距离,找到一条恰好访问每个城市一次回到起点的最短路径。其数学模型可表示为:

min⁡∑i=1n∑j=1ndijxij \min \sum_{i=1}^n \sum_{j=1}^n d_{ij} x_{ij} mini=1nj=1ndijxij

约束条件:

  • 每个城市仅被访问一次:∑i=1nxij=1\sum_{i=1}^n x_{ij} = 1i=1nxij=1(对所有j),∑j=1nxij=1\sum_{j=1}^n x_{ij} = 1j=1nxij=1(对所有i)
  • 无亚环(即路径不能分成多个独立的循环):∑i,j∈Sxij≤∣S∣−1\sum_{i,j \in S} x_{ij} \leq |S| - 1i,jSxijS1(对所有非空子集S⊂{1,...,n}S \subset \{1,...,n\}S{1,...,n}
  • xij∈{0,1}x_{ij} \in \{0,1\}xij{0,1}xij=1x_{ij}=1xij=1表示从i到j的路径被选中)

其中,dijd_{ij}dij是城市i到j的距离,xijx_{ij}xij是0-1决策变量。

1.2 仓储场景的TSP变体:从"抽象城市"到"具象约束"

经典TSP的假设(无容量限制、静态节点、单一主体)在仓储中完全不成立。实际场景中,我们面对的是带约束的TSP(Constrained TSP, CTSP),最常见的两种变体是:

(1)带容量约束的TSP(Capacity-Constrained TSP, CVRP)

问题场景:拣货员的货箱容量有限,无法一次拣选所有订单。需要将订单拆分成多条路线,每条路线的总需求量不超过容量限制。

模型扩展

  • 引入车辆集合K(拣货员/AGV),每个车辆k的容量为QkQ_kQk
  • 引入需求量变量qiq_iqi(客户i的货物数量);
  • 引入载货量变量yiky_{ik}yik(车辆k在节点i时的剩余容量)。

目标函数变为最小化所有车辆的总行驶距离

min⁡∑k∈K∑i=0n∑j=0ndijxijk \min \sum_{k \in K} \sum_{i=0}^n \sum_{j=0}^n d_{ij} x_{ijk} minkKi=0nj=0ndijxijk

约束条件新增:

  • 容量限制:yik=yjk+qiy_{ik} = y_{jk} + q_iyik=yjk+qi(当xjik=1x_{jik}=1xjik=1时),且yik≤Qky_{ik} \leq Q_kyikQk
  • 车辆起点:y0k=0y_{0k} = 0y0k=0(车辆从仓库出发时空载)。
(2)带时间窗口的TSP(Time Window TSP, TW-TSP)

问题场景:某些货物有时间要求(比如生鲜需在8:00-9:00拣选,药品需在10:00前送达)。车辆必须在指定时间窗口内到达节点。

模型扩展

  • 引入时间窗口[ai,bi][a_i, b_i][ai,bi](节点i的最早/最晚到达时间);
  • 引入到达时间变量tikt_{ik}tik(车辆k到达节点i的时间)。

约束条件新增:

  • 时间窗口满足:ai≤tik≤bia_i \leq t_{ik} \leq b_iaitikbi(对所有i,k);
  • 时间连续性:tjk≥tik+si+dijt_{jk} \geq t_{ik} + s_i + d_{ij}tjktik+si+dijsis_isi是在节点i的服务时间)。

1.3 仓储TSP的核心矛盾:规模与实时性

经典TSP的时间复杂度是O(n!)(精确算法),即使是动态规划的O(n²2ⁿ),当n=20时计算量已达4e8次——而仓储中的"节点数"(订单/货架)可能高达1000+。

更棘手的是动态性:订单可能随时新增/取消,AGV可能突然故障,货架上的货物可能被移走。这要求算法不仅能求解静态问题,还要在秒级内调整路线

二、算法选择:从"精确解"到"启发式"的现实妥协

2.1 精确算法:理想中的"最优解",现实中的"无用功"

精确算法(如分支定界、动态规划、整数规划)能找到TSP的全局最优解,但仅适用于小规模问题(n≤30)。在仓储场景中,这些算法的痛点是:

  • 计算时间长:n=100时,分支定界需要数小时才能求解;
  • 无法处理动态场景:新增一个订单需重新计算所有路径;
  • 资源消耗大:需要高性能服务器,成本高。

2.2 启发式算法:工程中的"次优解",实用中的"最优解"

启发式算法通过"近似策略"快速找到高质量解(通常接近全局最优),适用于大规模、动态场景。仓储中最常用的启发式算法有三类:

(1)遗传算法(Genetic Algorithm, GA):模拟进化的"路径育种"

核心思想:将每个路径视为一个"个体",通过选择→交叉→变异的过程,让优秀个体(短路径)繁殖后代,最终进化出最优解。

仓储场景的适配

  • 个体编码:用客户的访问顺序表示(如[1,3,2,5]表示先访问客户1,再3,再2,再5);
  • 适应度函数:计算路径的总距离+容量/时间惩罚(如容量超限则加1000的惩罚);
  • 交叉操作:用**顺序交叉(OX)**保持路径的连续性(避免重复访问客户);
  • 变异操作:随机交换两个客户的位置,引入新的路径可能性。

优势

  • 并行性强:可同时进化多个个体;
  • 鲁棒性好:对初始解不敏感;
  • 易扩展:可加入容量、时间等约束。
(2)蚁群算法(Ant Colony Optimization, ACO):模拟蚁群的"信息素导航"

核心思想:蚂蚁在路径上留下信息素,短路径的信息素浓度更高,后续蚂蚁更倾向于选择短路径——最终整个蚁群找到最短路径。

仓储场景的适配

  • 信息素更新:每只蚂蚁完成路径后,在路径上释放信息素,短路径释放更多;
  • 启发式因子:结合距离(1/dij1/d_{ij}1/dij)和信息素浓度,决定蚂蚁的下一步选择;
  • 约束处理:若路径超过容量,则不释放信息素(惩罚无效路径)。

优势

  • 自组织性:无需人工干预,算法自动收敛;
  • 动态适应:信息素会随环境变化(如新增订单)更新;
  • 全局搜索能力强:不易陷入局部最优。
(3)强化学习(Reinforcement Learning, RL):让智能体"学会"调度

核心思想:训练一个智能体(Agent),通过与环境交互(选择下一个客户)获得奖励(总距离减少),最终学会最优策略。

仓储场景的适配

  • 状态空间:当前车辆位置、剩余容量、已访问客户、未访问客户的时间窗口;
  • 动作空间:选择下一个要访问的客户;
  • 奖励函数:r=−dij−α⋅容量超限−β⋅时间逾期r = -d_{ij} - \alpha \cdot \text{容量超限} - \beta \cdot \text{时间逾期}r=dijα容量超限β时间逾期(α、β是惩罚系数);
  • 算法选择:用近端策略优化(PPO)深度Q网络(DQN),适合连续动作空间。

优势

  • 动态响应:能实时处理新增订单、AGV故障等突发情况;
  • 自学习:无需手动设计启发式规则;
  • 泛化性强:训练好的模型可迁移到不同仓储场景。

2.3 算法对比:架构师的选择逻辑

算法类型 适用场景 优点 缺点
遗传算法 静态/中小规模(n≤200) 并行性强、易扩展 收敛速度慢、参数敏感
蚁群算法 静态/大规模(n≤500) 全局搜索能力强、动态适应 初期收敛慢、易陷入局部最优
强化学习 动态/超大规模(n≥1000) 实时响应、自学习 训练成本高、需要大量数据
精确算法 静态/小规模(n≤30) 全局最优 计算时间长、无法处理动态场景

三、实战:用Python+遗传算法解决CVRP问题

3.1 问题定义:小型电商仓储的拣货路线规划

场景:某电商仓储有1个仓库(坐标(0,0))和10个客户(订单),每个客户的坐标和需求量如下:

客户ID 坐标 需求量
1 (1,2) 1
2 (3,1) 2
3 (2,3) 1
4 (5,2) 3
5 (4,4) 2
6 (6,1) 1
7 (3,5) 3
8 (7,3) 2
9 (8,2) 1
10 (5,5) 2

约束:每个拣货员的货箱容量为10,需将10个客户拆分成多条路线,每条路线的总需求量≤10,且总行驶距离最短。

3.2 开发环境搭建

需要安装以下Python库:

  • numpy:数值计算
  • matplotlib:可视化
  • deap:遗传算法框架

安装命令:

pip install numpy matplotlib deap

3.3 源代码实现:从数据定义到结果可视化

(1)数据定义与距离矩阵计算
import numpy as np
import matplotlib.pyplot as plt
from deap import base, creator, tools, algorithms

# 1. 定义问题参数
depot = (0, 0)  # 仓库坐标
customers = [(1,2), (3,1), (2,3), (5,2), (4,4), (6,1), (3,5), (7,3), (8,2), (5,5)]  # 客户坐标
demands = [1, 2, 1, 3, 2, 1, 3, 2, 1, 2]  # 客户需求量
vehicle_capacity = 10  # 车辆容量
n_customers = len(customers)
nodes = [depot] + customers  # 所有节点(仓库+客户)

# 2. 计算距离矩阵(欧几里得距离)
distance_matrix = np.zeros((n_customers + 1, n_customers + 1))
for i in range(n_customers + 1):
    for j in range(n_customers + 1):
        distance_matrix[i][j] = np.linalg.norm(np.array(nodes[i]) - np.array(nodes[j]))
(2)遗传算法初始化:适应度函数与操作注册
# 3. 定义遗传算法的适应度函数(最小化总距离)
creator.create("FitnessMin", base.Fitness, weights=(-1.0,))  # weights=-1表示最小化
creator.create("Individual", list, fitness=creator.FitnessMin)  # 个体是客户的访问顺序

def evalVRP(individual):
    """评估函数:计算路径的总距离+容量惩罚"""
    routes = []  # 存储拆分后的路线
    current_route = []  # 当前路线
    current_demand = 0  # 当前路线的总需求量
    
    # 拆分路线(根据容量约束)
    for customer in individual:
        demand = demands[customer - 1]  # 客户ID从1开始,需求量从0开始
        if current_demand + demand <= vehicle_capacity:
            current_route.append(customer)
            current_demand += demand
        else:
            routes.append(current_route)
            current_route = [customer]
            current_demand = demand
    if current_route:
        routes.append(current_route)
    
    # 计算总距离
    total_distance = 0
    for route in routes:
        if not route:
            continue
        # 路线:仓库 → 客户1 → 客户2 → ... → 仓库
        distance = distance_matrix[0][route[0]]  # 仓库到第一个客户
        for i in range(len(route) - 1):
            distance += distance_matrix[route[i]][route[i+1]]  # 客户之间的距离
        distance += distance_matrix[route[-1]][0]  # 最后一个客户回到仓库
        total_distance += distance
    
    # 惩罚路线数量过多(可选,比如限制最多5辆车)
    # if len(routes) > 5:
    #     total_distance += 1000
    
    return (total_distance,)

# 4. 注册遗传操作
toolbox = base.Toolbox()
toolbox.register("indices", np.random.permutation, n_customers)  # 生成客户的随机顺序
toolbox.register("individual", tools.initIterate, creator.Individual, toolbox.indices)  # 生成个体
toolbox.register("population", tools.initRepeat, list, toolbox.individual)  # 生成种群
toolbox.register("mate", tools.cxOrdered)  # 顺序交叉(保持路径连续性)
toolbox.register("mutate", tools.mutShuffleIndexes, indpb=0.05)  # 随机交换变异(变异概率0.05)
toolbox.register("select", tools.selTournament, tournsize=3)  # 锦标赛选择(3个个体竞争)
toolbox.register("evaluate", evalVRP)  # 注册评估函数
(3)运行算法与结果输出
# 5. 初始化种群与运行算法
population = toolbox.population(n=100)  # 种群大小100
hof = tools.HallOfFame(1)  # 保存最优个体
stats = tools.Statistics(lambda ind: ind.fitness.values)  # 统计信息
stats.register("avg", np.mean)  # 平均适应度
stats.register("min", np.min)  # 最小适应度
stats.register("max", np.max)  # 最大适应度

# 运行遗传算法:交叉概率0.8,变异概率0.1,迭代200代
population, log = algorithms.eaSimple(
    population, toolbox, cxpb=0.8, mutpb=0.1, ngen=200,
    stats=stats, halloffame=hof, verbose=True
)

# 6. 输出最优结果
best_ind = hof[0]
print(f"\n最优路径顺序:{best_ind}")
print(f"最优总距离:{evalVRP(best_ind)[0]}")
(4)结果可视化:路线图绘制
# 7. 拆分最优路线(根据容量约束)
routes = []
current_route = []
current_demand = 0
for customer in best_ind:
    demand = demands[customer - 1]
    if current_demand + demand <= vehicle_capacity:
        current_route.append(customer)
        current_demand += demand
    else:
        routes.append(current_route)
        current_route = [customer]
        current_demand = demand
if current_route:
    routes.append(current_route)

# 8. 绘制路线图
plt.figure(figsize=(10, 10))
# 绘制仓库(红色)
plt.scatter(nodes[0][0], nodes[0][1], c='red', s=200, label='Depot')
# 绘制客户(蓝色)
for i in range(1, n_customers + 1):
    plt.scatter(nodes[i][0], nodes[i][1], c='blue', s=100)
    plt.text(nodes[i][0] + 0.1, nodes[i][1] + 0.1, f'C{i}', fontsize=12)
# 绘制路线(不同颜色)
colors = ['green', 'orange', 'purple', 'cyan', 'magenta']
for idx, route in enumerate(routes):
    color = colors[idx % len(colors)]
    # 路线坐标:仓库 → 客户 → 仓库
    x = [nodes[0][0]] + [nodes[customer][0] for customer in route] + [nodes[0][0]]
    y = [nodes[0][1]] + [nodes[customer][1] for customer in route] + [nodes[0][1]]
    plt.plot(x, y, color=color, linewidth=2, label=f'Route {idx+1}')
# 图表设置
plt.legend()
plt.title('Optimal CVRP Routes (Genetic Algorithm)')
plt.xlabel('X Coordinate')
plt.ylabel('Y Coordinate')
plt.grid(True)
plt.show()

3.4 代码解读:关键逻辑的设计思考

  1. 适应度函数的惩罚机制
    若路线超过容量限制,直接将总距离加一个大值(如1000),让这类个体在选择中被淘汰——这是处理约束的常用方法。

  2. 顺序交叉(OX)的选择
    普通的单点交叉会破坏路径的连续性(比如生成重复的客户ID),而OX交叉能保持客户的顺序,确保路径有效。

  3. 种群大小与迭代次数
    种群大小100、迭代200代是平衡计算时间与解质量的经验值。若种群太小,易陷入局部最优;若太大,计算时间过长。

四、进阶:动态场景与多机器人调度

4.1 动态订单的处理:增量式算法 vs 强化学习

场景:当新增一个客户(坐标(9,4),需求量2)时,如何快速调整路线?

(1)增量式算法:“插入"而非"重新计算”

核心思想:找到现有路线中距离新增客户最近的位置,检查容量是否足够,若足够则插入,否则新增一辆车。

步骤

  1. 计算新增客户与所有现有路线的"插入成本"(插入后的距离增量);
  2. 选择插入成本最小的路线;
  3. 检查该路线的总需求量是否≤容量,若满足则插入,否则新增路线。

优点:计算时间短(O(n)),适合实时场景。

(2)强化学习:让智能体"实时决策"

用PPO算法训练智能体,状态包括:

  • 当前车辆的位置、剩余容量;
  • 未访问客户的坐标、需求量、时间窗口;
  • 新增客户的信息。

智能体的动作是选择下一个要访问的客户,奖励是总距离的减少量。训练完成后,智能体可在毫秒级内处理新增订单。

4.2 多AGV调度:路径冲突与协同

场景:100台AGV在仓储中行驶,如何避免碰撞?

(1)问题模型:多车辆路径规划(VRP with Conflict Avoidance)

引入时间-空间网络:将每个AGV的位置和时间作为节点(如( x, y, t )),确保两个AGV不会在同一时间出现在同一位置。

(2)解决方案:基于规则的协同
  • 优先级规则:给AGV分配优先级(如电量高的AGV优先),低优先级AGV避让高优先级AGV;
  • 路径预留:AGV在行驶前预留路径的时间窗口,其他AGV不能占用;
  • 实时调整:用传感器(如激光雷达)检测前方AGV,若距离小于安全阈值,则减速或绕行。
(3)工具推荐:Google OR-Tools

Google OR-Tools是一款强大的组合优化库,支持多AGV调度的带冲突避免的VRP(VRP with Conflict Avoidance)。以下是简化代码:

from ortools.constraint_solver import routing_enums_pb2
from ortools.constraint_solver import pywrapcp

def create_data_model():
    data = {}
    data['distance_matrix'] = distance_matrix.tolist()
    data['demands'] = [0] + demands  # 仓库需求量为0
    data['vehicle_capacities'] = [vehicle_capacity] * 5  # 5台AGV
    data['num_vehicles'] = 5
    data['depot'] = 0
    return data

# 初始化模型
data = create_data_model()
manager = pywrapcp.RoutingIndexManager(len(data['distance_matrix']), data['num_vehicles'], data['depot'])
routing = pywrapcp.RoutingModel(manager)

# 注册距离回调
def distance_callback(from_index, to_index):
    from_node = manager.IndexToNode(from_index)
    to_node = manager.IndexToNode(to_index)
    return data['distance_matrix'][from_node][to_node]

transit_callback_index = routing.RegisterTransitCallback(distance_callback)
routing.SetArcCostEvaluatorOfAllVehicles(transit_callback_index)

# 注册容量约束
def demand_callback(from_index):
    from_node = manager.IndexToNode(from_index)
    return data['demands'][from_node]

demand_callback_index = routing.RegisterUnaryTransitCallback(demand_callback)
routing.AddDimensionWithVehicleCapacity(
    demand_callback_index, 0, data['vehicle_capacities'], True, 'Capacity'
)

# 设置搜索参数(-guided local search)
search_parameters = pywrapcp.DefaultRoutingSearchParameters()
search_parameters.first_solution_strategy = routing_enums_pb2.FirstSolutionStrategy.PATH_CHEAPEST_ARC
search_parameters.local_search_metaheuristic = routing_enums_pb2.LocalSearchMetaheuristic.GUIDED_LOCAL_SEARCH
search_parameters.time_limit.seconds = 10

# 求解
solution = routing.SolveWithParameters(search_parameters)

# 输出结果
if solution:
    print(f'Total distance: {solution.ObjectiveValue()}')
    for vehicle_id in range(data['num_vehicles']):
        index = routing.Start(vehicle_id)
        route = []
        while not routing.IsEnd(index):
            node_index = manager.IndexToNode(index)
            route.append(node_index)
            index = solution.Value(routing.NextVar(index))
        route.append(manager.IndexToNode(index))
        print(f'AGV {vehicle_id} route: {route}')

五、工具与资源:架构师的效率武器库

5.1 优化库

工具 语言 特点 适用场景
Google OR-Tools Python/Java/C++ 支持TSP/VRP/调度问题,性能高 大规模、多约束场景
DEAP Python 灵活的遗传算法框架 自定义启发式算法
Pyomo Python 数学规划建模语言,支持多种求解器 精确算法/混合整数规划
Gurobi Python/Java/C++ 商业求解器,速度快,支持大规模问题 企业级、高要求场景

5.2 可视化工具

工具 特点 适用场景
Matplotlib Python原生,易上手 静态路线图
Plotly 交互式可视化,支持Web展示 动态场景(如AGV实时位置)
Gephi 复杂网络可视化,支持大规模节点 多AGV路径冲突分析

5.3 学习资源

  • 书籍:《旅行商问题:计算解法》(David L. Applegate等)、《智能优化算法及其应用》(汪定伟等);
  • 论文:《Deep Reinforcement Learning for Vehicle Routing Problems》(2018,ICLR)、《Ant Colony Optimization for the Vehicle Routing Problem》(2002,IEEE);
  • 课程:Coursera《组合优化》、Udacity《强化学习》。

六、未来趋势:AI与数字孪生的融合

6.1 动态调度:强化学习的"实时决策"

未来的仓储调度系统将从"离线规划"转向"在线学习"——用强化学习智能体处理实时订单、AGV故障、货物移位等突发情况。例如,亚马逊的"Route Optimization AI"已用RL将配送效率提升了25%。

6.2 数字孪生:虚拟与现实的"协同优化"

通过数字孪生技术,在虚拟环境中模拟仓储的运行:

  • 预测AGV的路径冲突;
  • 模拟订单激增时的路线调整;
  • 优化货架布局(如将高频订单的货物放在靠近仓库的位置)。

6.3 多模态数据融合:从"单一数据源"到"全链路感知"

整合以下数据,提升调度的准确性:

  • 物联网数据:AGV的位置、电量、货物重量;
  • 计算机视觉:拣货员的动作、货架的货物数量;
  • 订单数据:订单的优先级、时间窗口、客户位置。

七、挑战与思考:从理论到落地的鸿沟

7.1 大规模问题的实时性

当客户数量达到1000+时,启发式算法的计算时间可能超过1分钟——而实际场景需要秒级响应。解决方案:

  • 分布式计算:将问题拆分成多个子问题,用Spark或Flink并行求解;
  • 深度学习加速:用Transformer模型预训练路径特征,快速生成初始解。

7.2 动态场景的不确定性

AGV故障、订单取消、货物移位等不确定性,要求算法具有鲁棒性。解决方案:

  • 鲁棒优化:在模型中加入不确定性参数(如AGV故障概率),求解"最坏情况下的最优解";
  • 在线学习:用增量式RL模型,实时更新策略。

7.3 多目标优化的权衡

仓储调度的目标不仅是"最短路径",还有"最少时间"、“最低能耗”、“最少人工干预”。解决方案:

  • 多目标遗传算法:用NSGA-II生成帕累托最优解,让业务人员选择权衡方案;
  • 强化学习的多奖励函数:将多个目标加权求和(如r=−dij−0.5⋅time−0.3⋅energyr = -d_{ij} - 0.5 \cdot \text{time} - 0.3 \cdot \text{energy}r=dij0.5time0.3energy)。

结语:技术人的责任与未来

智能仓储的路线规划,本质上是"用算法解决人的问题"——让拣货员少走冤枉路,让AGV更高效,让消费者更快收到货。作为架构师,我们的任务不是追求"最先进的算法",而是"最适合的解决方案":

  • 对于小规模仓储,用遗传算法就足够;
  • 对于大规模仓储,用Google OR-Tools;
  • 对于动态场景,用强化学习。

未来,随着AI、数字孪生、物联网技术的融合,智能仓储的调度系统将更加智能、实时、高效。但无论技术如何发展,解决实际问题始终是我们的核心目标——毕竟,算法的价值,在于让现实更美好。

附录:Mermaid流程图——CVRP求解流程

问题定义

数据收集:坐标、需求量、容量

距离矩阵计算

遗传算法初始化:种群、适应度函数

遗传操作:选择→交叉→变异

评估适应度

是否收敛?

输出最优路线

路线可视化与验证

附录:关键术语表

  • TSP:旅行商问题,寻找访问所有节点并回到起点的最短路径;
  • CVRP:带容量约束的TSP,需将节点拆分成多条路线,每条路线的总需求量≤容量;
  • TW-TSP:带时间窗口的TSP,节点必须在指定时间内访问;
  • 启发式算法:通过近似策略快速找到高质量解的算法;
  • 帕累托最优:无法在不损害一个目标的情况下提升另一个目标的解。
Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐