当前位置:首页 » 操作系统 » 规划开销算法

规划开销算法

发布时间: 2022-04-26 18:52:35

① 家庭开销如何规划

相信很多人在平常的家中,都是由女人管账,而男人基本上都不太会理财,那么对于一个家庭里面的开销肯定是需要进行控制和规划的,想要准确控制家庭开销应该怎样做呢?其实,对于开销的控制肯定需要记账,只有把每一笔开销和收入都记下来,这样子才能够更好的保证我们有一个合理的调控,才不会出现乱用钱的情况,特别是对于一些家中相对来说,经济情况不是特别好的人,更需要进行一定的规划,这样子才能够避免出现大手大脚之后过得很狼狈的情况,相信很多学生在学校期间也会出现这样子的现象,在刚开始得到生活费的时候可能会比较浪费,然后到后面可能就只能吃土。

所以,这也足以看出来,大家在平常的生活中进行理财和规划的重要性,对待钱财一定要进行一定的控制,不能说有钱的时候就随意乱用,有钱的时候就要想到没钱的日子,该花的花,不该花的时候就尽量节省一点。

很多人在家中可能也会采用记账的方式,这相对来说也是比较好的合理规划每一笔开销,这样子才能够更好地帮助我们对自己当前经济状况的一种了解,才能够更好的控制住自己的花销。

总的说来,一个家庭的开销肯定是需要进行控制和规划,这样子才能更好地保证正常运行,不然很有可能就会导致一段时间有钱花一段时间没钱花的情况,这样子肯定是不行的。

② 日常生活中,你是如何规划经济支出的

作为一名上班族,放工资的第一件事就是及时处理好这笔钱,我是这样规划的。
计算从发工资这一刻开始到下一次发工资,自己明确知道的要花的哪些钱,计算得出预估,把这个预估加上生活费预算,这就是这个月留在手边的生活开销费用;剩下的前,我会把四分之三转到固定的银行卡上,这张卡不在我身边也没有开手机银行,保证了定期定额存钱,把余下的四分之一作为梦想金放如某金融平台,能赚取一些存钱收益,同时也为突发状况急需用钱提供保障,但这笔钱不是特殊情况绝对不动。
因为上班,我只能保证储蓄而不敢去理财,这个是未来要学习提升的地方。

③ 在日常的生活中,我们究竟应该如何规划自己的生活花销

在我们的日常生活中,在很多地方都是需要花费的,但我们挣得钱是有限的,所以我们要合理的规划自己日常的生活花费,把钱用在刀刃上是我们追逐的一个目标。一个会规划自己生活的人一定是一个精致的人,而且他也会在生活中顺利一些,有规划后遇到一些紧急事件我们也有办法对抗,也算是为自己生活的旅行保驾护航。那么我们应该如何规划生活中的花费呢?下面就由我来给大家分几个方面分析一下。

首先我们应该知道自己一个月会有多少钱的收入,把收入的百分之五十是要用在家里的开销,比如需要还的车贷房贷,加上家里人一个月的吃饭和日用品开销,还有需要买一些衣服等等,这些都可以统称为日常开销,这些日常开销最合理的占比是总收入的百分之五十,因为保证一个家庭最基本生活就是由这部分钱来完成的,所以它占到了我们花销的最大一块。

以上就是我对自己生活花销的一个规划,在保证家庭稳定的情况下,去做一些理财是我的推荐。

④ 怎么合理规划旅行预算

旅游预算需要涵盖旅行中的衣、食、住、行、玩、购以及不可预见的各类开支。参考以下步骤,能够帮你更轻松合理地规划旅行预算。

每年制定一份年度旅行总预算。在你每年制定开支预算的时候,根据自己或家庭的旅游需要,譬如说人数、次数、出游的日期、目的地等,预留一部分款项作为旅游开支。如果只是初步有出门旅游计划的话,可以根据往年的旅游开支预留一部分金额作为未来旅游开支。

如果是自助游,则需要在细节上精打细算。根据要去的国家、城市、景点,综合交通、住宿、门票、租车、购物等列出费用清单,算出大致的旅行费用。

此外还应该预备旅游应急款项,出门在外总有些意料之外的开销,大家可预留整体旅游费用的5%-10%作为备用资金。将这些费用加总起来,就是你的旅游预算总金额。

⑤ 如何规划家庭开支

每个工薪家庭每月总有固定的收入,如何将每月的收入做好支出的计划,就是理财至关重要的一环。首先,除了留下自己必要的零花钱外,将剩余部分全部拿出作为全部家庭基础基金;其次,列举出当月的基础开支,如水、电、燃气、暖气等费用;列出当月生活费用开支(这里主要指伙食费);再留少部分其他开支,如换季需添的衣物等(这个当然不是每月都要支出,但是每月都要有的)。列出开支后,拿出33个信封,第一个信封封基础开支,不到用时不要动这份钱;第二个信封封那份其他开支,动不动用这个当然视情况而定,这个月不用,下个月自然就可以大举购物一番了;其余的三十一个信封当然是封平均每天的生活费了,每天只用当天的,用不完可留到第二天用,用超了,就只好第二天少用喽!

⑥ 动态规划算法(pascal)

在计算够不够开销时
20%这个数据是废的
你可以先减去预算再考虑存多少钱
比如手头钱的数目为a
预算为b
存在妈妈处的钱为c
可以先从a中减去b
然后c就等于c+a
div
100
*100
var

begin
a:=0;
c:=0;
bo:=true;
for
i:=1
to
12
do
begin
read(b[i]);
inc(a,300);
if
a<b[i]
then
begin
writeln(i);
bo:=false;
break;
end
else
begin
c:=c+a
div
100*100;
dec(a,b[i]);
a:=a
mod
100;
end;
end;
if
bo
then
writeln(a+c+c
div
5);
end.

⑦ 三分钟就能掌握家庭资产配置

家庭理财投资时,大家脑海中会出现一个声音,鸡蛋不能放到一个篮子,需要分散投资,降低风险。

那如何配置资金呢?

投资到哪些不同的资产类别上呢?

每个资产配置的比例又是多少呢?

今天一一妈妈就给大家介绍一个比较通用的工具:标准普尔家庭资产象限图。

我做了一个思维导图,最近迷上思维导图了,简单,条理清晰,看看我初学的思维导图运用的如何,羞羞哒的展示来了


现在分别介绍一下:

第一个账户:日常开销账户,我称之为消费的钱

这个标准普尔家庭象限,给到的占比是10%,一般用于家庭的日常开销。


主要哦,就这一部分,咱们也都可以灵活运用金融的工具:信用卡50天的免息额度,直接绑定微信上or支付宝上,然后保持你银行现金的部分投资入你的投资金融账户,比如余额宝,理财通类对接货币基金的部分。


这个账户的主要目的了,就是保障我们日常现金流的正常开销,衣服,尿不湿,计划中的短期旅行。

这部分的规划重要,因为在我的理财咨询过程中,发现这部分也是我们最容易出现占比不合理的部分:

要么过多,不去打理,而积攒在银行活期,无法让资金产生价值。

要么过少,当有合适投资机会出现,但投资产品又有门槛的时候,发现往往没有对应的资金。

要么就是投资的时候,总是惦记投资不能投资长期,而常常在短期项目中倒腾来去。

那这部分具体实操如何计算呢,很简单,算一下平均每个月的开支是多少,然后乘以3或者6,也就是保障为自己准备一个3-6个月的日常应急金。

第二个账户:杠杆账户,也就是家庭风险保障资金准备

占比20%,所谓杠杆,就是小资金撬动大资金,为将来不确定的突发事件,保驾护航。

这个账户呢,保障家庭成员储蓄意外事故,重大疾病,有足够的钱来保命的同时,不影响家庭其他成员生活品质。这个账户主要是意外和重大疾病,商业保险,撬动杠杆,投入成本小,保障大。

家庭购买保险的顺序,我之前文章中也多次提到:

意外-意外医疗-住院医疗-重大疾病-养老金及专项保险基金

那保费支出如何计算呢:

这部分给到占比20%,我一般建议如果没有任何保险的家庭,从年收入的10%占比支出,初期接受起来更加容易,因为往往大家心理账户总是给不到20%这个投入比例。

那么具体多少保额多少呢?

也有一种流行的简单算法:你当年的年收入*你的剩余工作年限+你当前的负债资产总额。

好多朋友说,这到底有什么用呢,钱都交给保险公司呢?

是的,一一妈妈要说,平常确实没什么卵用,但是关键时刻,紧急事件,只有它才能保障你不会为了急用钱,卖房卖车,砸锅卖铁,卖掉你拿熊抱的股票,而到处借钱。

第三个账户:投资收益账户,生钱账户

标准普尔给出的占比是30%,整体家庭创造收益的账户。可以适当承担部分风险。这个账户了,可以从两个方面进行解读。

一是继续投资你擅长的投资生钱方式,比如做生意,大部分这个投资收益账户占比较高,生钱之道,在过往传统的经济,很多生意人都会继续用这种方式赚钱,不过现在随着科技变革加速,传统经济往往面临转型,所以现在在以为投资自己的传统领域有可能回报缩水。

第二种方式,就是通过投资进行资产的保值,这部分可能包括股权,股票基金,或者保值的房产,不过第二部分要和我们的认知相结合,需要花时间了解,因为这个领域并不一定是你擅长的,还有就是把专业的事儿交给专业的人去做。

第四个账户:长期收益账户,家庭目标计划,为教育准备,长期养老准备

这里三点需要强调:

1.规划要趁早

2.时间的馈赠

规划要趁早的意思是,自己的养老规划,还是的教育规划,提前进行安排。

时间的馈赠,是开始准备了,那么最好做长期的打算,不到万不得已,不要随意取出花掉。

养老金说是要存,但是经常被买车或者装修用掉了。

每年或每月有固定的钱进入这个账户,才能积少成多,不然就随手花掉了。

要受法律保护,要和企业资产相隔离,不用于抵债。

要真正做到老有所依,老有所养,这个账户的设置就尤为重要了,不可或缺,也是对社保养老不足的补足。

需要注意的是,家庭资产象限图的关键点是平衡,当我们发现我们没有钱准备保命的钱或者养老的钱,这就说明我们家庭资产配置是不平衡的、不科学的。这四个账户的配置也是符合木桶原理的,也就是说整个资产配置的有效性是由最短的那根木板决定的。因此,每一个账户配置都是非常重要的,不能忽视任何一个哦。

介绍完这个,比较流行,也相对科学的家庭资产的科学分配比例,不过一一妈妈最后在说说,其实理性的模型分配,是建立在我们大家内心都是理性思考的前提,不够我们人嘛,是感情动物,内心是会受情绪的波动的,所以理财投资,理的看似是钱,但是实在理的是心,投资工具,交易的对手,最终是要克服我们内心的恐惧和贪婪,这样学习的金融工具才会更好的发挥它的技能,

所以,说到底,先理思维,在步步入门,灵活运用实战工具,说道工具,下期给大家讲讲家庭资产配置中用的也比较多的:美林时钟。

今天,安啦


网络问咖入驻大咖:汪凡

金融狗,两个熊孩子的妈妈,和宝宝一块萌翻生活,理财理生活,等你和我分享你的心情理财故事

坚持原创的一一妈妈,金牛座,金融狗,若你喜欢我的文字,欢迎分享给你的朋友或分享到朋友圈和微博,转载请联系作者本人获得授权。

⑧ 怎么规划花钱

你先计算每个月的工资多少,存一部分,一部分用于生活开销,一部分用于投资,如果工资比较低,也就只能够用于自己日常开销了。

⑨ 如何计划用钱

计划用钱可以按照下面的方法来:

1、首先,你需要一个账本,并且养成记 的习惯。

2、其次,你应该提前规划好钱的用途。合理地规划好资金,让你每一次花出的钱都是有的放矢,而不是月末的一笔糊涂账。通常可以把一个月的工资分成:固定开支、生活开支、社交开支、享受消费、理财支出之类

固定开支指的就是房租、保险(医社保)、给父母这类固定金额的开支。这类金额是固定且很难节省掉的,所以应该每月最先归入你的预算中。

生活开支就是饮食、话费、水电网费、交通费用等等这些每个月也必须花但金额会在一定范围里浮动且可以节约的费用。(约占22%)

社交开支顾名思义,谁没有几个朋友要聚餐要红包,所以每个月还要规划出一部分的钱在这上面。(约15%)

享受消费,女生买买书衣服鞋子包包化妆品,男生买买烟酒衣服鞋子打打台球都是享受消费,或者有人不买而把钱存下来旅游之类(8%)

理财开支,建议将一部分工资(大约10%)用来“钱生钱”,比如购买一些理财产品或者做一点投资,如果金额小又不懂投资也可以存起来,也是一种钱生钱的方式。

当然,不同生活方式在每一项的侧重和消费都是不一样的,你可以根据自己以往的消费经验来确定每一部分的预算。这也只是一种方法而已。

3、也是最重要的一点就是 坚持 。凡事贵以专贵以持,不持之以恒再好的方法也是徒劳的。

⑩ 关于动态规划算法,哪位可以讲一下自己心得体会

动态规划的特点及其应用
安徽 张辰
动态规划 阶段

动态规划是信息学竞赛中的常见算法,本文的主要内容就是分析它的特点。
文章的第一部分首先探究了动态规划的本质,因为动态规划的特点是由它的本质所决定的。第二部分从动态规划的设计和实现这两个角度分析了动态规划的多样性、模式性、技巧性这三个特点。第三部分将动态规划和递推、搜索、网络流这三个相关算法作了比较,从中探寻动态规划的一些更深层次的特点。
文章在分析动态规划的特点的同时,还根据这些特点分析了我们在解题中应该怎样利用这些特点,怎样运用动态规划。这对我们的解题实践有一定的指导意义。

动态规划是编程解题的一种重要的手段,在如今的信息学竞赛中被应用得越来越普遍。最近几年的信息学竞赛,不分大小,几乎每次都要考察到这方面的内容。因此,如何更深入地了解动态规划,从而更为有效地运用这个解题的有力武器,是一个值得深入研究的问题。
要掌握动态规划的应用技巧,就要了解它的各方面的特点。首要的,是要深入洞悉动态规划的本质。
§1动态规划的本质
动态规划是在本世纪50年代初,为了解决一类多阶段决策问题而诞生的。那么,什么样的问题被称作多阶段决策问题呢?
§1.1多阶段决策问题
说到多阶段决策问题,人们很容易举出下面这个例子。
[例1] 多段图中的最短路径问题:在下图中找出从A1到D1的最短路径。
仔细观察这个图不难发现,它有一个特点。我们将图中的点分为四类(图中的A、B、C、D),那么图中所有的边都处于相邻的两类点之间,并且都从前一类点指向后一类点。这样,图中的边就被分成了三类(AàB、BàC、CàD)。我们需要从每一类中选出一条边来,组成从A1到D1的一条路径,并且这条路径是所有这样的路径中的最短者。
从上面的这个例子中,我们可以大概地了解到什么是多阶段决策问题。更精确的定义如下:
多阶段决策过程,是指这样的一类特殊的活动过程,问题可以按时间顺序分解成若干相互联系的阶段,在每一个阶段都要做出决策,全部过程的决策是一个决策序列[1]。要使整个活动的总体效果达到最优的问题,称为多阶段决策问题。
从上述的定义中,我们可以明显地看出,这类问题有两个要素。一个是阶段,一个是决策。
§1.2阶段与状态
阶段:将所给问题的过程,按时间或空间特征分解成若干相互联系的阶段,以便按次序去求每阶段的解。常用字母k表示阶段变量。[1]
阶段是问题的属性。多阶段决策问题中通常存在着若干个阶段,如上面的例子,就有A、B、C、D这四个阶段。在一般情况下,阶段是和时间有关的;但是在很多问题(我的感觉,特别是信息学问题)中,阶段和时间是无关的。从阶段的定义中,可以看出阶段的两个特点,一是“相互联系”,二是“次序”。
阶段之间是怎样相互联系的?就是通过状态和状态转移。
状态:各阶段开始时的客观条件叫做状态。描述各阶段状态的变量称为状态变量,常用sk表示第k阶段的状态变量,状态变量sk的取值集合称为状态集合,用Sk表示。[1]
状态是阶段的属性。每个阶段通常包含若干个状态,用以描述问题发展到这个阶段时所处在的一种客观情况。在上面的例子中,行人从出发点A1走过两个阶段之后,可能出现的情况有三种,即处于C1、C2或C3点。那么第三个阶段就有三个状态S3=。
每个阶段的状态都是由以前阶段的状态以某种方式“变化”而来,这种“变化”称为状态转移(暂不定义)。上例中C3点可以从B1点过来,也可以从B2点过来,从阶段2的B1或B2状态走到阶段3的C3状态就是状态转移。状态转移是导出状态的途径,也是联系各阶段的途径。
说到这里,可以提出应用动态规划的一个重要条件。那就是将各阶段按照一定的次序排列好之后,对于某个给定的阶段状态,它以前各阶段的状态无法直接影响它未来的发展,而只能通过当前的这个状态。换句话说,每个状态都是“过去历史的一个完整总结[1]”。这就是无后效性。对这个性质,下文还将会有解释。
§1.3决策和策略
上面的阶段与状态只是多阶段决策问题的一个方面的要素,下面是另一个方面的要素——决策。
决策:当各段的状态取定以后,就可以做出不同的决定,从而确定下一阶段的状态,这种决定称为决策。表示决策的变量,称为决策变量,常用uk(sk)表示第k阶段当状态为sk时的决策变量。在实际问题中,决策变量的取值往往限制在一定范围内,我们称此范围为允许决策集合。常用Dk(sk)表示第k阶段从状态sk出发的允许决策集合。显然有uk(sk) ?Dk(sk)。[1]
决策是问题的解的属性。决策的目的就是“确定下一阶段的状态”,还是回到上例,从阶段2的B1状态出发有三条路,也就是三个决策,分别导向阶段3的C1、C2、C3三个状态,即D2(B1)=。
有了决策,我们可以定义状态转移:动态规划中本阶段的状态往往是上一阶段和上一阶段的决策结果,由第k段的状态sk和本阶段的决策uk确定第k+1段的状态sk+1的过程叫状态转移。状态转移规律的形式化表示sk+1=Tk(sk,uk)称为状态转移方程。
这样看来,似乎决策和状态转移有着某种联系。我的理解,状态转移是决策的目的,决策是状态转移的途径。
各段决策确定后,整个问题的决策序列就构成一个策略,用p1,n=表示。对每个实际问题,可供选择的策略有一定范围,称为允许策略集合,记作P1,n,使整个问题达到最有效果的策略就是最优策略。[1]
说到这里,又可以提出运用动态规划的一个前提。即这个过程的最优策略应具有这样的性质:无论初始状态及初始决策如何,对于先前决策所形成的状态而言,其以后的所有决策应构成最优策略[1]。这就是最优化原理。简言之,就是“最优策略的子策略也是最优策略”。
§1.4最优化原理与无后效性
这里,我把最优化原理定位在“运用动态规划的前提”。这是因为,是否符合最优化原理是一个问题的本质特征。对于不满足最优化原理的一个多阶段决策问题,整体上的最优策略p1,n同任何一个阶段k上的决策uk或任何一组阶段k1…k2上的子策略pk1,k2都不存在任何关系。如果要对这样的问题动态规划的话,我们从一开始所作的划分阶段等努力都将是徒劳的。
而我把无后效性定位在“应用动态规划的条件”,是因为动态规划是按次序去求每阶段的解,如果一个问题有后效性,那么这样的次序便是不合理的。但是,我们可以通过重新划分阶段,重新选定状态,或者增加状态变量的个数等手段,来是问题满足无后效性这个条件。说到底,还是要确定一个“序”。
在信息学的多阶段决策问题中,绝大部分都是能够满足最优化原理的,但它们往往会在后效性这一点上来设置障碍。所以在解题过程中,我们会特别关心“序”。对于有序的问题,就会考虑到动态规划;对于无序的问题,也会想方设法来使其有序。
§1.5最优指标函数和规划方程
最优指标函数:用于衡量所选定策略优劣的数量指标称为指标函数,最优指标函数记为fk(sk),它表示从第k段状态sk采用最优策略p*k,n到过程终止时的最佳效益值[1]。
最优指标函数其实就是我们真正关心的问题的解。在上面的例子中,f2(B1)就表示从B1点到终点D1点的最短路径长度。我们求解的最终目标就是f1(A1)。
最优指标函数的求法一般是一个从目标状态出发的递推公式,称为规划方程:

其中sk是第k段的某个状态,uk是从sk出发的允许决策集合Dk(sk)中的一个决策,Tk(sk,uk)是由sk和uk所导出的第k+1段的某个状态sk+1,g(x,uk)是定义在数值x和决策uk上的一个函数,而函数opt表示最优化,根据具体问题分别表为max或min。
,称为边界条件。
上例中的规划方程就是:

边界条件为
这里是一种从目标状态往回推的逆序求法,适用于目标状态确定的问题。在我们的信息学问题中,也有很多有着确定的初始状态。当然,对于初始状态确定的问题,我们也可以采用从初始状态出发往前推的顺序求法。事实上,这种方法对我们来说要更为直观、更易设计一些,从而更多地出现在我们的解题过程中。
我们本节所讨论的这些理论虽然不是本文的主旨,但是却对下面要说的动态规划的特点起着基础性的作用。
§2动态规划的设计与实现
上面我们讨论了动态规划的一些理论,本节我们将通过几个例子中,动态规划的设计与实现,来了解动态规划的一些特点。
§2.1动态规划的多样性
[例2] 花店橱窗布置问题(IOI99)试题见附录
本题虽然是本届IOI中较为简单的一题,但其中大有文章可作。说它简单,是因为它有序,因此我们一眼便可看出这题应该用动态规划来解决。但是,如何动态规划呢?如何划分阶段,又如何选择状态呢?
<方法1>以花束的数目来划分阶段。在这里,阶段变量k表示的就是要布置的花束数目(前k束花),状态变量sk表示第k束花所在的花瓶。而对于每一个状态sk,决策就是第k-1束花应该放在哪个花瓶,用uk表示。最优指标函数fk(sk)表示前k束花,其中第k束插在第sk个花瓶中,所能取得的最大美学值。
状态转移方程为
规划方程为
(其中A(i,j)是花束i插在花瓶j中的美学值)
边界条件 (V是花瓶总数,事实上这是一个虚拟的边界)
<方法2>以花瓶的数目来划分阶段。在这里阶段变量k表示的是要占用的花瓶数目(前k个花瓶),状态变量sk表示前k个花瓶中放了多少花。而对于任意一个状态sk,决策就是第sk束花是否放在第k个花瓶中,用变量uk=1或0来表示。最优指标函数fk(sk)表示前k个花瓶中插了sk束花,所能取得的最大美学值。
状态转移方程为
规划方程为
边界条件为
两种划分阶段的方法,引出了两种状态表示法,两种规划方式,但是却都成功地解决了问题。只不过因为决策的选择有多有少,所以算法的时间复杂度也就不同。[2]
这个例子具有很大的普遍性。有很多的多阶段决策问题都有着不止一种的阶段划分方法,因而往往就有不止一种的规划方法。有时各种方法所产生的效果是差不多的,但更多的时候,就像我们的例子一样,两种方法会在某个方面有些区别。
所以,在用动态规划解题的时候,可以多想一想是否有其它的解法。对于不同的解法,要注意比较,好的算法好在哪里,差一点的算法差在哪里。从各种不同算法的比较中,我们可以更深刻地领会动态规划的构思技巧。
§2.2动态规划的模式性
这个可能做过动态规划的人都有体会,从我们上面对动态规划的分析也可以看出来。动态规划的设计都有着一定的模式,一般要经历以下几个步骤。
划分阶段:按照问题的时间或空间特征,把问题分为若干个阶段。注意这若干个阶段一定要是有序的或者是可排序的,否则问题就无法求解。
选择状态:将问题发展到各个阶段时所处于的各种客观情况用不同的状态表示出来。当然,状态的选择要满足无后效性。
确定决策并写出状态转移方程:之所以把这两步放在一起,是因为决策和状态转移有着天然的联系,状态转移就是根据上一阶段的状态和决策来导出本阶段的状态。所以,如果我们确定了决策,状态转移方程也就写出来了。但事实上,我们常常是反过来做,根据相邻两段的各状态之间的关系来确定决策。
写出规划方程(包括边界条件):在第一部分中,我们已经给出了规划方程的通用形式化表达式。一般说来,只要阶段、状态、决策和状态转移确定了,这一步还是比较简单的。
动态规划的主要难点在于理论上的设计,一旦设计完成,实现部分就会非常简单。大体上的框架如下:
对f1(s1)初始化(边界条件)
for k?2 to n(这里以顺序求解为例)
对每一个sk?Sk
fk(sk)?一个极值(∞或-∞)
对每一个uk(sk)?Dk(sk)
sk-1?Tk(sk,uk)
t?g(fk-1(sk-1),uk)
y t比fk(sk)更优 n
fk(sk)?t
输出fn(sn)
这个N-S图虽然不能代表全部,但足可以概括大多数。少数的一些特殊的动态规划,其实现的原理也是类似,可以类比出来。我们到现在对动态规划的分析,主要是在理论上、设计上,原因也就在此。
掌握了动态规划的模式性,我们在用动态规划解题时就可以把主要的精力放在理论上的设计。一旦设计成熟,问题也就基本上解决了。而且在设计算法时也可以按部就班地来。
但是“物极必反”,太过拘泥于模式就会限制我们的思维,扼杀优良算法思想的产生。我们在解题时,不妨发挥一下创造性,去突破动态规划的实现模式,这样往往会收到意想不到的效果。[3]
§2.3动态规划的技巧性
上面我们所说的动态规划的模式性,主要指的是实现方面。而在设计方面,虽然它较为严格的步骤性,但是它的设计思想却是没有一定的规律可循的。这就需要我们不断地在实践当中去掌握动态规划的技巧,下面仅就一个例子谈一点我自己的体会。
[例3] 街道问题:在下图中找出从左下角到右上角的最短路径,每步只能向右方或上方走。
这是一道简单而又典型的动态规划题,许多介绍动态规划的书与文章中都拿它来做例子。通常,书上的解答是这样的:

按照图中的虚线来划分阶段,即阶段变量k表示走过的步数,而状态变量sk表示当前处于这一阶段上的哪一点(各点所对应的阶段和状态已经用ks在地图上标明)。这时的模型实际上已经转化成了一个特殊的多段图。用决策变量uk=0表示向右走,uk=1表示向上走,则状态转移方程如下:

(这里的row是地图竖直方向的行数)
我们看到,这个状态转移方程需要根据k的取值分两种情况讨论,显得非常麻烦。相应的,把它代入规划方程而付诸实现时,算法也很繁。因而我们在实现时,一般是不会这么做的,而代之以下面方法:
将地图中的点规则地编号如上,得到的规划方程如下:

(这里Distance表示相邻两点间的边长)
这样做确实要比上面的方法简单多了,但是它已经破坏了动态规划的本来面目,而不存在明确的阶段特征了。如果说这种方法是以地图中的行(A、B、C、D)来划分阶段的话,那么它的“状态转移”就不全是在两个阶段之间进行的了。
也许这没什么大不了的,因为实践比理论更有说服力。但是,如果我们把题目扩展一下:在地图中找出从左下角到右上角的两条路径,两条路径中的任何一条边都不能重叠,并且要求两条路径的总长度最短。这时,再用这种“简单”的方法就不太好办了。
如果非得套用这种方法的话,则最优指标函数就需要有四维的下标,并且难以处理两条路径“不能重叠”的问题。
而我们回到原先“标准”的动态规划法,就会发现这个问题很好解决,只需要加一维状态变量就成了。即用sk=(ak,bk)分别表示两条路径走到阶段k时所处的位置,相应的,决策变量也增加一维,用uk=(xk,yk)分别表示两条路径的行走方向。状态转移时将两条路径分别考虑:

在写规划方程时,只要对两条路径走到同一个点的情况稍微处理一下,减少可选的决策个数:

从这个例子中可以总结出设计动态规划算法的一个技巧:状态转移一般是在相邻的两个阶段之间(有时也可以在不相邻的两个阶段间),但是尽量不要在同一个阶段内进行。
动态规划是一种很灵活的解题方法,在动态规划算法的设计中,类似的技巧还有很多。要掌握动态规划的技巧,有两条途径:一是要深刻理解动态规划的本质,这也是我们为什么一开始就探讨它的本质的原因;二是要多实践,不但要多解题,还要学会从解题中探寻规律,总结技巧。
§3动态规划与一些算法的比较
动态规划作为诸多解题方法中的一种,必然和其他一些算法有着诸多联系。从这些联系中,我们也可以看出动态规划的一些特点。
§3.1动态规划与递推
——动态规划是最优化算法
由于动态规划的“名气”如此之大,以至于很多人甚至一些资料书上都往往把一种与动态规划十分相似的算法,当作是动态规划。这种算法就是递推。实际上,这两种算法还是很容易区分的。
按解题的目标来分,信息学试题主要分四类:判定性问题、构造性问题、计数问题和最优化问题。我们在竞赛中碰到的大多是最优化问题,而动态规划正是解决最优化问题的有力武器,因此动态规划在竞赛中的地位日益提高。而递推法在处理判定性问题和计数问题方面也是一把利器。下面分别就两个例子,谈一下递推法和动态规划在这两个方面的联系。
[例4] mod 4 最优路径问题:在下图中找出从第1点到第4点的一条路径,要求路径长度mod 4的余数最小。
这个图是一个多段图,而且是一个特殊的多段图。虽然这个图的形式比一般的多段图要简单,但是这个最优路径问题却不能用动态规划来做。因为一条从第1点到第4点的最优路径,在它走到第2点、第3点时,路径长度mod 4的余数不一定是最小,也就是说最优策略的子策略不一定最优——这个问题不满足最优化原理。
但是我们可以把它转换成判定性问题,用递推法来解决。判断从第1点到第k点的长度mod 4为sk的路径是否存在,用fk(sk)来表示,则递推公式如下:
(边界条件)

(这里lenk,i表示从第k-1点到第k点之间的第i条边的长度,方括号表示“或(or)”运算)
最后的结果就是可以使f4(s4)值为真的最小的s4值。
这个递推法的递推公式和动态规划的规划方程非常相似,我们在这里借用了动态规划的符号也就是为了更清楚地显示这一点。其实它们的思想也是非常相像的,可以说是递推法借用了动态规划的思想解决了动态规划不能解决的问题。
有的多阶段决策问题(像这一题的阶段特征就很明显),由于不能满足最优化原理等使用动态规划的先决条件,而无法应用动态规划。在这时可以将最优指标函数的值当作“状态”放到下标中去,从而变最优化问题为判定性问题,再借用动态规划的思想,用递推法来解决问题。
§3.2动态规划与搜索
——动态规划是高效率、高消费算法
同样是解决最优化问题,有的题目我们采用动态规划,而有的题目我们则需要用搜索。这其中有没有什么规则呢?
我们知道,撇开时空效率的因素不谈,在解决最优化问题的算法中,搜索可以说是“万能”的。所以动态规划可以解决的问题,搜索也一定可以解决。
把一个动态规划算法改写成搜索是非常方便的,状态转移方程、规划方程以及边界条件都可以直接“移植”,所不同的只是求解顺序。动态规划是自底向上的递推求解,而搜索则是自顶向下的递归求解(这里指深度搜索,宽度搜索类似)。
反过来,我们也可以把搜索算法改写成动态规划。状态空间搜索实际上是对隐式图中的点进行枚举,这种枚举是自顶向下的。如果把枚举的顺序反过来,变成自底向上,那么就成了动态规划。(当然这里有个条件,即隐式图中的点是可排序的,详见下一节。)
正因为动态规划和搜索有着求解顺序上的不同,这也造成了它们时间效率上的差别。在搜索中,往往会出现下面的情况:
对于上图(a)这样几个状态构成的一个隐式图,用搜索算法就会出现重复,如上图(b)所示,状态C2被搜索了两次。在深度搜索中,这样的重复会引起以C2为根整个的整个子搜索树的重复搜索;在宽度搜索中,虽然这样的重复可以立即被排除,但是其时间代价也是不小的。而动态规划就没有这个问题,如上图(c)所示。
一般说来,动态规划算法在时间效率上的优势是搜索无法比拟的。(当然对于某些题目,根本不会出现状态的重复,这样搜索和动态规划的速度就没有差别了。)而从理论上讲,任何拓扑有序(现实中这个条件常常可以满足)的隐式图中的搜索算法都可以改写成动态规划。但事实上,在很多情况下我们仍然不得不采用搜索算法。那么,动态规划算法在实现上还有什么障碍吗?
考虑上图(a)所示的隐式图,其中存在两个从初始状态无法达到的状态。在搜索算法中,这样的两个状态就不被考虑了,如上图(b)所示。但是动态规划由于是自底向上求解,所以就无法估计到这一点,因而遍历了全部的状态,如上图(c)所示。
一般说来,动态规划总要遍历所有的状态,而搜索可以排除一些无效状态。更重要的事搜索还可以剪枝,可能剪去大量不必要的状态,因此在空间开销上往往比动态规划要低很多。
如何协调好动态规划的高效率与高消费之间的矛盾呢?有一种折衷的办法就是记忆化算法。记忆化算法在求解的时候还是按着自顶向下的顺序,但是每求解一个状态,就将它的解保存下来,以后再次遇到这个状态的时候,就不必重新求解了。这种方法综合了搜索和动态规划两方面的优点,因而还是很有实用价值的。
§3.3动态规划与网络流
——动态规划是易设计易实现算法
由于图的关系复杂而无序,一般难以呈现阶段特征(除了特殊的图如多段图,或特殊的分段方法如Floyd),因此动态规划在图论中的应用不多。但有一类图,它的点却是有序的,这就是有向无环图。
在有向无环图中,我们可以对点进行拓扑排序,使其体现出有序的特征,从而据此划分阶段。在有向无还图中求最短路径的算法[4],已经体现出了简单的动态规划思想。但动态规划在图论中还有更有价值的应用。下面先看一个例子。
[例6] N个人的街道问题:在街道问题(参见例3)中,若有N个人要从左下角走向右上角,要求他们走过的边的总长度最大。当然,这里每个人也只能向右或向上走。下面是一个样例,左图是从出发地到目的地的三条路径,右图是他们所走过的边,这些边的总长度为5 + 4 + 3 + 6 + 3 + 3 + 5 + 8 + 8 + 7 + 4 + 5 + 9 + 5 + 3 = 78(不一定是最大)。
这个题目是对街道问题的又一次扩展。仿照街道问题的解题方法,我们仍然可以用动态规划来解决本题。不过这一次是N个人同时走,状态变量也就需要用N维来表示,。相应的,决策变量也要变成N维,uk=(uk,1,uk,2,…,uk,N)。状态转移方程不需要做什么改动:

在写规划方程时,需要注意在第k阶段,N条路径所走过的边的总长度的计算,在这里我就用gk(sk,uk)来表示了:

边界条件为
可见将原来的动态规划算法移植到这个问题上来,在理论上还是完全可行的。但是,现在的这个动态规划算法的时空复杂度已经是关于N的指数函数,只要N稍微大一点,这个算法就不可能实现了。
下面我们换一个思路,将N条路径看成是网络中一个流量为N的流,这样求解的目标就是使这个流的费用最大。但是本题又不同于一般的费用流问题,在每一条边e上的流费用并不是流量和边权的乘积 ,而是用下式计算:

为了使经典的费用流算法适用于本题,我们需要将模型稍微转化一下:
如图,将每条边拆成两条。拆开后一条边上有权,但是容量限制为1;另一条边没有容量限制,但是流过这条边就不能计算费用了。这样我们就把问题转化成了一个标准的最大费用固定流问题。
这个算法可以套用经典的最小费用最大流算法,在此就不细说了。(参见附录中的源程序)
这个例题是我仿照IOI97的“障碍物探测器”一题[6]编出来的。“障碍物探测器”比这一题要复杂一些,但是基本思想是相似的。类似的题目还有99年冬令营的“迷宫改造”[7]。从这些题目中都可以看到动态规划和网络流的联系。
推广到一般情况,任何有向无环图中的费用流问题在理论上说,都可以用动态规划来解决。对于流量为N(如果流量不固定,这个N需要事先求出来)的费用流问题,用N维的变量sk=(sk,1,sk,2,…,sk,N)来描述状态,其中sk,i?V(1£i£N)。相应的,决策也用N维的变量uk=(uk,1,uk,2,…,uk,N)来表示,其中uk,i?E(sk,i)(1£i£N),E(v)表示指向v的弧集。则状态转移方程可以这样表示:
sk-1,i = uk,i的弧尾结点
规划方程为
边界条件为
但是,由于动态规划算法是指数级算法,因而在实现中的局限性很大,仅可用于一些N非常小的题目。然而在竞赛解题中,比如上面说到的IOI97以及99冬令营测试时,我们使用动态规划的倾向性很明显(“障碍物探测器”中,我们用的是贪心策略,求N=1或N=2时的局部最优解[8])。这主要有两个原因:
一. 虽然网络流有着经典的算法,但是在竞赛中不可能出现经典的问题。如果要运用网络流算法,则需要经过一番模型转化,有时这个转化还是相当困难的。因此在算法的设计上,灵活巧妙的动态规划算法反而要更为简单一些。
二. 网络流算法实现起来很繁,这是被人们公认的。因而在竞赛的紧张环境中,实现起来有一定模式的动态规划算法又多了一层优势。
正由于动态规划算法在设计和实现上的简便性,所以在N不太大时,也就是在动态规划可行的情况下,我们还是应该尽量运用动态规划。
§4结语
本文的内容比较杂,是我几年来对动态规划的参悟理解、心得体会。虽然主要的篇幅讲的都是理论,但是根本的目的还是指导实践。
动态规划,据我认为,是当今信息学竞赛中最灵活、也最能体现解题者水平的一类解题方法。本文内容虽多,不能涵盖动态规划之万一。“纸上得来终觉浅,绝知此事要躬行。”要想真正领悟、理解动态规划的思想,掌握动态规划的解题技巧,还需要在实践中不断地挖掘、探索。实践得多了,也就能体会到渐入佳境之妙了。
动态规划,
算法之常,
运用之妙,
存乎一心。

热点内容
编程实现蟒蛇 发布:2024-10-03 21:20:05 浏览:884
我的世界服务器地址公开 发布:2024-10-03 21:07:07 浏览:792
opencv2012怎么看配置 发布:2024-10-03 21:00:52 浏览:499
jar包编译成源码 发布:2024-10-03 20:41:59 浏览:43
朋友圈广告植入源码 发布:2024-10-03 20:35:48 浏览:240
高速缓存卷 发布:2024-10-03 20:30:28 浏览:538
哪个安卓系统的平板音效最好 发布:2024-10-03 20:28:09 浏览:126
python运行java 发布:2024-10-03 20:16:38 浏览:78
资产配置从债券转向股票怎么走 发布:2024-10-03 20:13:50 浏览:303
查询扣扣密码在哪里 发布:2024-10-03 20:12:09 浏览:159