【优化数学模型】2. 动态规划DP方法的求解思路

这篇具有很好参考价值的文章主要介绍了【优化数学模型】2. 动态规划DP方法的求解思路。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

【优化数学模型】2. 动态规划DP方法的求解思路,生物数学模型,动态规划,算法,python,数学建模,生物数学模型,优化数学模型


一、动态规划

1. 概述

多阶段决策问题,就是要在允许的决策范围内,选择一个最优决策使整个系统在预定标准下达到最佳效果。

动态规划 (dynamic programming,DP) 是用来解决多阶段决策过程最优化的一种数量方法。其特点在于,它可以把一个n维决策问题变换为几个一维最优化问题,从而一个一个地去解决。

与分而治之技术的不同之处在于,动态规划解决方案中的子问题是重叠的,因此解决一个子问题所需的一些相同步骤也需要用于其他子问题。

许多文章中提到动态规划会将其称为是一种经典的算法,需要指出的是,动态规划是1951年,美国数学家贝尔曼等人根据一类多阶段决策问题特性提出的解决这类问题的“最优化原理”,是其创建出的最优化问题的一种新思路,是求解一类问题的一种方法,是考察问题的一种途径,而不是一种算法。

在解决相应问题时,必须对具体问题进行具体分析,运用动态规划的原理和方法,建立相应的模型,然后再用动态规划方法去求解。

【优化数学模型】2. 动态规划DP方法的求解思路,生物数学模型,动态规划,算法,python,数学建模,生物数学模型,优化数学模型

2. 最优性原理

应用动态规划设计使多阶段决策过程达到最优(成本最省、效益最高、路径最短等),依据动态规划的最优性原理:“作为整个过程的最优策略具有这样的性质,无论过去的状态和决策如何,对前面的决策所形成的状态而言,余下的诸决策必须构成最优策略”。也就是说,最优决策序列中的任何子序列都是最优的。

3. 最优子结构特性

最优性原理体现为问题的最优子结构特性。当一个问题的最优解中包含了子问题的最优解时,则称该问题具有最优子结构特性。最优子结构特性使得在从较小问题的解构造较大问题的解时,只需考虑子问题的最优解,从而大大减少了求解问题的计算量。

二、示例:0-1背包问题

1. 问题描述

0-1背包问题是应用动态规划设计求解的典型案例。

已知有 N 种物品和一个可容纳 W 重量的背包,物品 i 的重量为 w i w_i wi ,产生的效益为 p i p_i pi 。在装包时物品 i 可以装入,也可以不装,但不可拆开装。即物品 i可产生的效益为 x i p i x_ip_i xipi 。这里 x i x_i xi∈{0,1}, c, w i w_i wi , p i p_i pi∈ N+。

示例:
【优化数学模型】2. 动态规划DP方法的求解思路,生物数学模型,动态规划,算法,python,数学建模,生物数学模型,优化数学模型

2. 使用自顶向下的方法

  • 一般使用一个数组或者一个哈希map充当这个备忘录。
  • 声明函数,并将项目、容量、临时字典和当前索引作为参数。
  • 如果小于 0、小于 0或大于列表长度,则返回 0.
  • 否则,如果总重量小于容量,则创建两个利润,用于检查相邻项目。这可以通过使用不同参数递归调用函数来实现。
  • 将这两个利润中的最大值分配给字典的当前元素。 将字典中的该值作为输出返回。
class Item:
    def __init__(self, profit, weight):
        self.profit = profit
        self.weight = weight
        
def zeroKnapsack(items, capacity, currentIndex, tempDict):
    dictKey = str(currentIndex) + str(capacity)
    if capacity <= 0 or currentIndex < 0 or currentIndex >= len(items):
        return 0
    elif dictKey in tempDict:
        return tempDict[currentIndex]
    elif items[currentIndex].weight <= capacity:
        profit1 = items[currentIndex].profit + zeroKnapsack(
            items, capacity-items[currentIndex].weight, currentIndex+1, tempDict)
        profit2 = zeroKnapsack(items, capacity, currentIndex+1, tempDict)
        tempDict[dictKey] = max(profit1, profit2)
        return tempDict[dictKey]
    else:
        return 0
        
mango = Item(31, 3)
apple = Item(26, 1)
orange = Item(17, 2)
banana = Item(72, 5)

items = [mango, apple, orange, banana]

print(zeroKnapsack(items, 7, 0, {}))

3. 使用自下而上的方法

  • 声明函数,并将利润、物品权重和背包容量作为参数。
  • 如果容量小于 0,利润长度等于 0,或者利润长度和权重不一致,则返回 0。
  • 创建变量:迭代行数和容量,初始化的值为 0。
  • 创建两个变量用于存储利润。只要权重不超过容量,就存储矩阵中每一行和每一列的值。
  • 重复上述过程,并返回两个变量的最大值作为输出。
class Item:
    def __init__(self, profit, weight):
        self.profit = profit
        self.weight = weight

def zoKnapsackBU(profits, weights, capacity):
    if capacity <= 0 or len(profits) == 0 or len(weights) != len(profits):
        return 0
    numberOfRows = len(profits) + 1
    dp = [[None for i in range(capacity+2)] for j in range(numberOfRows)]
    for i in range(numberOfRows):
        dp[i][0] = 0
    for i in range(capacity+1):
        dp[numberOfRows-1][i] = 0
    for row in range(numberOfRows-2, -1, -1):
        for column in range(1, capacity+1):
            profit1 = 0
            profit2 = 0
            if weights[row] <= column:
                profit1 = profits[row] + dp[row + 1][column - weights[row]]
            profit2 = dp[row + 1][column]
            dp[row][column] = max(profit1, profit2)
    return dp[0][capacity]

profits = [31, 26, 17, 72]
weights = [3, 1, 2, 5]

print(zoKnapsackBU(profits, weights, 7))

最大利润是通过以下组合实现的:

Apple(W: 1, P: 26) + Banana(W: 5, P: 72) = W: 6, P: 98文章来源地址https://www.toymoban.com/news/detail-834472.html


到了这里,关于【优化数学模型】2. 动态规划DP方法的求解思路的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 动态规划——带权二分优化DP 学习笔记

    带权二分其实并不一定用于优化 DP,也可能用于优化贪心等最优化的算法。 带权二分也叫 WQS 二分,最初由王钦石在他的 2012 年国家集训队论文中提出。 使用情况 要解决一个最优化问题(求最大 / 最小值) 有一个限制,一般是某个参数要求一定恰好为 (k) 而带权二分就可以

    2024年02月08日
    浏览(37)
  • 从01背包开始动态规划:暴力解法 + dp + 滚动数组 + dp优化

        01背包问题是动态规划中最经典的问题之一,本篇将通过给出其四种解法,使读者更深刻理解动态规划。   有N件物品和一个容量是 V 的背包,每个物品有各自的体积和价值,且每个物品只能放一次(这也是01背包名字的由来),如何让背包里装入的物品具有最大的价值总

    2024年04月17日
    浏览(54)
  • 数学建模1:lingo软件求解优化模型

    本次数学建模学习笔记系列,以代码学习为主,附带建模及论文亮点记录 由于队友为两位经济学小伙伴,因此以大数据类型题目为主要学习方向 注:论文代码资料来源网络 1、结构清晰(后附该论文前两问的目录结构) 2、lingo求解优化模型,涉及函数循环与求和 3、表格很好

    2024年02月08日
    浏览(65)
  • 【数学建模】Python+Gurobi求解非线性规划模型

    目录 1 概述 2 算例  2.1 算例 2.2 参数设置 2.3 Python代码实现 2.4 求解结果 如果目标函数或约束条件中包含非线性函数,就称这种规划问题为非线性规划问题。 参考:(非线性规划Python)计及动态约束及节能减排环保要求的经济调度 2.1 算例 2.2 参数设置 求解NLP/非凸问题时,

    2024年02月09日
    浏览(47)
  • 【动态规划 状态机dp 性能优化】3098. 求出所有子序列的能量和

    动态规划 状态机dp 性能优化 给你一个长度为 n 的整数数组 nums 和一个 正 整数 k 。 一个子序列的 能量 定义为子序列中 任意 两个元素的差值绝对值的 最小值 。 请你返回 nums 中长度 等于 k 的 所有 子序列的 能量和 。 由于答案可能会很大,将答案对 109 + 7 取余 后返回。 示

    2024年04月27日
    浏览(34)
  • 运筹说 第67期 | 动态规划模型的建立与求解

    通过前一期的学习,我们已经学会了动态规划的基本概念和基本原理。本期小编带大家学习动态规划模型的建立与求解。 动态规划模型的建立 一   概述 建立动态规划的模型,就是分析问题并建立问题的动态规划基本方程。 成功地应用动态规划方法的关键,在于识别问题的

    2024年01月16日
    浏览(36)
  • 【运筹优化】子集和问题(Subset Sum Problems , SSP)介绍 + 动态规划求解 + Java代码实现

    子集和问题(Subset Sum Problems , SSP),它是复杂性理论中最重要的问题之一。 SSP会给定一组整数 a 1 , a 2 , . . . . , a n a_1,a_2,....,a_n a 1 ​ , a 2 ​ , .... , a n ​ ,最多 n n n 个整数,我们需要判断是否存在一个非空子集,使得子集的总和为 M M M 整数?如果存在则需要输出该子集。

    2024年01月17日
    浏览(49)
  • 【数学建模】优化模型——规划模型

    在数学建模中,优化类问题是很常见的一种问题。这种问题里面通常涉及多个 变量 和 约束条件 ,并需要在这些变量和条件之下 优化某个函数 。最常见的例子就是,“达到最好效果”、“取得最大利润”、“极大降低风险”等等。遇到这类字眼,应首先考虑优化模型求解。

    2024年01月25日
    浏览(40)
  • 交通物流模型 | Python建模实现动态交通分配优化问题求解

    效果一览 文章概述 交通物流模型 | Pyomo建模框架实现动态交通分配优化问题求解,DTA 交通分配问题通常需要考虑许多因素,例如道路容量、交通需求、速度限制、车辆类型、交通信号灯等,在城市规划和交通管理领域中具有重要的应用价值。 研究内容 交通分配问题是交通领

    2024年02月07日
    浏览(47)
  • 数学建模论文写作方法之一(模型的建立与求解)

    一、模型的建立:(大多数都是根据实际问题套用别人已经建立的模型,但需要将问题与模型结合起来) 1.物理类问题中模型的建立 由。。。。知识的得到。。。。(公式) 2.优化类问题中模型的建立 ①目标函数+ ②约束条件 ③关于约束条件的说明 3.使用别人已经建立好的

    2024年02月11日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包