动态规划-投资问题

1. 投资问题建模

1.1 问题:

m元钱,n项投资,fi(x):将x元投入第i个项目的效益 (题目会给)求使得总效益最大的投资方案

1.2 建模

问题的解:向量<x1,x2,…,xn>
xi 的意思是:投给项目i的钱数
目标函数:max{f1(x1) + f2(x2) + … + fn(xn)}
约束条件:x1 + x2 + … + xn = m

1.3 动态规划算法

整体思想:知道给前n-1个项目如何最大效益投资之后,再决定如何投第n个项目

1.3.1 参数设定及运算顺序

  • 设定参数k和参数x
    k: 考虑对项目1,2,…,k的投资
    x:投资总钱数不超过x

那么我们就是要计算 k = n 的时候,x = m的时候,让效益最大

  • 为了子问题能够被后面的大的子问题重复利用,我们要确定子问题的计算顺序:从只投资一个项目,到投资n个项目;对于投资的这么多项目,钱数从0到m

1.3.2 优化函数的递推方程

设定函数Fk(x)x元钱投给前k个项目最大效益
递推方程为:

  • Fk(x) = max{fk(xk) + Fk-1(x - xk)}
    • 即:
      投资前k个项目不超过x元钱最大效益 = 拿xk元钱投资第k个项目加上投资前k-1个项目该前面k-1个项目的钱不超过x - xk
  • F1(x) = f1(x)

1.3.3 实例

在这里插入图片描述

  • k = 1 时
    F1(1) = f1(1) = 11
    F1(2) = f1(2) = 12
    F1(3) = f1(3) = 13
    F1(4) = f1(4) = 14
    F1(5) = f1(5) = 15
  • k = 2 时
    1. x = 1
      在这里插入图片描述
      注意:这里省略了一些数学项,图上容易误导,实际上按照算法的思想应该为:F2(1) = max{f2(1) + F1(0),f2(0) + F1(1)},而省略的那些项就为0,所以算法里也直接没写,备忘录也没有写;下面的图一样省略了
    2. x = 2
      在这里插入图片描述
      • 按照这个计算顺序也刚好可以验证:可以 重复利用前面子问题的结果
    3. x = 3
      在这里插入图片描述
    4. 类似计算F2(4) = 21,F2(5) = 26
  • k = 3
    1. x = 1
    2. x = 4
      F3(4) = max{f3(4) + F2(0),f3(3) + F2(1),f3(2) + F2(2),f3(1) + F2(3),f3(0) + F2(4)}
1.3.3.1 备忘录与解

在这里插入图片描述

  • xk(x) 的值代表此时给第k个项目投了多少钱
    • 比如表格中x2(2) = 0 代表当 k = 2,x = 2时,给最后一个项目投了0元钱

求解
先从右下角开始求

  1. x5 = 1x4 = 1,第4个项目投1万元
    在这里插入图片描述

  2. 这时x3(5 - 1) = x3(4),看表格中 k = 3,x = 4
    在这里插入图片描述
    此时x3(4) = 3,也就是给第3个项目投3万元

  3. 求出
    在这里插入图片描述

1.3.4 时间复杂度分析

通过递推方程分析
在这里插入图片描述
Fk(x) 要计算x + 1次加法、x次比较

在这里插入图片描述
W(n) = O(nm2)

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
动态规划是一种常用的解决优化问题的方法,可以用来解决投资问题。在投资问题中,我们需要在给定的一组投资选项中选择最佳的投资组合,以最大化收益或者最小化风险。 动态规划解决投资问题的一般步骤如下: 1. 定义状态:首先需要定义问题的状态。在投资问题中,状态可以表示为投资的时间点、可选的投资选项等。 2. 定义状态转移方程:根据问题的特点,定义状态之间的转移关系。在投资问题中,状态转移方程可以表示为当前时间点的最优投资收益与前一个时间点的最优投资收益之间的关系。 3. 初始化:初始化初始状态,即第一个时间点的状态。 4. 递推计算:根据状态转移方程,逐步计算出每个时间点的最优投资收益。 5. 回溯求解:根据计算得到的最优投资收益,回溯找到对应的最优投资组合。 下面是一个简单的例子来说明动态规划如何实现投资问题: 假设有3个投资选项,分别是股票、债券和房地产。每个选项在不同时间点的收益如下表所示: | 时间点 | 股票 | 债券 | 房地产 | |-------|------|------|--------| | 1 | 10% | 5% | 2% | | 2 | 5% | 3% | 8% | | 3 | 8% | 2% | 6% | 我们的目标是在每个时间点选择一个投资选项,使得最终的收益最大化。 根据上述步骤,我们可以进行如下计算: 1. 定义状态:我们可以定义状态为时间点和可选的投资选项。 2. 定义状态转移方程:假设dp[i][j]表示在第i个时间点选择第j个投资选项的最优投资收益,则状态转移方程可以表示为dp[i][j] = max(dp[i-1][k] * 收益率[i][j]),其中k表示前一个时间点的投资选项。 3. 初始化:初始化第一个时间点的状态,即dp[j] = 收益率[j]。 4. 递推计算:根据状态转移方程,逐步计算出每个时间点的最优投资收益。 5. 回溯求解:根据计算得到的最优投资收益,回溯找到对应的最优投资组合。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值