我正在尝试在 haskell 中基本实现这一点
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
我有获取总路线和所有其他数据的功能,但不明白如何从矩阵中获取值
问题:我如何在 haskell 中执行此操作
我希望能够使用排列值作为它的索引从我的距离矩阵中获取值
最佳答案
给定一个排列,例如 [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)]
这些是两点之间旅行成本的距离矩阵的索引。如果我们使用列表索引函数 !!
在 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
和 map
的组合。
totalLength :: [Int] -> Double
totalLength cities = sum $ zipWith (\c0 c1 -> city_Distance_Matrix !! c0 !! c1) cities (tail cities)
您应该能够使用它来找到 totalLength
最小的排列。
关于arrays - 访问矩阵中的值(Haskell 新手),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29489192/