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

时间最优多节点路径规划:带权重可选点位寻路算法选型及优化咨询

适配该场景的算法推荐

你的需求本质是定向越野问题(Orienteering Problem, OP),属于TSP的衍生分支,核心目标就是在不要求覆盖所有点位的前提下,最大化路径的总收益/总成本比值,有非常成熟的适配方案,不需要优先考虑蚁群、遗传等通用启发式算法:

  • 小点位池(<100个):用带剪枝的动态规划求解
    状态定义为「当前所在点位 + 已访问点位集合」,只保留每个状态下的最高收益/距离比,剪除掉所有比值低于当前全局最优的状态,运算量远低于暴力枚举,可得到精确最优解。
  • 大中点位池(100~5000个):用增量贪心构造算法
    完全匹配你的实时响应要求,实现逻辑如下:
    1. 初始化路径为仅包含起点,如有固定终点则固定放在路径末尾
    2. 遍历所有未加入路径的点位,计算将该点位插入到路径任意位置后的全局权重/距离比
    3. 选择能让比值提升最大的点位插入路径
    4. 重复步骤2~3,直到所有待选点位插入后都无法提升全局比值,自动终止
      该算法对千级点位的响应时间可控制在100ms以内,近似解和最优解的误差通常低于5%,完全满足业务需求。
点位池优化方向
  • 更精准的前置过滤:你当前用的圆形半径过滤可以升级为路径缓冲区过滤:如果是有固定终点的场景,以起点到终点的连线为中心,划定两侧指定宽度的缓冲区,直接过滤掉缓冲区外的点位,比圆形半径能多过滤30%以上的无效点位,你给出的场景3中(30,30)点位就可以在这一步直接排除,不需要进入后续计算。
  • 预估值前置过滤:提前为每个点位计算基础收益比=点位权重/该点位到起点(或AB连线最近点)的距离,直接过滤掉收益比低于当前全局最优比值1/2的点位,减少后续遍历的计算量。
  • 临近点位合并优化:你当前的临近点位合并可以增加距离权重,比如两个点位距离<阈值时,合并后的点位坐标取权重加权平均位置,而不是简单取中点,能进一步降低计算误差。
现有代码改造建议

你当前的暴力枚举逻辑仅适合小样本验证,可直接改造为贪心逻辑适配生产环境,核心改造点如下:

// 核心逻辑伪代码
function getBestRoute(start, points, end = null) {
  let bestPath = end ? [start, end] : [start]
  let bestRatio = calculateRatio(bestPath)
  let remainingPoints = [...points]

  while(true) {
    let bestInsertPos = -1
    let bestInsertPoint = null
    let maxNewRatio = bestRatio

    // 遍历所有待插入点位
    for(let point of remainingPoints) {
      // 遍历所有可插入位置(有终点的话不插到最后)
      let maxPos = end ? bestPath.length - 1 : bestPath.length
      for(let i = 1; i < maxPos; i++) {
        let newPath = [...bestPath.slice(0,i), point, ...bestPath.slice(i)]
        let newRatio = calculateRatio(newPath)
        if(newRatio > maxNewRatio) {
          maxNewRatio = newRatio
          bestInsertPos = i
          bestInsertPoint = point
        }
      }
    }

    if(!bestInsertPoint) break // 没有能提升比值的点位,终止
    bestPath.splice(bestInsertPos, 0, bestInsertPoint)
    bestRatio = maxNewRatio
    remainingPoints = remainingPoints.filter(p => p !== bestInsertPoint)
  }
  return { bestPath, bestRatio }
}

function calculateRatio(path) {
  let totalWeight = 0, totalDist = 0
  for(let i=1; i<path.length; i++) {
    totalDist += getDistance(path[i-1], path[i])
    totalWeight += path[i].weight || 0
  }
  return totalWeight / totalDist
}

该逻辑可直接复现你给出的所有测试场景的输出结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 00:36:04