我有一個優化問題。這只是有點旅行推銷員。多重起源 - 多個目的地
可以說我有一組目的地和另一組相對應的原點。 我需要將每個目的地與一個原點鏈接,以便路線之間的差異儘可能小。
我對用最短距離形成一對座標不感興趣。我最小化了路線之間的差異。
很顯然,創建起點到終點對的組合很多,只是找到所有路線都不太平等的最佳組合。
想法解決這個問題?
我有一個優化問題。這只是有點旅行推銷員。多重起源 - 多個目的地
可以說我有一組目的地和另一組相對應的原點。 我需要將每個目的地與一個原點鏈接,以便路線之間的差異儘可能小。
我對用最短距離形成一對座標不感興趣。我最小化了路線之間的差異。
很顯然,創建起點到終點對的組合很多,只是找到所有路線都不太平等的最佳組合。
想法解決這個問題?
如果您簡單看待問題中的「差異」是通過差異來衡量的e在解決方案中最小距離和最大距離之間,則可以使用以下算法。選擇最小距離和最大距離。然後在你的結構中清除這個樂隊之外的路線;然後執行標準二分配匹配。如果(最小,最大)是你的帶寬,並且(min,max)最大值只有在(min,max)可以求解的情況下才能求解;這會導致一種算法,然後您可以從更寬的頻帶開始搜索儘可能最窄的頻段,但仍然可以採用雙頻匹配。二部匹配是一個低複雜度的算法問題,所以整個解決方案應該是快速的;二分配匹配,見http://en.wikipedia.org/wiki/Matching_%28graph_theory%29。
不一定是最佳的解決方案,但也許一個良好的開端:
步驟1和2取ø(V^3)用於施加Floyd-Warshall算法,以確定的距離,然後O(V)爲 「線性」 搜索點甲和乙。步驟3取O(V^2)確定最短路徑。
在查找更復雜,更快的程序之前,您需要嘗試全掃描算法。
示例一個集合中的所有方式的算法:
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;
}
這是什麼意思,你想「路線之間的差異」越小越好?你能重述一下這個問題嗎? – synepis 2010-01-17 13:32:40
你如何測量路徑之間的差異?通過分配給邊的權重還是通過邊的數量,兩條路徑有共同點,或兩者都不相同? – 2010-01-17 14:16:11