我有一个优化问题。它只是有点旅行 - 推销员 - ish。
假设我有一组目的地和另一组相应的起源。 我需要将每个目的地与一个原点相关联,以便路线之间的差异尽可能小。
我对形成总距离最短的坐标对不感兴趣。我在尽量减少路线之间的差异。
显然,创建起源 - 目的地对有很多种可能的组合,只需要找到所有路线相等的最佳路径。
关于解决这个问题的想法?
答案 0 :(得分:1)
如果您采用一个简单的视图,即您的问题中的“方差”是通过解决方案中最小和最大距离之间的差异来衡量的,那么您可以使用以下算法。选择最小距离和最大距离。然后擦除结构中超出此频段的那些路线;然后执行标准的二分匹配。如果(min,max)是你的波段并且(min
答案 1 :(得分:0)
不一定是最佳解决方案,但也许是一个良好的开端:
步骤1和2采用O(V ^ 3)应用Floyd-Warshall算法确定距离,然后采用O(V)表示“线性”搜索点 A 和 B 。步骤3取O(V ^ 2)确定最短路径。
答案 2 :(得分:0)
在找到更复杂,更快速的算法之前,您需要尝试全扫描算法。
示例:
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;
}