如何在Python中高效地进行复杂状态依赖的动态规划?

问题描述 投票:0回答:1

我正在开发一个涉及实现动态规划(DP)算法的Python项目,但状态依赖性并不简单。这是我的问题的简化版本:

我需要计算遍历二维网格的最小成本,其中每个单元格都有一个成本,但移动规则不寻常:

您可以向下、向右或向右斜下移动。 对角移动会产生额外的惩罚,具体取决于起始单元格和结束单元格的成本总和。 此外,移动到单元格中的成本可能取决于之前的移动是水平、垂直还是对角移动。 例如: 如果 grid[i][j] 是单元格 (i, j) 的成本,则从 (i-1, j-1)(对角线)到达 (i, j) 的成本将为:

dp[i][j] = dp[i-1][j-1] + grid[i][j] + penalty_function(grid[i-1][j-1], grid[i][j])

但是从 (i-1, j)(垂直)来看,它只是:

dp[i][j] = dp[i-1][j] + grid[i][j]

我尝试了以下方法:

def min_cost(grid):
    rows, cols = len(grid), len(grid[0])
    dp = [[float('inf')] * cols for _ in range(rows)]
    dp[0][0] = grid[0][0]  # Starting point

    for i in range(1, rows):
        for j in range(1, cols):
            vertical = dp[i-1][j] + grid[i][j]
            horizontal = dp[i][j-1] + grid[i][j]
            diagonal = dp[i-1][j-1] + grid[i][j] + penalty_function(grid[i-1][j-1], grid[i][j])
            dp[i][j] = min(vertical, horizontal, diagonal)

    return dp[-1][-1]

但是,对于较大的网格来说,这会变得效率低下,因为惩罚函数本身的计算成本可能很高,并且当网格大小超过 1000x1000 时,解决方案无法很好地扩展。

有没有办法优化这种 DP 方法,可能是通过记忆或预先计算惩罚函数的部分? 在这种情况下,切换到 NumPy 等库或使用并行处理会有帮助吗? 是否有特定于 Python 的技巧(例如 @functools.lru_cache、生成器)可以用来提高性能,同时保持代码整洁和可读?

python algorithm performance optimization
1个回答
0
投票

您不需要存储 dp 值的整个 2D 数组。您的算法只需要当前行和前一行。仅使用 2 行并不会改变计算复杂度,但实际上空间复杂度很高,更少的内存需求可能会带来性能提升。

© www.soinside.com 2019 - 2024. All rights reserved.