arrays - 访问矩阵中的值(Haskell 新手)

标签 arrays algorithm list haskell

我正在尝试在 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 来简化函数这是 zipmap 的组合。

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/

相关文章:

c++ - 有没有办法让这个最短路径算法更快?

python - 列表理解和交集问题

java - 如何通过数组的特定索引将数据添加到数组列表?

php - 从 PHP 数组中删除随机项

C:使用以指针为参数的 void 函数更改 char 数组的值

java - 如何相交两组不适合内存的long?

java - 最小堆算法

python - 在 Python 中访问数组列的最佳方法是什么?

python - 在列表列表中,如何找到与内部列表关联的值的平均值?

c# - 移动列表中的元素