代码急转弯——什么是动态规划

10 篇文章 0 订阅
3 篇文章 0 订阅

代码急转弯——动态规划最简描述


动态规划是解决计算问题的基本方法。它与递归非常相似,但又有所不同。下面以斐波那契哦数列的计算来说明动态规划的基本思想。

1、递归

斐波那契数列指的是
x 0 = 1 x_0=1 x0=1
x 1 = 1 x_1=1 x1=1
x n = x n − 1 + x n − 2 , n = 3 , 4 , 5 , . . . x_n=x_{n-1}+x_{n-2}, n=3,4,5,... xn=xn1+xn2,n=3,4,5,...
如果果要计算 f(10),需要先计算出 f(8) 和 f(9),然后就能由 f(8)+f(9) 计算得到 f(10) 了。

def feibonaci(n):
    if n == 1:
        return 1
    if n == 2:
        return 1
    return feibonaci(n-1) + feibonaci(n-2)

print(feibonaci(30))

2、备忘录

递归代码有计算效率的问题。计算 f(10) 的时候,需要先计算 f(8) 和 f(9),为了计算 f(9),还必须计算 f(7) 和 f(8),显然,计算了两遍 f(8)。类似地,为了计算 f(7) 和 f(8),又得多次计算 f(6)。为了提高计算效率,可以采用备忘录算法,在第一次计算出 f(6) 时,将它存储起来,当需要再次计算 f(6),以查表来替代计算,来换取更高的效率。

hs = {}
def feibonaci(n):
    if n == 1:
        return 1
    if n == 2:
        return 1
    if n in hs:
        return hs[n]
    res = feibonaci(n-1) + feibonaci(n-2)
    hs[n] = res
    return res

print(feibonaci(30))

3、计算顺序

为递归添上了备忘录,距离动态规划还有一步之遥。毕竟,用hs存储历史信息要花费不小的空间,能不能缩减所要的空间?就计算过程来看,hs[1]只用于计算 f(2) 和 f(3),而与计算 f(4)、f(5)等无关。所以,调整一下计算顺序,按照 n 从小到大的顺序来计算 f(n),就能减少hs占用的空间。

def feibonaci(n):
    if n == 1:
        return 1
    if n == 2:
        return 1
    
    hs1 = 1
    hs2 = 1
    for i in range(3, n):
        hs1, hs2 = hs2, hs1 + hs2
    
    return hs1 + hs2

print(feibonaci(30))

当然,不是所有的问题都能如此简化,但是消除递归依旧能提高运行效率。
总结下,动态规划就是大事化小,小事化了,用查表替代计算,改变顺序消除递归。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
FlexSim是一款强大的离散事件模拟软件,主要用于工业流程设计和优化。在FlexSim中创建连续急转弯(通常指的是模拟物料在管道或输送带上的流动,遇到急转弯时的行为)涉及到模型的几何设置、流体动力学模拟以及运动控制。 以下是创建连续急弯的基本步骤和可能涉及到的部分代码: 1. **模型构建**: - 新建或打开项目,选择"Create New Object" -> "System" -> "Pipe",然后在场景中拖拽并连接形成管道。 - 右键点击管道,选择"Edit Properties",在"Profile"部分设置急转弯角度。 2. **流体动力学设置**: - 在"Flow Dynamics"选项卡下,启用"Constitutive Model",选择适合的流体模型,如Newtonian或Laminar。 - 设置适当的流速和压力参数。 3. **运动控制**: - 使用"Motion Control"模块,例如设置"Follow Path"行为,确保物料跟随管道路径。 - 可能会用到的代码片段(假设使用Python脚本语言): ```python from FlexSimSDK import * pipe = simGetObject("Pipe01") # 获取管道对象 motion = pipe.getMotion() # 获取运动控制器 motion.setFollowPath(True) # 启用沿路径跟随 ``` 4. **仿真设置**: - 配置好边界条件和初始条件,比如物料入口和出口。 5. **运行模拟**: - 确保所有设置无误后,开始或运行模拟,观察物料在急转弯处的行为。 相关问题: 1. FlexSim支持哪些流体动力学模型? 2. 如何调整物料在急转弯处的流速和压力? 3. 在FlexSim中如何编写和执行自定义的Python脚本?

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值