我想在哈斯凯尔和你一样
for (int i = 0; i < city_Permutation_Route.length - 1; i++) {
route_Distance = route_Distance + city_Distance_Matrix[city_Permutation_Route[i]][city_Permutation_Route[i + 1]];
}
在这里,我得到了每条路线的权重,并将其与其他每条路线进行比较,这样我就可以打印出权重最低的路线,如下所示
线路重量=453.4
路线=0,1,2,3,4,5,6,7,8
我有函数来获取总路线和所有其他数据,但不知道如何从矩阵中获取值
问:我在哈斯克尔怎么做?
我想能够从距离矩阵中得到值,使用置换值作为它的索引
最佳答案
给定一个置换,例如[3, 2, 7, 5, 4, 6, 0, 1]
,您可以通过zip
使用它自己的tail
ping来计算所有支腿。
zip [3, 2, 7, 5, 4, 6, 0, 1]
(tail [3, 2, 7, 5, 4, 6, 0, 1])
zip [3, 2, 7, 5, 4, 6, 0, 1]
[2, 7, 5, 4, 6, 0, 1]
[(3,2),(2,7),(7,5),(5,4),(4,6),(6,0),(0,1)]
这些是距离矩阵中两点间旅行成本的指标如果我们使用列表索引函数AA>在
city_Distance_Matrix
中查找这些,我们得到每个分支的成本。map (\(c0, c1) -> city_Distance_Matrix !! c0 !! c1)
[(3,2),(2,7),(7,5),(5,4),(4,6),(6,0),(0,1)]
[97.4, 71.6, 111.0,138.0,85.2 ,86.3 ,129.0]
如果我们把这些加起来,我们就得到了这个排列的腿的总成本。
sum [97.4, 71.6, 111.0,138.0,85.2 ,86.3 ,129.0] = 718.5
综上所述,我们可以定义一个函数来计算城市排列中所有分支的总长度。我们可以使用
!!
来简化函数,它是zipWith
和zip
的组合。totalLength :: [Int] -> Double
totalLength cities = sum $ zipWith (\c0 c1 -> city_Distance_Matrix !! c0 !! c1) cities (tail cities)
您应该能够使用这个来找到
map
最小的置换。关于arrays - 访问矩阵中的值(Haskell Newbie),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29489192/