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

news2024/11/13 21:22:13

文章目录

  • 前言
  • 一、动态规划
    • 动态规划的基本步骤
    • 示例1
    • 示例2
  • 三、代码实现----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

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

运行结果:

在这里插入图片描述

2.示例2

clear;clc
c = input('请输入背包的容量:');
weight = input('请输入每件物品的重量:');
value = input('请输入每件物品的价值:');
res = bag_value(c,weight,value);
disp(['最大价值为:' int2str(res)])
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));
            end
        end
    end
    res = dp(n+1,c+1);
end

运行结果:

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

四、代码实现----python

1.示例1

# 硬币问题
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 -1
    
n = int(input("请输入要拼的金额:"))
print("要拼的金额", n,"元")
print("需要", coinChange(n),"枚硬币")

运行结果:

在这里插入图片描述

2.示例2

# 背包问题
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.coloradmin.cn/o/1997099.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Spring AOP 原理——代理模式

目录 一、代理模式 1.1 静态代理 1.2 动态代理 1.2.1 JDK动态代理 1.2.2 CGLIB动态代理 Spring AOP 是基于动态代理来实现AOP的。 一、代理模式 代理模式, 也叫委托模式。该模式是为其他对象提供⼀种代理以控制对这个对象的访问。它的作用就是通过提供一个代理类&#…

50 mysql 的 “where 1 = 1“ 的优化处理

前言 问题是来自于 chinaunix 问题 ”mysql查询后面加 where 1 1 影响效率吗?” mysql 中在 java 代码中我们经常会使用到 ”where 1 1 and username ‘jerry’ ” 之类的条件 然后 我们这里 来看一下 “where 1 1” 的相关处理 where 条件在 select_lex, QUP_shared…

RPC Dubbo面试题汇总

文章目录 RPCRPC 是什么?RPC的原理是什么&#xff1f;有哪些常见的 RPC 框架&#xff1f;RPC和HTTP的区别 Dubbo什么是Dubbo&#xff1f;为什么要用Dubbo?Dubbo 的核心组件&#xff1f;Dubbo 支持哪些序列化方式呢&#xff1f;Dubbo 集群提供了哪些负载均衡策略&#xff1f;D…

Java中等题-交错字符串(力扣)

给定三个字符串 s1、s2、s3&#xff0c;请你帮忙验证 s3 是否是由 s1 和 s2 交错 组成的。 两个字符串 s 和 t 交错 的定义与过程如下&#xff0c;其中每个字符串都会被分割成若干 非空 子字符串 &#xff1a; s s1 s2 ... snt t1 t2 ... tm|n - m| < 1交错 是…

批发行业进销存-手持打单机办理会员 源码CyberWinApp-SAAS 本地化及未来之窗行业应用跨平台架构

一、手持终端办理会员必备条件 1.手持机的有点可以打印单据开单 2.手持通过接口将数据传到进销存 3.需要支持刷卡&#xff0c;感应身份证&#xff0c;各种卡 4.考虑到网络和工厂&#xff0c;向下无网络环境&#xff0c;数据需要放本地 二、会员办理界面代码 <form id&…

集合练习专题

第一题 public static void main(String[] args) {ArrayList arrayList new ArrayList<>();arrayList.add(new News(" 新冠确诊病例超千万&#xff0c;数百万印度教信徒赴恒河\"圣浴\"引民众担忧"));arrayList.add(new News("男子突然想起2个…

EasyExcel-读Excel-不创建对象的读-合并单元格的处理

EasyExcel官方文档 这几天需要读取excel的内容&#xff0c;但是excel中存在多个sheet页&#xff0c;每个sheet页的标题不同&#xff0c;数据不同&#xff0c;而且多个excel文件。决定使用easyexcel处理&#xff0c;但是感觉无法使用对象接收exceld的数据&#xff0c;所以决定使…

使用 Node.js 模拟执行 JavaScript

准备工作 正确安装好 Node.js ,安装好之后&#xff0c;能正常使用 node 和 npm 两个命令 模拟执行 关于案例分析 写文章-CSDN创作中心 这里就不做分析了&#xff0c;直接使用 我们的目的是&#xff1a; 使用 node.js 加载 Crypto 库&#xff0c; 并执行 getToken 方法 …

Linux驱动开发基础(LED驱动)

所学来自百问网 目录 1. LED原理 2. 普适的GPIO引脚操作方法 2.1 GPIO模块的一般结构 2.2 GPIO框图 2.3 寄存器的操作 2.3.1 一般的操作方式 2.3.2 高效的操作方式 3. 基于IMX6UL_6ULL的GPIO操作方法 3.1 GPIO框图 3.2 CCM 3.3 IOMUXC 3.4 GPIO模块内部 3.5 读写…

软件评审-需求评审、设计评审、编码评审、测试评审(原件)

1.需求规格说明评审报告 2.系统设计评审报告 3.编码与测试评审报告 软件全套资料部分文档清单&#xff1a; 工作安排任务书&#xff0c;可行性分析报告&#xff0c;立项申请审批表&#xff0c;产品需求规格说明书&#xff0c;需求调研计划&#xff0c;用户需求调查单&#xff0…

工业大数据来自哪里?大数据技术如何助力制造企业数字化转型?

信息技术的迅猛发展正在重塑我们的世界&#xff0c;不仅改变了技术本身&#xff0c;也深刻影响了全球市场和人们的工作与生活方式。在工业生产这一关键领域&#xff0c;高性价比、长续航的微型传感器的诞生&#xff0c;以及物联网等新一代网络技术的兴起&#xff0c;正赋予无数…

【C语言篇】字符和字符串以及内存函数的详细介绍与模拟实现(上篇)

文章目录 字符函数字符输入输出函数字符输入函数字符输出函数 字符分类函数字符转换函数 字符串函数字符串输入输出函数字符串输入函数字符串输出函数 strlen函数的使用和模拟实现strcpy函数的使用和模拟实现strcat函数的使用和模拟实现strcmp函数的使用和模拟实现strncpy函数的…

Python基于TensorFlow实现卷积神经网络-双向长短时记忆循环神经网络分类模型(CNN-BiLSTM分类算法)项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 随着人工智能技术的快速发展&#xff0c;深度学习已经成为处理复杂数据集的关键工具之一。其中&#x…

【Kubernetes】k8s集群资源调度

目录 一、k8s的List-Watch机制 二、scheduler的调度过程 三、指定节点调度Pod 1.通过nodeName调度Pod 2.通过节点标签选择器调度Pod 3.通过亲和性调度Pod 1&#xff09;节点亲和性 2&#xff09;Pod 亲和性 四、污点(Taint) 和 容忍(Tolerations) 1.污点(Taint) 2.…

靶机:DC-2

一、信息收集 1、主机发现 nmap 192.168.236.0/24 2、端口扫描 nmap 192.168.236.130 -p- -A 二、漏洞探测 访问192.168.236.130&#xff0c;URL重定向&#xff0c;在本地hosts文件中添加192.168.236.130 dc-2 在flag1中提示cewl工具&#xff0c;kali自带&#xff0c;把密码…

进阶SpringBoot之 Web 静态资源导入

idea 创建一个 web 项目 新建 controller 包下 Java 类&#xff0c;用来查验地址是否能成功运行 package com.demo.web.controller;import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController;RestControl…

如何在linux系统上部署nginx

1&#xff09;首先去 nginx.org/download 官网下载你所需要的版本 我这里是下载的 nginx-1-23-3.tar.gz 2&#xff09;然后执行 yum -y install lrzsz 安装文件上传软件 执行 rz 选择你下载nginx的位置进行上传 yum -y install lrzsz 3&#xff09;执行 tar -zxvf nginx-1.23…

《RT-DETR》论文笔记

原文出处 [2304.08069] DETRs Beat YOLOs on Real-time Object Detection (arxiv.org)https://arxiv.org/abs/2304.08069 原文笔记 What DETRs Beat YOLOs on Real-time Object Detection 1、设计了一种高效的混合编码器&#xff0c;通过解耦尺度内交互和跨尺度融合来提高…

保障速度与安全合规的前提下,如何传文件到国外?

伴随着经济全球化&#xff0c;数据跨境活动日益频繁&#xff0c;数据出境场景越来越多&#xff0c;防范数据出境安全风险&#xff0c;保障数据依法有序自由流动成为我国关注的重要方面。涉及数据出海的行业多种多样&#xff0c;像跨国运营、全球研发、金融服务等领域的企业都涉…

音乐制作工具:Studio One 6 (WinMac)

Studio One 6是由PreSonus公司开发的一款专业音乐制作软件&#xff0c;它提供了丰富的功能&#xff0c;以满足音乐创作、录制、混音和母带处理的需求。 Studio One 6以其人性化的用户界面、强大的音频性能、以及丰富的功能&#xff0c;成为了音乐制作领域中一个非常受欢迎的选择…