`
brandNewUser
  • 浏览: 453169 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

算法学习-动态规划

阅读更多

最近发现自己在算法的方面真的是犹如小学生一般,跟公司的从一些更厉害学校毕业的人都不在一个水平面上,唉,觉得以前大学期间真心是一个学渣,虽然软件工程方面还可以,但是时候该补一补关于算法的相关知识了。

学习算法的同时,也顺带着学习python脚本语言。

动态规划

动态规划是通过组合子问题的解来解决整个问题的,通过将问题分解成多个相互不独立的子问题,例如0/1背包问题,对每个子问题求解一次,并将其结果保存到一张辅助表中,避免每次遇到各个子问题时再重新计算,动态规划通常用于解决最优化问题。

(1)全局最优解中一定包含某个局部最优解,但不一定包含前一个局部最优解,因此需要记录之前的所有最优解 ;
(2)动态规划的关键是状态转移方程,即如何由以求出的局部最优解来推导全局最优解 ;
(3)边界条件:即最简单的,可以直接得出的局部最优解。

有n件物品,第i件物品价值为vi元,重量为wi,假设vi和wi都为整数,希望带走的东西越值钱越好,但他的背包中之多只能装下W磅的东西,W为一整数。问题是应该带走哪几样东西?

0/1背包问题是一个典型的最优子结构的问题,只能采用动态规划来解决,不能采用贪心算法。

class Commodity:
    def __init__(self, value, weight):
        self.__value = value
        self.__weight = weight

    def get_value(self):
        return self.__value

    def get_weight(self):
        return self.__weight


if __name__ == '__main__':
    totalCount = 3
    bagCapacity = 50

    commodities = [Commodity(0, 0), Commodity(60, 10), Commodity(100, 20), Commodity(120, 30)]
    matrix = [[0 for i in range(bagCapacity + 1)] for i in range(totalCount + 1)]

    # initial set value = 0 when commodity count = 0
    for i in range(1, bagCapacity + 1):
        matrix[0][bagCapacity] = 0

    for i in range(1, totalCount + 1):
        # set max value = 0 when capacity = 0
        matrix[i][0] = 0
        for w in range(1, bagCapacity + 1):
            if ( commodities[i].get_weight() <= w):
                if (commodities[i].get_value() + matrix[i - 1][w - commodities[i].get_weight()] > matrix[i - 1][w]):
                    matrix[i][w] = commodities[i].get_value() + matrix[i - 1][w - commodities[i].get_weight()]
                else:
                    matrix[i][w] = matrix[i - 1][w]
            else:
                matrix[i][w] = matrix[i - 1][w]


    print "The max value matrix is : %s" % matrix

    remaining_space = bagCapacity
    # we should output selected commodity
    for i in range(totalCount, 0, -1):
        if(remaining_space >= commodities[i].get_weight()):
            if(matrix[i][remaining_space] - matrix[i-1][remaining_space-commodities[i].get_weight()] == commodities[i].get_value()):
                print "item %s selected" % i
                remaining_space -= commodities[i].get_weight()

 

首先,我们定义了一个Commodify类来描述物品的二维特性,价值和重量。

 

第一步,逐步建立局部最优解的状态矩阵,状态矩阵表示,在一定数量内的物品,一定范围的总重量范围内的最大价值是多少?

 

我们最简单的边界条件设置为,当有0个物品时,最大价值必定为0;当物品的总重量为0时,最大价值也必然为0;

 

第二步,当我们选定一个物品,如何判断是否应该加入最优解的结果中呢?首先判断这个物品是否大于局部最优解限定的重量,如果大于直接pass掉,使用上一步骤的局部最优解。

 

如果在限定的重量范围内,并且加上这个物品的要比不加这个物品的局部最优解要大,也就是说质量不变的情况下,能否用更多数量的物品达到更大价值,那么这是最新的最优解;否则仍然选择上一步骤的局部最优解,判断条件为:

if (commodities[i].get_value() + matrix[i - 1][w - commodities[i].get_weight()] > matrix[i - 1][w]):

 

最后,我们建立起这个矩阵,最后面的matrix[totalCount+1][bagCapacity+1]就是最终的最优解。

 

那么需要列出在此过程中,我们选择了哪些物品,从局部最优矩阵的结果入手,向前递推,如果遍历的这个物品的最优解减掉该物品的重量刚好差值为该物品的质量,那么证明刚才的最优解中选择了该物品。

 

if(matrix[i][remaining_space] - matrix[i-1][remaining_space-commodities[i].get_weight()] == commodities[i].get_value()):
                print "item %s selected" % i
                remaining_space -= commodities[i].get_weight()

 

 

 

 

分享到:
评论

相关推荐

    算法提高-动态规划(二)

    以背包问题为例,我们可以通过0-1背包或完全背包问题来学习动态规划的应用。0-1背包问题要求在一个容量有限的背包中放入物品,使得总价值最大,每个物品都有自己的重量和价值。动态规划解决方案通过构造一个二维数组...

    算法提高-动态规划(七)

    动态规划是一种强大的算法工具,广泛应用于解决复杂的问题,如最优化、路径寻找、背包问题等。...通过深入学习“算法提高-动态规划(七)”,你将能够更有效地应对各种复杂计算挑战,提升自己的编程技能。

    算法提高-动态规划(三)

    通过学习这个主题,你将能够熟练地应用动态规划解决实际问题,理解并掌握动态规划背后的逻辑和技巧,提升自己的算法能力。视频资源“第一章 动态规划(三).mp4”将提供更直观、具体的示例和解释,帮助你深入理解这...

    算法提高-动态规划(六)

    9. **代码实现**:学习如何用Python、Java或其他编程语言实现动态规划算法,了解动态规划代码的编写规范和技巧。 10. **复杂度分析**:讨论动态规划算法的时间复杂度和空间复杂度,分析其效率,并与贪心和回溯等...

    算法基础-动态规划(下)

    在学习动态规划时,理解问题的结构、识别子问题、构造状态和状态转移方程是关键步骤。此外,还需要掌握如何有效地实现记忆化,以避免冗余计算,提高算法效率。同时,理解剪枝策略也是很重要的,它可以帮助我们在递归...

    算法基础-动态规划(上)

    动态规划是一种重要的算法思想,广泛应用于计算机科学和数学问题中,尤其在解决最优化问题时效果显著。在“算法基础-动态规划(上)”这个主题中,我们主要探讨动态规划的基本概念、特点以及如何应用它来解决实际...

    算法-动态规划- 动态规划概述(包含源程序).rar

    动态规划是一种强大的问题解决方法,尤其在...通过学习这些内容,你可以深入理解动态规划的原理,并能将其应用到实际编程问题中,提高解决问题的效率和能力。动态规划不仅是一种理论知识,更是提升编程技能的重要工具。

    ACM程序设计算法大全--动态规划

    学习动态规划需要理解问题的结构,确定状态、状态转移方程以及初始条件,然后设计并实现相应的算法。通过练习和分析各种题型,从简单的线性动态规划到复杂的二维甚至多维问题,逐步提高解题能力。 "ACM程序设计算法...

    算法-动态规划-斐波那契模型

    本资源是解决算法中动态规划中第一章斐波那契模型。我们通过四道例题来学习了什么是动态规划,从泰波那契数列开始,到解码方法结束。以四道典型例题,对我们的斐波那契数列模型有了新的认识,在解决个问题中,我将每...

    算法-动态规划- 线性 DP- 序列问题(包含源程序).rar

    这个压缩包文件"算法-动态规划- 线性 DP- 序列问题(包含源程序).rar"很可能包含了关于如何应用线性动态规划来解决序列问题的详细解释以及实际的源代码示例。 动态规划的核心思想是将一个大问题分解为多个小的、...

    算法-动态规划- 区间 DP(包含源程序).rar

    在这个名为“算法-动态规划-区间DP(包含源程序).rar”的压缩包中,我们可以期待找到关于动态规划,特别是区间动态规划的一些理论解释、实例分析以及可能的源代码实现。 区间动态规划,顾名思义,是动态规划的一个...

    遗传算法.zip_0-1整数算法_0-1规划算法_整数规划_遗传 整数规划_遗传 规划

    遗传算法是一种模拟自然选择和遗传机制的优化方法,它在解决复杂的优化问题,特别是非线性规划和整数...通过“遗传算法.txt”文件,我们可以深入学习如何将这些理论应用于实践中,以高效地解决实际的0-1整数规划问题。

    算法-动态规划- 区间 DP- 石子合并三讲(包含源程序).rar

    在这个“算法-动态规划- 区间 DP- 石子合并三讲(包含源程序)”的压缩包中,我们将深入探讨一种特殊的动态规划方法——区间动态规划(Interval Dynamic Programming, IDP),并结合石子合并问题进行解析。...

    算法-动态规划- 背包问题 P08- 泛化物品背包(包含源程序).rar

    总的来说,这个压缩包提供了一个学习动态规划和背包问题的综合资源,包括理论知识、实例解析和实际的代码实现,对于想要深入理解动态规划算法的IT从业者或学生来说,是一个非常有价值的参考资料。通过学习这个案例,...

    算法-动态规划- 背包问题 P09- 背包问题的变化(包含源程序).rar

    这个压缩包文件“算法-动态规划- 背包问题 P09- 背包问题的变化(包含源程序).rar”显然是关于动态规划在背包问题中的应用的一个学习资源,可能包含了详细的讲解和实际的编程示例。 背包问题通常涉及到在一个给定...

    算法-动态规划- 背包问题(包含源程序).rar

    总之,动态规划和背包问题是算法领域的重要内容,对于学习和掌握这类问题,理论知识和实践操作同样重要。这个压缩包提供了一个很好的学习资源,包含了理论讲解和实际编程示例,对于深入理解动态规划解决背包问题有很...

    算法作业-众数 动态规划 最近点对 排序

    本压缩包文件包含了一些重要的算法主题,包括“众数”、“动态规划”、“最近点对”和“排序”。接下来,我们将深入探讨这些算法及其应用。 1. **众数**:众数是指在一个数据集中出现次数最多的数值。如果数据集中...

    DP-P2动态规划HEV-动态规划汽车-HEVDP-极限油耗计算.zip

    总之,这个压缩包提供了一个实际应用动态规划解决复杂工程问题的例子,对于学习算法和汽车工程的人员来说,都是宝贵的资源。通过深入研究和理解这个案例,我们可以提升对动态规划算法的理解,并将其应用到其他优化...

    北大POJ初级-动态规划

    在学习动态规划的过程中,建议先从基础题目入手,逐步提高难度。同时,不断反思和总结,理解动态规划的本质,才能真正掌握这一强大工具。北京大学的POJ平台提供了这样一个实践平台,使初学者有机会在实际操作中巩固...

Global site tag (gtag.js) - Google Analytics