多个起源 - 多个目的地

时间:2010-01-17 12:53:01

标签: algorithm routes mathematical-optimization

我有一个优化问题。它只是有点旅行 - 推销员 - ish。

假设我有一组目的地和另一组相应的起源。 我需要将每个目的地与一个原点相关联,以便路线之间的差异尽可能小。

我对形成总距离最短的坐标对不感兴趣。我在尽量减少路线之间的差异。

显然,创建起源 - 目的地对有很多种可能的组合,只需要找到所有路线相等的最佳路径。

关于解决这个问题的想法?

3 个答案:

答案 0 :(得分:1)

如果您采用一个简单的视图,即您的问题中的“方差”是通过解决方案中最小和最大距离之间的差异来衡量的,那么您可以使用以下算法。选择最小距离和最大距离。然后擦除结构中超出此频段的那些路线;然后执行标准的二分匹配。如果(min,max)是你的波段并且(min http://en.wikipedia.org/wiki/Matching_%28graph_theory%29。

答案 1 :(得分:0)

不一定是最佳解决方案,但也许是一个良好的开端:

  1. 找到 A 点,使得从原点到 A 的距离总和最小。
  2. 找到 B 点,使 B 到目的地的距离总和最小。
  3. 找到从 A B 的最短路径。
  4. 步骤1和2采用O(V ^ 3)应用Floyd-Warshall算法确定距离,然后采用O(V)表示“线性”搜索点 A B 。步骤3取O(V ^ 2)确定最短路径。

答案 2 :(得分:0)

在找到更复杂,更快速的算法之前,您需要尝试全扫描算法。

  1. 找到一种尽可能使一个集合置换的算法
  2. 将此算法用于目标集合
  3. 对于每个排列,计算方差
  4. 示例:

    IEnumerable<Point[]> Permute(Point[] points)
    {
       if(points.Length > 1)
           foreach(var point in points)
           {
              var remaining = points.Except(point).ToArray();
              foreach(var permutation in Permute(remaining))
                   yield return new [] { new [] { point },  permutation}
                      .SelectMany(p => p)
                      .ToArray();
           }
       else
           yield return points;
    }
    
    Point[] SortDestinations(
             Point[] origins,
             Point[] destinations)
    {
        var minVariance = int.MaxValue;
        Point[] minVariancePermutation;
        foreach(var permutation in Permute(destinations))
        {
            var variance = CalculateVariance(origins, permutation);
            if(variance < minVariance)
            {
                minVariance = variance;
                minVariancePermutation = permutation
            }
        }
        return minVariancePermutation;
    }