【学习笔记】Matlab和python双语言的学习(动态规划)

devtools/2024/10/18 10:27:20/

文章目录

  • 前言
  • 一、动态规划
  • 三、代码实现----Matlab
    • 1.示例1
    • 2.示例2
  • 四、代码实现----python
    • 1.示例1
    • 2.示例2
  • 总结


前言

通过模型算法,熟练对Matlab和python的应用。
学习视频链接:
https://www.bilibili.com/video/BV1EK41187QF/?p=32&vd_source=67471d3a1b4f517b7a7964093e62f7e6

一、动态规划

  • 动态规划(Dynamic Programming,简称 DP)是一种在计算机科学和数学中用于解决复杂问题的优化技术。它通过将问题分解为更小的子问题,存储这些子问题的解以避免重复计算,从而提高算法的效率。动态规划通常用于具有重叠子问题和最优子结构性质的问题。

动态规划的基本步骤

  1. 定义状态: 确定一个数组(或其他数据结构)来存储子问题的解。这个数组的每个元素代表一个子问题的解。
  2. 状态转移方程: 找到子问题之间的关系,定义一个递归关系(状态转移方程)来表示大问题和小问题之间的关系。
  3. 初始化: 确定初始条件,即基础子问题的解。
  4. 计算顺序: 通常是自底向上(从子问题到原问题)计算所有子问题的解。

示例1

硬币问题

  • 你有三种硬币,分别面值2元、5元和7元的硬币组合起来正好付清,不需要对方找钱,每种硬币都有足够多,买一本书需要27元,如何用最少?
  1. 定义状态:

    虽然不知道最优策略是什么,但是最优策略肯定是有 k k k 枚硬币, a 1 , a 2 , … a n a_1,a_2,… a_n a1,a2,an 加起来面值为27,所以一定存在有最后一枚硬币: a k a_k ak 。除了这枚硬币,前面硬币的面值加起来是 27 − a k 27- a_k 27ak
    在这里插入图片描述
    子问题:

    • 最少用多少枚硬币可以拼出 27 − a k 27- a_k 27ak
    • 原问题是最少用多少枚硬币可以拼出 27
    • 我们将原问题可以转化成一个规模更小的子问题: 27 − a k 27- a_k 27ak
    • 状态:我们可以设状态 f ( x )=最少用多少枚硬币拼出 x
  2. 状态转移方程:
    在这里插入图片描述

  3. 初始化:

    初始条件: f [ 0 ] = 0 f[0]=0 f[0]=0

  4. 计算顺序:

    计算 f [ 0 ] , f [ 1 ] , f [ 2 ] , . . . f [ x ] f[0],f[1],f[2],...f[x] f[0],f[1],f[2],...f[x]

    当计算到 f [ x ] f[x] f[x] 时, f [ x − 2 ] , f [ x − 5 ] , f [ x − 7 ] f[x-2],f[x-5],f[x-7] f[x2],f[x5],f[x7] 都已经算过了。

示例2

背包问题

  • 给定 n n n 个物品,每个物品有一个重量 w i w_i wi 和一个价值 v i v_i vi。给定一个背包的最大承重 W W W,求解如何选择物品放入背包,使得在不超过最大承重的前提下,背包中的物品总价值最大。
  1. 定义状态:

    d p [ i ] [ j ] dp[i][j] dp[i][j]表示前 i i i 件物品放入容量为 j j j 的背包中所获得的最大价值

  2. 状态转移方程:

    对于第 i i i 件物品,可以选择放或不放

    如果不放,那么 d p [ i ] [ j ] = d p [ i − 1 ] [ j ] dp[i][j]=dp[i-1][j] dp[i][j]=dp[i1][j]
    如果放,那么 d p [ i ] [ j ] = d p [ i − 1 ] [ j − w i ] + v i dp[i][j]=dp[i-1][j-w_i]+v_i dp[i][j]=dp[i1][jwi]+vi

    选择获得最大价值的情况,即 d p [ i ] [ j ] = m a x ( d p [ i − 1 ] [ j ] , d p [ i − 1 ] [ j − w i ] + v i ) dp[i][j]=max(dp[i-1][j],dp[i-1][j-w_i]+v_i) dp[i][j]=max(dp[i1][j],dp[i1][jwi]+vi)

  3. 初始化:

    初始条件:

    d p [ 0 ] [ 0 ] = 0 dp[0][0]=0 dp[0][0]=0,将前 0 个物品放入容量为 0 的背包中能获得的最大价值为 0

    如果容量为 0,则无法放入任何物品, d p [ i ] [ 0 ] = 0 dp[i][0]=0 dp[i][0]=0

    如果没有物品可选,则无法放入任何物品, d p [ 0 ] [ j ] = 0 dp[0][j]=0 dp[0][j]=0

  4. 计算顺序:

    从第一个物品开始,求解到 n n n 最终, d p [ n ] [ W ] dp[n][W] dp[n][W] 即为问题的解

三、代码实现----Matlab

1.示例1

matlab">clear;clc
n = input('请输入要拼的金额:') + 1;
res = coinChange(n);
disp(['需要' int2str(res) '枚硬币'])
matlab">function res =  coinChange(n)dp = ones(n,1) * +inf;dp(1) = 0;    % 要拼出0块钱,需要0枚硬币for i = 2:nif (i >= 3)dp(i) = min(dp(i),dp(i-2) + 1);           endif (i >= 6)dp(i) = min(dp(i),dp(i-5) + 1); endif (i >= 8)dp(i) = min(dp(i),dp(i-7) + 1);endendif dp(n) ~= +infres =  dp(n);elseres =  -1;end
end

运行结果:

在这里插入图片描述

2.示例2

matlab">clear;clc
c = input('请输入背包的容量:');
weight = input('请输入每件物品的重量:');
value = input('请输入每件物品的价值:');
res = bag_value(c,weight,value);
disp(['最大价值为:' int2str(res)])
matlab">function res = bag_value(c,w,v)   % c是背包容量,w是每件物品的重量,v是每件物品的价值n = length(w);  % n代表有多少件物品dp = zeros(n+1,c+1);for i = 2:n+1     % 第i-1个物品for j = 2:c+1   % j-1是容量if j-1 < w(i-1)      % 背包容量小于当前物品重量,不能选择当前物品dp(i,j) = dp(i-1,j);else               % 能选择当前物品,要选择价值更大的方案dp(i,j) = max(dp(i-1,j),dp(i-1,j-w(i-1))+v(i-1));endendendres = dp(n+1,c+1);
end

运行结果:

在这里插入图片描述
在这里插入图片描述

python_137">四、代码实现----python

1.示例1

python"># 硬币问题
def coinChange(n):dp = [float('inf')] * (n + 1)dp[0] = 0    # 要拼出0块钱,需要0枚硬币for i in range (1,n + 1):if (i >= 2):dp[i] = min(dp[i],dp[i-2]+1)if (i >= 5):dp[i] = min(dp[i],dp[i-5]+1)if (i >= 7):dp[i] = min(dp[i],dp[i-7]+1)if dp[n] != float('inf'):return dp[n]else:return -1n = int(input("请输入要拼的金额:"))
print("要拼的金额", n,"元")
print("需要", coinChange(n),"枚硬币")

运行结果:

在这里插入图片描述

2.示例2

python"># 背包问题
def bag_value(c,w,v):n = len(w)dp = [[0 for j in range(c + 1)] for i in range(n+1)]   # 初始化动态规划数组for i in range(1,n + 1):for j in range(1,c+1):  if j < w[i-1]:      # 背包容量小于当前物品重量,不能选择当前物品dp[i][j] = dp[i-1][j]else:               # 能选择当前物品,要选择价值更大的方案dp[i][j] = max(dp[i-1][j],dp[i-1][j-w[i-1]]+v[i-1])return dp[n][c]
c = int(input("请输入背包的容量:"))
weight = input("请输入每件物品的重量,用逗号隔开:")
value = input("请输入每件物品的价值,用逗号隔开:")
w = [int(x) for x in weight.split(',')]
v = [int(x) for x in value.split(',')]
print("背包的容量:",c)
print("每件物品的重量:",w)
print("每件物品的价值:",v)
print("最大价值为:",bag_value(c,w,v))

运行结果:

在这里插入图片描述

总结

本文介绍了动态规划,并通过典型示例建立模型,分别使用Matlab和python进行代码编写。


http://www.ppmy.cn/devtools/93956.html

相关文章

Element学习(axios异步加载数据、案例操作)(5)

1、这次学习的是上次还未完成好的恶element案例&#xff0c;对列表数据的异步加载&#xff0c;并渲染展示。 ——>axios来发送异步请求 &#xff08;1&#xff09; &#xff08;2&#xff09;在vue当中安装axios &#xff08;注意在当前的项目目录&#xff0c;并且安装完之后…

JavaSE

1.Pattern类和 Matcher类 1.Pattern类型 1.1简介&#xff1a; 因为正则表达式只能做一些简单的校验工作&#xff0c;像要做进一步复杂的工作&#xff0c;需要使用Pattern类和 Matcher类。 字符串在真正的校验过程中&#xff0c;实际上底层维护了一个pattern对象&#xff0c…

STL list的主要接口模拟实现

STL-list是什么 STL里面的list本质上就是一个双向带头循环链表,如果不知道什么是双链表的话可以去看看这篇文章双链表 就像下面这种C语言双链表结构 只不过在这个原有的基础之上添加了增删查改的功能&#xff0c;让他变得更高级更实用 相当于把这个list封装了一遍&#xff0…

8.12-基于gtids的主从复制搭建+lvs

一、LVS 1.角色 主机名ip地址功能web01192.168.2.101rsweb02192.168.2.102realserveenat内网:192.168.2.103 外网:192.168.2.120directorserver,ntpdns192.168.2.105dns 2..web服务器 [rootweb01 ~]# yum -y install nginx ​ [rootweb01 ~]# echo "web01" > …

RabbitMq的事务机制

RabbitMQ中与事务机制有关的方法有三个&#xff1a;txSelect(), txCommit()以及txRollback(), txSelect用于将当前channel设置成transaction模式&#xff0c;txCommit用于提交事务&#xff0c;txRollback用于回滚事务&#xff0c;在通过txSelect开启事务之后&#xff0c;我们便…

Java中的人机交互(HCI):构建交互式应用程序

人机交互&#xff08;Human-Computer Interaction, HCI&#xff09;是研究人类与计算机系统之间交互的学科。在Java编程中&#xff0c;HCI不仅涉及用户界面的设计&#xff0c;还包括用户体验的优化、交互技术的实现以及用户输入的处理。本文将深入探讨如何在Java中实现高效的人…

学习STM32(2)--STM32单片机GPIO应用

目录 1 引 言 2 实验目的 3 实验内容 3.1掌握STM32F103的GPIO控制 3.1.1 GPIO的分组 3.1.2 GPIO的常用功能 3.1.3 STM32单片机GPIO位结构 3.1.4 STM32单片机GPIO工作模式 3.1.5 STM32的GPIO 输出-点亮LED编程要点 使用GPIO时&#xff0c;按下面步骤进行&#xff1…

【SpringBoot 属性加载机制】

SpringBoot 属性加载 一个 SpringBoot 应用的配置属性可以有多种不同的来源, 比如可以来自操作系统的环境变量, 比如可以来自 application.yaml 文件; 每一种不同的属性来源, 都会被 SpringBoot 封装成一个PropertySource对象, 保存在 Environment 对象的 PropertySources 类型…