文档库 最新最全的文档下载
当前位置:文档库 › 通过金矿模型介绍动态规划

通过金矿模型介绍动态规划

通过金矿模型介绍动态规划
通过金矿模型介绍动态规划

原文转载:https://www.wendangku.net/doc/9d18450436.html,/sdjl/articles/1274312.html

对于动态规划,每个刚接触的人都需要一段时间来理解,特别是第一次接触的时候总是想不通为什么这种方法可行,这篇文章就是为了帮助大家理解动态规划,并通过讲解基本的01背包问题来引导读者如何去思考动态规划。本文力求通俗易懂,无异性,不让读者感到迷惑,引导读者去思考,所以如果你在阅读中发现有不通顺的地方,让你产生错误理解的地方,让你难得读懂的地方,请跟贴指出,谢谢!

----第一节----初识动态规划--------

经典的01背包问题是这样的:

有一个包和n个物品,包的容量为m,每个物品都有各自的体积和价值,问当从这n个物品中选择多个物品放在包里而物品体积总数不超过包的容量m时,能够得到的最大价值是多少?[对于每个物品不可以取多次,最多只能取一次,之所以叫做01背包,0表示不取,1表示取]

为了用一种生动又更形象的方式来讲解此题,我把此题用另一种方式来描述,如下:

有一个国家,所有的国民都非常老实憨厚,某天他们在自己的国家发现了十座金矿,并且这十座金矿在地图上排成一条直线,国王知道这个消息后非常高兴,他希望能够把这些金子都挖出来造福国民,首先他把这些金矿按照在地图上的位置从西至东进行编号,依次为0、1、2、3、4、5、6、7、8、9,然后他命令他的手下去对每一座金矿进行勘测,以便知道挖取每一座金矿需要多少人力以及每座金矿能够挖出多少金子,然后动员国民都来挖金子。

题目补充1:挖每一座金矿需要的人数是固定的,多一个人少一个人都不行。国王知道每个金矿各需要多少人手,金矿i需要的人数为peopleNeeded[i]。

题目补充2:每一座金矿所挖出来的金子数是固定的,当第i座金矿有peopleNeeded[i]人去挖的话,就一定能恰好挖出gold[i]个金子。否则一个金子都挖不出来。

题目补充3:开采一座金矿的人完成开采工作后,他们不会再次去开采其它金矿,因此一个人最多只能使用一次。

题目补充4:国王在全国范围内仅招募到了10000名愿意为了国家去挖金子的人,因此这些人可能不够把所有的金子都挖出来,但是国王希望挖到的金子越多越好。

题目补充5:这个国家的每一个人都很老实(包括国王),不会私吞任何金子,也不会弄虚作假,不会说谎话。

题目补充6:有很多人拿到这个题后的第一反应就是对每一个金矿求出平均每个人能挖出多少金子,然后从高到低进行选择,这里要强调这种方法是错的,如果你也是这样想的,请考虑背包模型,当有一个背包的容量为10,共有3个物品,体积分别是3、3、5,价值分别是6、6、9,那么你的方法取到的是前两个物品,总价值是12,但明显最大值是后两个物品组成的15。

题目补充7:我们只需要知道最多可以挖出多少金子即可,而不用关心哪些金矿挖哪些金矿不挖。

那么,国王究竟如何知道在只有10000个人的情况下最多能挖出多少金子呢?国王是如何思考这个问题的呢?

国王首先来到了第9个金矿的所在地(注意,第9个就是最后一个,因为是从0开始编号的,最西边的那个金矿是第0个),他的臣子告诉他,如果要挖取第9个金矿的话就需要1500个人,并且第9个金矿可以挖出8888个金子。听到这里国王哈哈大笑起来,因为原先他以为要知道十个金矿在仅有10000个人的情况下最多能挖出多少金子是一件很难思考的问题,但是,就在刚才听完他的臣子所说的那句话时,国王已经知道总共最多能挖出多少金子了,国王是如何在不了解其它金矿的情况下知道最多能挖出多少金子的呢?他的臣子们也不知道这个谜,因此他的臣子们就问他了:“最聪明的国王陛下,我们都没有告诉您其它金矿的情况,您是如何知道最终答案的呢?”

得意的国王笑了笑,然后把他最得意的“左、右手”叫到跟前,说到:“我并不需要考虑最终要挖哪些金矿才能得到最多的金子,我只需要考虑我面前的这座金矿就可以了,对于我面前的这座金矿不外乎仅有两种选择,要么挖,要么不挖,对吧?”

“当然,当然”大臣们回答倒。

国王继续说道:“如果我挖取第9座金矿的话那么我现在就能获得8888个金子,而我将用去1500个人,那么我还剩下8500个人。我亲爱的左部下,如果你告诉我当我把所有剩下的8500个人和所有剩下的其它金矿都交给你去开采你最多能给我挖出多少金子的话,那么我不就知道了在第9个金矿一定开采的情况下所能得到的最大金币数吗?”

国王的左部下听后回答道:“国王陛下,您的意思是如果我能用8500个人在其它金矿最多开采出x个金币的话,那您一共就能够获得x + 8888个金子,对吗?”

“是啊,是啊……如果第9座金矿一定开采的话……”大臣们点头说到。

国王笑着继续对着他的右部下说到:“亲爱的右部下,也许我并不打算开采这第9座金矿,那么我依然拥有10000个人,如果我把这10000个人和剩下的金矿都给你的话,你最多能给我挖出多少个金子呢?”

国王的右部下聪明地说道:“尊敬的国王陛下,我明白您的意思了,如果我回答最多能购开采出y个金币的话,那您就可以在y和x+8888之间选择一个较大者,而这个较大者就是最终我们能获得的最大金币数,您看我这样理解对吗?”

国王笑得更灿烂了,问他的左部下:“那么亲爱的左部下,我给你8500个人和其余金矿的话你能告诉我最多能挖出多少金子吗?”

“请您放心,这个问题难不倒我”。左部下向国王打包票说到。

国王高兴地继续问他的右部下:“那右部下你呢,如果我给你10000个人和其余金矿的话你能告诉我最多能挖出多少金子吗?”

“当然能了!交给我吧!”右部下同左部下一样自信地回答道。

“那就拜托给你们两位了,现在我要回到我那舒适的王宫里去享受了,我期待着你们的答复。”国王说完就开始动身回去等消息了,他是多么地相信他的两个大臣能够给他一个准确的答复,因为国王其实知道他的两位大臣要比他聪明得多。

故事发展到这里,你是否在想国王的这两个大臣又是如何找到让国王满意的答案的呢?他们为什么能够如此自信呢?事实上他们的确比国王要聪明一些,因为他们从国王的身上学到了一点,就是这一点让他们充满了自信。

国王走后,国王的左、右部下来到了第8座金矿,早已在那里等待他们的金矿勘测兵向两位大臣报道:“聪明的两位大臣,您们好,第8座金矿需要1000个人才能开采,可以获得7000个金子”。

因为国王仅给他的左部下8500个人,所以国王的左部下叫来了两个人,对着其中一个人问到:“如果我给你7500个人和除了第8、第9的其它所有金矿的话,你能告诉我你最多能挖出多少金子吗?”

然后国王的左部下继续问另一个人:“如果我给你8500个人和除了第8、第9的其它所有金矿的话,你能告诉我你最多能挖出多少金子吗?”

国王的左部下在心里想着:“如果他们俩都能回答我的问题的话,那国王交给我的问题不就解决了吗?哈哈哈!”

因为国王给了他的右部下10000个人,所以国王的右部下同样也叫来了两个人,对着其中一个人问:“如果我给你9000个人和除了第8、第9的其它所有金矿的话,你能告诉我你最多能挖出多少金子吗?”

然后国王的右部下继续问他叫来的另一个人:“如果我给你10000个人和除了第8、第9的其它所有金矿的话,你能告诉我你最多能挖出多少金子吗?”

此时,国王的右部下同左部下一样,他们都在为自己如此聪明而感到满足。

当然,这四个被叫来的人同样自信地回答没有问题,因为他们同样地从这两个大臣身上学到了相同的一点,而两位自认为自己一样很聪明的大臣得意地笑着回到了他们的府邸,等着别人回答他们提出来的问题,现在你知道了这两个大臣是如何解决国王交待给他们的问题了吗?

那么你认为被大臣叫去的那四个人又是怎么完成大臣交给他们的问题的呢?答案当然是他们找到了另外八个人!

没用多少功夫,这个问题已经在全国传开了,更多人的人找到了更更多的人来解决这个问题,而有些人却不需要去另外找两个人帮他,哪些人不需要别人的帮助就可以回答他们的问题呢?

很明显,当被问到给你z个人和仅有第0座金矿时最多能挖出多少金子时,就不需要别人的帮助,因为你知道,如果z大于等于挖取第0座金矿所需要的人数的话,那么挖出来的最多金子数就是第0座金矿能够挖出来的金子数,如果这z个人不够开采第0座金矿,那么能挖出来的最多金子数就是0,因为这唯一的金矿不够人力去开采。让我们为这些不需要别人的帮助就可以准确地得出答案的人们鼓掌吧,这就是传说中的底层劳动人民!

故事讲到这里先暂停一下,我们现在重新来分析一下这个故事,让我们对动态规划有个理性认识。

子问题:

国王需要根据两个大臣的答案以及第9座金矿的信息才能判断出最多能够开采出多少金子。为了解决自己面临的问题,他需要给别人制造另外两个问题,这两个问题就是子问题。

思考动态规划的第一点----最优子结构:

国王相信,只要他的两个大臣能够回答出正确的答案(对于考虑能够开采出的金子数,最多的也就是最优的同时也就是正确的),再加上他的聪明的判断就一定能得到最终的正确答案。我们把这种子问题最优时母问题通过优化选择后一定最优的情况叫做“最优子结构”。

思考动态规划的第二点----子问题重叠:

实际上国王也好,大臣也好,所有人面对的都是同样的问题,即给你一定数量的人,给你一定数量的金矿,让你求出能够开采出来的最多金子数。我们把这种母问题与子问题本质上是同一个问题的情况称为“子问题重叠”。然而问题中出现的不同点往往就是被子问题之间传递的参数,比如这里的人数和金矿数。

思考动态规划的第三点----边界:

想想如果不存在前面我们提到的那些底层劳动者的话这个问题能解决吗?永远都不可能!我们把这种子问题在一定时候就不再需要提出子子问题的情况叫做边界,没有边界就会出现死循环。

思考动态规划的第四点----子问题独立:

要知道,当国王的两个大臣在思考他们自己的问题时他们是不会关心对方是如何计算怎样开采金矿的,因为他们知道,国王只会选择两个人中的一个作为最后方案,另一个人的方案并不会得到实施,因此一个人的决定对另一个人的决定是没有影响的。我们把这种一个母问题在对子问题选择时,当前被选择的子问题两两互不影响的情况叫做“子问题独立”。

这就是动态规划,具有“最优子结构”、“子问题重叠”、“边界”和“子问题独立”,当你发现你正在思考的问题具备这四个性质的话,那么恭喜你,你基本上已经找到了动态规划的方法。

有了上面的这几点,我们就可以写出动态规划的转移方程式,现在我们来写出对应

这个问题的方程式,如果用gold[mineNum]表示第mineNum个金矿能够挖出的金子数,用peopleNeeded[mineNum]表示挖第mineNum个金矿需要的人数,用函数f(people,mineNum)表示当有people个人和编号为0、1、2、3、……、mineNum的金矿时能够得到的最大金子数的话,f(people,mineNum)等于什么呢?或者说f(people,mineNum)的转移方程是怎样的呢?

答案是:

当mineNum = 0且people >= peopleNeeded[mineNum]时f(people,mineNum) = gold[mineNum]

当mineNum = 0且people < peopleNeeded[mineNum]时f(people,mineNum) = 0

当mineNum != 0时f(people,mineNum) = f(people-peopleNeeded[mineNum], mineNum-1) + gold[mineNum]与f(people, mineNum-1)中的较大者,前两个式子对应动态规划的“边界”,后一个式子对应动态规划的“最优子结构”请读者弄明白后再继续往下看。

----第二节----动态规划的优点--------

现在我假设读者你已经搞清楚了为什么动态规划是正确的方法,但是我们为什么需要使用动态规划呢?请先继续欣赏这个故事:

国王得知他的两个手下使用了和他相同的方法去解决交代给他们的问题后,不但没有认为他的两个大臣在偷懒,反而很高兴,因为他知道,他的大臣必然会找更多的人一起解决这个问题,而更多的人会找更更多的人,这样他这个聪明的方法就会在不经意间流传开来,而全国人民都会知道这个聪明的方法是他们伟大的国王想出来的,你说国王能不高兴吗?

但是国王也有一些担忧,因为他实在不知道这个“工程”要动用到多少人来完成,如果帮助他解决这个问题的人太多的话那么就太劳民伤财了。“会不会影响到今年的收成呢?”国王在心里想着这个问题,于是他请来了整个国家里唯一的两个数学天才,一个叫做小天,另一个叫做小才。

国王问小天:“小天啊,我发觉这个问题有点严重,我知道其实这可以简单的看成一个组合问题,也就是从十个金矿中选取若干个金矿进行开采,看看哪种组合得到的金子最多,也许用组合方法会更好一些。你能告诉我一共有多少种组合情况吗?”

“国王陛下,如果用组合方法的话一共要考虑2的10次方种情况,也就是1024种情况。”小天思考了一会回答到。

“嗯……,如果每一种情况我交给一个人去计算能得到的金子数的话,那我也要1024个人,其实还是挺多的。”国王好像再次感觉到了自己的方法是正确的。

国王心理期待着小才能够给它一个更好的答案,问到:“小才啊,那么你能告诉我用我的那个方法总共需要多少人吗?其实,我也计算过,好像需要的人数是1+2+4+8+16+32+64+……,毕竟每一个人的确都需要找另外两个人来帮助他们……”

不辜负国王的期待,小才微笑着说到:“亲爱的国王陛下,其实我们并不需要那么多人,因为有很多问题其实是相同的,而我们只需要为每一个不同的问题使用一个人力便可。”

国王高兴的问到:“此话如何讲?”

“打个比方,如果有一个人需要知道1000个人和3个金矿可以开采出多少金子,同时另一个人也需要知道1000个人和3个金矿可以开采出多少金子的话,那么他们可以去询问相同的一个人,而不用各自找不同的人浪费人力了。”

国王思考着说到:“嗯,很有道理,如果问题是一样的话那么就不需要去询问两个不同的人了,也就是说一个不同的问题仅需要一个人力,那么一共有多少个不同的问题呢?”

“因为每个问题的人数可以从0取到10000,而金矿数可以从0取到10,所以最多大约有10000 * 10 等于100000个不同的问题。”小才一边算着一边回答。

“什么?十万个问题?十万个人力?”国王有点失望。

“请国王放心,事实上我们需要的人力远远小于这个数的,因为不是每一个问题都会遇到,也许我们仅需要一、两百个人力就可以解决这个问题了,这主要和各个金矿所需要的人数有关。”小才立刻回答到。

故事的最后,自然是国王再一次向他的臣民们证明了他是这个国家里最聪明的人,现在我们通过故事的第二部分来考虑动态规划的另外两个思考点。

思考动态规划的第五点----做备忘录:

正如上面所说的一样,当我们遇到相同的问题时,我们可以问同一个人。讲的通俗一点就是,我们可以把问题的解放在一个变量中,如果再次遇到这个问题就直接从变量中获得答案,因此每一个问题仅会计算一遍,如果不做备忘的话,动态规划就没有任何优势可言了。

思考动态规划的第六点----时间分析:

正如上面所说,如果我们用穷举的方法,至少需要2^n个常数时间,因为总共有2^n 种情况需要考虑,如果在背包问题中,包的容量为1000,物品数为100,那么需要考虑2^100种情况,这个数大约为10的30次方。

而如果用动态规划,最多大概只有1000*100 = 100000个不同的问题,这和10的30次方比起来优势是很明显的。而实际情况并不会出现那么多不同的问题,比如在金矿模型中,如果所有的金矿所需人口都是1000个人,那么问题总数大约只有100个。

非正式地,我们可以很容易得到动态规划所需时间,如果共有questionCount个相同的子问题,而每一个问题需要面对chooseCount种选择时,我们所需时间就为questionCount * chooseCount个常数。在金矿模型中,子问题最多有大概people * n 个(其中people是用于开采金矿的总人数,n是金矿的总数),因此questionCount = people * n,而就像国王需要考虑是采用左部下的结果还是采用右部下的结果一样,每个问题面对两个选择,因此chooseCount = 2,所以程序运行时间为T = O(questionCount * chooseCount) =O(people * n),别忘了实际上需要的时间小于这个值,根据所遇到的具体情况有所不同。

这就是动态规划的魔力,它减少了大量的计算,因此我们需要动态规划!

----第三节----动态规划的思考角度----------

那么什么是动态规划呢?我个人觉得,如果一个解决问题的方法满足上面六个思考点中的前四个,那么这个方法就属于动态规划。而在思考动态规划方法时,后两点同样也是需要考虑的。

面对问题要寻找动态规划的方法,首先要清楚一点,动态规划不是算法,它是一种方法,它是在一件事情发生的过程中寻找最优值的方法,因此,我们需要对这件事情所发生的过程进行考虑。而通常我们从过程的最后一步开始考虑,而不是先考虑过程的开始。

打个比方,上面的挖金矿问题,我们可以认为整个开采过程是从西至东进行开采的(也就是从第0座开始),那么总有面对最后一座金矿的时候(第9座),对这座金矿不外乎两个选择,开采与不开采,在最后一步确定时再去确定倒数第二步,直到考虑第0座金矿(过程的开始)。

而过程的开始,也就是考虑的最后一步,就是边界。

因此在遇到一个问题想用动态规划的方法去解决时,不妨先思考一下这个过程是怎样的,然后考虑过程的最后一步是如何选择的,通常我们需要自己去构造一个过程,比如后面的练习。

----第四节----总结-------

那么遇到问题如何用动态规划去解决呢?根据上面的分析我们可以按照下面的步骤去考虑:

1、构造问题所对应的过程。

2、思考过程的最后一个步骤,看看有哪些选择情况。

3、找到最后一步的子问题,确保符合“子问题重叠”,把子问题中不相同的地方设置为参数。

4、使得子问题符合“最优子结构”。

5、找到边界,考虑边界的各种处理方式。

6、确保满足“子问题独立”,一般而言,如果我们是在多个子问题中选择一个作为实施方案,而不会同时实施多个方案,那么子问题就是独立的。

7、考虑如何做备忘录。

8、分析所需时间是否满足要求。

9、写出转移方程式。

----第五节----练习-------

题目一:买书

有一书店引进了一套书,共有3卷,每卷书定价是60元,书店为了搞促销,推出一个活动,活动如下:

如果单独购买其中一卷,那么可以打9.5折。

如果同时购买两卷不同的,那么可以打9折。

如果同时购买三卷不同的,那么可以打8.5折。

如果小明希望购买第1卷x本,第2卷y本,第3卷z本,那么至少需要多少钱呢?(x、y、z为三个已知整数)。

当然,这道题完全可以不用动态规划来解,但是现在我们是要学习动态规划,因此请想想如何用动态规划来做?

答案:

1、过程为一次一次的购买,每一次购买也许只买一本(这有三种方案),或者买两本(这也有三种方案),或者三本一起买(这有一种方案),最后直到买完所有需要的书。

2、最后一步我必然会在7种购买方案中选择一种,因此我要在7种购买方案中选择一个最佳情况。

3、子问题是,我选择了某个方案后,如何使得购买剩余的书能用最少的钱?并且这个选择不会使得剩余的书为负数。母问题和子问题都是给定三卷书的购买量,求最少需要用的钱,所以有“子问题重叠”,问题中三个购买量设置为参数,分别为i、j、k。

4、的确符合。

5、边界是一次购买就可以买完所有的书,处理方式请读者自己考虑。

6、每次选择最多有7种方案,并且不会同时实施其中多种,因此方案的选择互不影响,所以有“子问题独立”。

7、我可以用minMoney[i][j][k]来保存购买第1卷i本,第2卷j本,第3卷k本时所需的最少金钱。

8、共有x * y * z 个问题,每个问题面对7种选择,时间为:O( x * y * z * 7) = O( x * y * z )。

9、用函数MinMoney(i,j,k)来表示购买第1卷i本,第2卷j本,第3卷k本时所需的最少金钱,那么有:

MinMoney(i,j,k)=min(s1,s2,s3,s4,s5,s6,s7),其中s1,s2,s3,s4,s5,s6,s7分别为对应的7种方案使用的最少金钱:

s1 = 60 * 0.95 + MinMoney(i-1,j,k)

s2 = 60 * 0.95 + MinMoney(i,j-1,k)

s3 = 60 * 0.95 + MinMoney(i,j,k-1)

s4 = (60 + 60) * 0.9 + MinMoney(i-1,j-1,k)

s5 = (60 + 60) * 0.9 + MinMoney(i-1,j,k-1)

s6 = (60 + 60) * 0.9 + MinMoney(i-1,j,k-1)

s7 = (60 + 60 + 60) * 0.85 + MinMoney(i-1,j-1,k-1)

----第六节----代码参考------

下面提供金矿问题的程序源代码帮助读者理解,并提供测试数据给大家练习。

输入文件名为“beibao.in”,因为这个问题实际上就是背包问题,所以测试数据文件名就保留原名吧。

输入文件第一行有两个数,第一个是国王可用用来开采金矿的总人数,第二个是总共发现的金矿数。

输入文件的第2至n+1行每行有两个数,第i行的两个数分别表示第i-1个金矿需要的人数和可以得到的金子数。

输出文件仅一个整数,表示能够得到的最大金子数。

输入样例:

100 5

77 92

22 22

29 87

50 46

99 90

输出样例:

133

参考代码如下:

/*

=========程序信息========

对应题目:01背包之金矿模型

使用语言:c++

使用编译器:Visual Studio https://www.wendangku.net/doc/9d18450436.html,

使用算法:动态规划

算法运行时间:O(people * n) [people是人数,n是金矿数]

作者:贵州大学05级刘永辉

昵称:SDJL

编写时间:2008年8月

联系QQ:44561907

E-Mail:44561907@https://www.wendangku.net/doc/9d18450436.html,

获得更多文章请访问我的博客:https://www.wendangku.net/doc/9d18450436.html,/sdjl

如果发现BUG或有写得不好的地方请发邮件告诉我:)

转载请保留此部分信息:)

*/

#include "stdafx.h"

#include

#include

using namespace std;

const int max_n = 100;//程序支持的最多金矿数

const int max_people = 10000;//程序支持的最多人数

int n;//金矿数

int peopleTotal;//可以用于挖金子的人数

int peopleNeed[max_n];//每座金矿需要的人数

int gold[max_n];//每座金矿能够挖出来的金子数

int maxGold[max_people][max_n];//maxGold[i][j]保存了i个人挖前j个金矿能够得到的最大金子数,等于-1时表示未知

//初始化数据

void init()

{

ifstream inputFile("beibao.in");

inputFile>>peopleTotal>>n;

for(int i=0; i

inputFile>>peopleNeed[i]>>gold[i];

inputFile.close();

for(int i=0; i<=peopleTotal; i++)

for(int j=0; j

maxGold[i][j] = -1;//等于-1时表示未知[对应动态规划中的“做备忘录”]

}

//获得在仅有people个人和前mineNum个金矿时能够得到的最大金子数,注意“前多少个”也是从0开始编号的

int GetMaxGold(int people, int mineNum)

{

//申明返回的最大金子数

int retMaxGold;

//如果这个问题曾经计算过[对应动态规划中的“做备忘录”]

if(maxGold[people][mineNum] != -1)

{

//获得保存起来的值

retMaxGold = maxGold[people][mineNum];

}

else if(mineNum == 0)//如果仅有一个金矿时[对应动态规划中的“边界”]

{

//当给出的人数足够开采这座金矿

if(people >= peopleNeed[mineNum])

{

//得到的最大值就是这座金矿的金子数

retMaxGold = gold[mineNum];

}

else//否则这唯一的一座金矿也不能开采

{

//得到的最大值为0个金子

retMaxGold = 0;

}

}

else if(people >= peopleNeed[mineNum])//如果给出的人够开采这座金矿[对应动态规划中的“最优子结构”]

{

//考虑开采与不开采两种情况,取最大值

retMaxGold = max(GetMaxGold(people - peopleNeed[mineNum],mineNum -1) + gold[mineNum],

GetMaxGold(people,mineNum - 1));

}

else//否则给出的人不够开采这座金矿[对应动态规划中的“最优子结构”]

{

//仅考虑不开采的情况

retMaxGold = GetMaxGold(people,mineNum - 1);

}

//做备忘录

maxGold[people][mineNum] = retMaxGold;

return retMaxGold;

}

int _tmain(int argc, _TCHAR* argv[])

{

//初始化数据

init();

//输出给定peopleTotal个人和n个金矿能够获得的最大金子数,再次提醒编号从0开始,所以最后一个金矿编号为n-1

cout<

system("pause");

return 0;

}

随机规划

第二讲 随机规划 第一节 基本概念 1、 问题的提出 许多实际决策问题,尤其是比较复杂的决策问题,可以建 立如下的线性规划模型: {}????? ??????≥=+++=+++=++++++.0,...,,............min 11221122222121112121112211n m n mn m m n n n n n n x x x b x a x a x a b x a x a x a b x a x a x a to subject x c x c x c M M (1.1) 用矩阵向量分析法,简化问题(1.1)得: ?? ???≥=0..min x b Ax t s x c T (1.2) 线性规划模型,在工业生产、运输业、农业、能源、生态、工程等领域都有广泛(典型)的应用。 在问题(1.1)中系数j c (例如价格因素)、ij a (比如生产率)、j b (比如需求量或存储能力)假设都已知为实数,这样我们的任务就是:寻找满足约束条件的决策变量j x (比如投入因素、生产率水平、能源 流),使这一组合达到最优。显然,在现实生活中,如果相关的函数(例如,费用函数或生产函数)关于决策变量是线性的,那么模型(1.1)就能够合理的描述现实生活中的问题。如果现实中不是这样

的,比如,因为产品的边际成本(边际成本指的是每一单位新增生产的产品(或者购买的产品)带来到总成本的增量)的增长或边际报酬的减少,我们就需要更一般的形式来建立问题的模型,如下: ?? ??? ?∈=≤.,...,1,0)(..)(min 0n i IR X x m i x g t s x g (1.3) 形式如(1.3)的问题就是一个数学规划问题。 这里的集合X 以及函数m i IR IR g n i ,...,0,:=→可以理解为是在建模过程中给出的。 在许多模型建立过程中(如问题(1.1)和(1.3)),若系数i ij j b a c ,,或 函数i g (和集合X )分别为给定值,这是不合理的。比如说,在水电 发电站,流入发电站蓄水池的流水量,及运输网络中各个节点的需求量等等的因素,在建模的过程中,通常都作为不确定的参数。在一个生产问题中,未来的生产率,用概率分布来描述是最好的。但在建模过程中,这些参数真实值的不确定性,并不能用他们的平均值或别的估计值来消除(即真实值与平均值/估计值存在偏差)。就是说,在考虑实际情况的时候,问题(1.1)、(1.3)的模型,可能并不适合来解决更实际的问题。在这一章我们着重并尽可能的阐明,对于实际生活中的决策问题,需要扩大建模范围的必要性。 在数学规划中引入随机性是很自然的事情。在模型中的系数i ij j b a c ,,常常代表价格、成本、需求量、资源数量、经济指标等参数。 由于各种不确定性因素的影响,这些参数经常出现波动。例如,市场

经典算法——动态规划教程

动态规划是对最优化问题的一种新的算法设计方法。由于各种问题的性质不同,确定最优解的条件也互不相同,因而动态规划的没计法对不同的问题,有各具特色的表示方式。不存在一种万能的动态规划算法。但是可以通过对若干有代表性的问题的动态规划算法进行讨论,学会这一设计方法。 多阶段决策过程最优化问题 ——动态规划的基本模型 在现实生活中,有一类活动的过程,由于它的特殊性,可将过程分成若干个互相联系的阶段,在它的每一阶段都需要作出决策,从而使整个过程达到最好的活动效果。因此各个阶段决策的选取不能任意确定,它依赖于当前面临的状态,又影响以后的发展。当各个阶段决策确定后,就组成一个决策序列,因而也就确定了整个过程的一条活动路线。这种把一个问题看做是一个前后关联具有链状结构的多阶段过程就称为多阶段决策过程,这种问题称为多阶段决策最优化问题。 【例题1】最短路径问题。图中给出了一个地图,地图中每个顶点代表一个城市,两个城市间的连线代表道路,连线上的数值代表道路的长度。现在,想从城市A到达城市E,怎样走路程最短,最短路程的长度是多少? 【分析】把从A到E的全过程分成四个阶段,用k表示阶段变量,第1阶段有一个初始状态A,两条可供选择的支路ABl、AB2;第2阶段有两个初始状态B1、 B2,B1有三条可供选择的支路,B2有两条可供选择的支路……。用dk(x k,x k+1)表示在第k阶段由初始状态x k到下阶段的初始状态x k+1的路径距离,Fk(x k)表示从第k阶段的x k到终点E的最短距离,利用倒推方法求解A到E的最短距离。具体计算过程如下: S1:K=4,有:F4(D1)=3,F4(D2)=4,F4(D3)=3 S2: K=3,有: F3(C1)=min{d3(C1,D1)+F4(D1),d3(C1,D2)+F4(d2)}=min{8,10}=8 F3(C2)=d3(C2,D1)+f4(D1)=5+3=8 F3(C3)=d3(C3,D3)+f4(D3)=8+3=11 F3(C4)=d3(C4,D3)+f4(D3)=3+3=6

第六章 随机规划

第六章 随机规划 第一节 问题的提出 随机规划所研究的对象是含有随机因素的数学规划问题。例如,我们熟悉的线性规划问题 CX X f =)(min 0≥=X b AX (6.1) 如果其中的A ,b ,C 的元素中部分的或全部的是随机变量,则称其为随机线性规划问题。 在数学规划中引入随机性是很自然的事情。在模型中的A ,b ,C 的元素常常代表价格、成本、需求量、资源数量、经济指标等参数。由于各种不确定性因素的影响,这些参数经常出现波动。例如,市场上对某种商品的需求量一般无法精确的预知,只能作出大致的预测,某种产品的生产成本往往受原材料价格、劳动生产率等各种因素的影响而经常变化,这些变化与波动,在许多场合可以用一定的概率分布去描述。因此,在数学规划中引入随机变量,能够使模型更加符合实际情况,从而是的决策更加合理。 例1 某化工厂生产过程中需要A ,B 两种化学成分,现有甲、乙两种原材料可供选用。其中原料甲中化学成分A 的单位含量为10/a ,B 的单位含量为3/a ;原料乙中化学成分A 的单位含量为10/1,B 的单位含量为3/1。根据生产要求,化学成分A 的总含量不得少于10/7个单位,化学成分A 的总含量不得少于3/4个单位。甲、乙两种原料的价格相同,问如何采购原料,使得即满足生产要求,又是的成本最低? 显而易见,这个问题可以用线性规划模型来描述。根据题意,设原料甲的采购数量为1x ,原料乙的采购数量为2x ,容易得到如下线性模型: 21)(min x x X f += ,047 212121≥≥≥+≥+x x x bx x ax (6.2)

于是只要知道a 和b 的值,立即可以求得最优解。 但是,如果由于某种原因,原料甲中化学成分A 、B 的单位含量不稳定,其中T b a ),(=ξ是矩形}13 1,41{≤≤≤≤y x 内的均匀分布随机向量,则问题(7.2)就成为随机线性规划问题了。 由于引入了随机量,随机规划问题的分析与求解比普通数学规划问题要复杂大多。在处理随机规划问题时,人们最容易想到的方法也许是将模型中的随机变量用它们的期望值来代,从而得到确定性的数学规划模型,再去求解。事实上,过去许多确定性数学规划正是这样建立起来的,但是应当指出,这种处理方法在实际问题中并不总可行的。为了说明这一点,我们不妨用此方法试解例1中的问题。容易求得 T T b a E E )3/2,2/5(]),[()(==ξ, (6.3) 将此值代入问题(7.2),得到确定线性规划模型如下: 21)(min x x X f += ,043 272 5212121≥≥≥+≥+x x x x x x (6.4) 可以求得此问题的唯一最优解为 T T x x X )11/32,11/18(),(*2*1*==, (6.5) 于是以此*X 作为原随机线性规划问题(7.2)的最优解。可是,由于问题(7.2)中的T b a ),(是随机向量,我们自然希望知道,上述*X 是问题(7.2)的最优解这一事件的概率有多大?是问题(7.2)的可行解这一事件的概率有多大?然而,我们发现, 4/1}3/2,2/5),{(} 4,7),{(*2*1*2*1=≥≥=≥+≥+b a b a P x bx x ax b a P T T , (6.6) 也即,*X 对问题(7.2)是可行解以0.75的概率是不可能的,只有0.25的可能性,这个解显然是不可用的。这个例子说明,用上述方法处理随机规

动态规划算法举例分析

动态规划算法 1. 动态规划算法介绍 基本思想是将待求解问题分解成若干子问题,先求解子问题,最后用这些子问题带到原问题,与分治算法的不同是,经分解得到的子问题往往是不是相互独立,若用分治则子问题太多。 2. 适用动态规划算法问题的特征 (1)最优子结构 设计动态规划算法的第一步骤通常是要刻画最优解的结构。当问题的最优解包含了其子问题的最优解时,称该问题具有最优子结构性质。问题的最优子结构性质提供了该问题可用动态规划算法求解的重要线索。 在动态规划算法中,问题的最优子结构性质使我们能够以自底向下的方式递归地从子问题的最优解逐步构造出整个问题的最优解。同时,它也使我们能在相对小的子问题空间中考虑问题。 (2)重叠子问题 可用动态规划算法求解的问题应具备的另一基本要素是子问题的重叠性质。在用递归算法自顶向下解此问题时,每次产生的子问题并不总是新问题,有些子问题被反复计算多次。动态规划算法正是利用了这种子问题的重叠性质,对每一个子问题只解一次,而后将其解保存在一个表格中,当再次需要解此子问题时,只有简单地用常数时间查看一下结果。通常,不同的子问题个数随输入问题的大小呈多项式增长。因此,用动态规划算法通常只需要多项式时间,从而获得较高的解题效率。 (3)备忘录方法

动态规划算法的一个变形是备忘录方法。备忘录方法也是一个表格来保存已解决的子问题的答案,在下次需要解此子问题时,只要简单地查看该子问题的解答,而不必重新计算。与动态规划算法不同的是,备忘录方法的递归方式是自顶向下的,而动态规划算法则是自底向上递归的。因此,备忘录方法的控制结构与直接递归方法的控制结构相同,区别在于备忘录方法为每个解过的子问题建立了备忘录以备需要时查看,避免了相同子问题的重复求解。 备忘录方法为每个子问题建立一个记录项,初始化时,该记录项存入一个特殊的值,表示该子问题尚未求解。在求解过程中,对每个待求的子问题,首先查看其相应的记录项。若记录项中存储的是初始化时存入的特殊值,则表示该子问题是第一次遇到,则此时计算出该子问题的解,并保存在其相应的记录项中。若记录项中存储的已不是初始化时存入的特殊值,则表示该子问题已被计算过,其相应的记录项中存储的是该子问题的解答。此时,只要从记录项中取出该子问题的解答即可。 3. 基本步骤 a 、找出最优解的性质,并刻画其结构特征。 b 、递归地定义最优值。 c 、以自底向上的方式计算出最优值。 d 、根据计算最优值时得到的信息构造一个最优解。(可省) 例1-1 [0/1背包问题] [问题描述] 用贪心算法不能保证求出最优解。在0/1背包问题中,需要对容量为c 的背包进行装载。从n 个物品中选取装入背包的物品,每件物品i 的重量为i w ,价 值为 i v 。对于可行的背包装载,背包中物品的总重量不能超过背包的容量,最佳 装载是指所装入的物品价值最高,即∑=n i i i x v 1 取得最大值。约束条件为 c x w n i i i ≤∑=1 , {}() n i x i ≤≤∈11,0。

动态规划讲解大全(含例题及答案)

动态规划讲解大全 动态规划(dynamic programming)是运筹学的一个分支,是求解决策过程(decision process)最优化的数学方法。20世纪50年代初美国数学家R.E.Bellman等人在研究多阶段决策过程(multistep decision process)的优化问题时,提出了著名的最优化原理(principle of optimality),把多阶段过程转化为一系列单阶段问题,逐个求解,创立了解决这类过程优化问题的新方法——动态规划。1957年出版了他的名著Dynamic Programming,这是该领域的第一本著作。 动态规划问世以来,在经济管理、生产调度、工程技术和最优控制等方面得到了广泛的应用。例如最短路线、库存管理、资源分配、设备更新、排序、装载等问题,用动态规划方法比用其它方法求解更为方便。 虽然动态规划主要用于求解以时间划分阶段的动态过程的优化问题,但是一些与时间无关的静态规划(如线性规划、非线性规划),只要人为地引进时间因素,把它视为多阶段决策过程,也可以用动态规划方法方便地求解。 动态规划程序设计是对解最优化问题的一种途径、一种方法,而不是一种特殊算法。不象前面所述的那些搜索或数值计算那样,具有一个标准的数学表达式和明确清晰的解题方法。动态规划程序设计往往是针对一种最优化问题,由于各种问题的性质不同,确定最优解的条件也互不相同,因而动态规划的设计方法对不同的问题,有各具特色的解题方法,而不存在一种万能的动态规划算法,可以解决各类最优化问题。因此读者在学习时,除了要对基本概念和方法正确理解外,必须具体问题具体分析处理,以丰富的想象力去建立模型,用创造性的技巧去求解。我们也可以通过对若干有代表性的问题的动态规划算法进行分析、讨论,逐渐学会并掌握这一设计方法。 基本模型 多阶段决策过程的最优化问题。 在现实生活中,有一类活动的过程,由于它的特殊性,可将过程分成若干个互相联系的阶段,在它的每一阶段都需要作出决策,从而使整个过程达到最好的活动效果。当然,各个阶段决策的选取不是任意确定的,它依赖于当前面临的状态,又影响以后的发展,当各个阶段决策确定后,就组成一个决策序列,因而也就确定了整个过程的一条活动路线,如图所示:(看词条图) 这种把一个问题看作是一个前后关联具有链状结构的多阶段过程就称为多阶段决策过程,这种问题就称为多阶段决策问题。 记忆化搜索 给你一个数字三角形, 形式如下: 1 2 3 4 5 6 7 8 9 10 找出从第一层到最后一层的一条路,使得所经过的权值之和最小或者最大. 无论对与新手还是老手,这都是再熟悉不过的题了,很容易地,我们写出状态转移方程:f(i, j)=a[i, j] + min{f(i+1, j),f(i+1, j + 1)} 对于动态规划算法解决这个问题,我们根据状态转移方程和状态转移方向,比较容易地写出动态规划的循环表示方法。但是,当状态和转移非常复杂的时候,也许写出循环式的动态规划就不是那么

基于随机提前期的库存模型的规划周期word参考模板

随机提前期库存模型的规划周期 摘要:相关的规划周期的文献都大量地致力于分析具有确定提前期的库存系统。我们证明了,在某种情况下,相关的规划周期理论也适用于具有随机提前期的情况。特别的,当生产需求被认为是不可替换的以及确定的,这时生产运作只能被设置成符合这种特殊要求的并且也只适合于满足这种要求的情况。当持有订单、退订单、下订单时,在可变生产成本不变,并且销售提前期不变的情况下,按照一系列连续的整体的生产要求进行生产时总是最优的策略。特定发货量的生产日期具有凸性性质。基于以上的结论,我们证明了一些规划周期理论。并给出了远期的动态规划递归方法。这些结论被归纳为基本动态订购数量模型。我们呈现了几个案例用以阐述最优策略对提前期变化的灵敏度。 对于动态订购数量问题的规划周期的探索具有远远超越计算存储方法的优势。在许多情况下,对于下一个最佳生产决策的判断是最重要的,因为这些事项常常需要定期得到解决以纳入改善后的信息。这将导致在有限时间内的周期问题的自然停止法则,并随后降低获取和探索信息的成本。Lundin和Morton二人近来集成了规划周期的相关文献,将它们作为一个整体进行研究。至目前为止,这项研究已经致力于分析具有确定提前期的库存系统。这篇文章的主要目的是证明在某些假设下一些周期规划的理论和概念也可以被归纳为随机提前期的情况。 Gross和Soriano以及Vinson的研究清楚地证明了提前期变动

对库存成本有重大影响。然而文献间也存在差异,部分是由于连续提前期和随机提前期对库存系统的影响的根本区别。当提前期是连续的,所有的订单都将按照事先设置的顺序先后到达。当提前期是独立的随机变量,

动态规划经典教程

动态规划经典教程 引言:本人在做过一些题目后对DP有些感想,就写了这个总结: 第一节动态规划基本概念 一,动态规划三要素:阶段,状态,决策。 他们的概念到处都是,我就不多说了,我只说说我对他们的理解: 如果把动态规划的求解过程看成一个工厂的生产线,阶段就是生产某个商品的不同的环节,状态就是工件当前的形态,决策就是对工件的操作。显然不同阶段是对产品的一个前面各个状态的小结,有一个个的小结构成了最终的整个生产线。每个状态间又有关联(下一个状态是由上一个状态做了某个决策后产生的)。 下面举个例子: 要生产一批雪糕,在这个过程中要分好多环节:购买牛奶,对牛奶提纯处理,放入工厂加工,加工后的商品要包装,包装后就去销售……,这样没个环节就可以看做是一个阶段;产品在不同的时候有不同的状态,刚开始时只是白白的牛奶,进入生产后做成了各种造型,从冷冻库拿出来后就变成雪糕(由液态变成固态=_=||)。每个形态就是一个状态,那从液态变成固态经过了冰冻这一操作,这个操作就是一个决策。 一个状态经过一个决策变成了另外一个状态,这个过程就是状态转移,用来描述状态转移的方程就是状态转移方程。 经过这个例子相信大家对动态规划有所了解了吧。 下面在说说我对动态规划的另外一个理解: 用图论知识理解动态规划:把动态规划中的状态抽象成一个点,在有直接关联的状态间连一条有向边,状态转移的代价就是边上的权。这样就形成了一个有向无环图AOE网(为什么无环呢?往下看)。对这个图进行拓扑排序,删除一个边后同时出现入度为0的状态在同一阶段。这样对图求最优路径就是动态规划问题的求解。 二,动态规划的适用范围 动态规划用于解决多阶段决策最优化问题,但是不是所有的最优化问题都可以用动态规划解答呢? 一般在题目中出现求最优解的问题就要考虑动态规划了,但是否可以用还要满足两个条件: 最优子结构(最优化原理) 无后效性 最优化原理在下面的最短路径问题中有详细的解答; 什么是无后效性呢? 就是说在状态i求解时用到状态j而状态j就解有用到状态k…..状态N。 而求状态N时有用到了状态i这样求解状态的过程形成了环就没法用动态规划解答了,这也是上面用图论理解动态规划中形成的图无环的原因。 也就是说当前状态是前面状态的完美总结,现在与过去无关。。。 当然,有是换一个划分状态或阶段的方法就满足无后效性了,这样的问题仍然可以用动态规划解。 三,动态规划解决问题的一般思路。 拿到多阶段决策最优化问题后,第一步要判断这个问题是否可以用动态规划解决,如果不能就要考虑搜索或贪心了。当却定问题可以用动态规划后,就要用下面介绍的方法解决问题了:(1)模型匹配法: 最先考虑的就是这个方法了。挖掘问题的本质,如果发现问题是自己熟悉的某个基本的模型,就直接套用,但要小心其中的一些小的变动,现在考题办都是基本模型的变形套用时要小心条件,三思而后行。这些基本模型在先面的分类中将一一介绍。 (2)三要素法 仔细分析问题尝试着确定动态规划的三要素,不同问题的却定方向不同: 先确定阶段的问题:数塔问题,和走路问题(详见解题报告) 先确定状态的问题:大多数都是先确定状态的。 先确定决策的问题:背包问题。(详见解题报告) 一般都是先从比较明显的地方入手,至于怎么知道哪个明显就是经验问题了,多做题就会发现。 (3)寻找规律法: 这个方法很简单,耐心推几组数据后,看他们的规律,总结规律间的共性,有点贪心的意思。 (4)边界条件法 找到问题的边界条件,然后考虑边界条件与它的领接状态之间的关系。这个方法也很起效。 (5)放宽约束和增加约束 这个思想是在陈启锋的论文里看到的,具体内容就是给问题增加一些条件或删除一些条件使问题变的清晰。 第二节动态规划分类讨论

动态规划习题精讲

信息学竞赛中的动态规划专题 哈尔滨工业大学周谷越 【关键字】 动态规划动机状态典型题目辅助方法优化方法 【摘要】 本文针对信息学竞赛(面向中学生的Noi以及面向大学生的ACM/ICPC)中的动态规划算法,从动机入手,讨论了动态规划的基本思想和常见应用方法。通过一些常见的经典题目来归纳动态规划的一般作法并从理论上加以分析和说明。并介绍了一些解决动态规划问题时的一些辅助技巧和优化方法。纵观全文可知,动态规划的关键在于把握本质思想的基础上灵活运用。 【目录】 1.动态规划的动机和基本思想 1.1.解决重复子问题 1.2.解决复杂贪心问题 2.动态规划状态的划分方法 2.1.一维状态划分 2.2.二维状态划分 2.3.树型状态划分 3.动态规划的辅助与优化方法 3.1.常见辅助方法 3.2.常见优化方法 4.近年来Noi动态规划题目分析 4.1 Noi2005瑰丽华尔兹 4.2 Noi2005聪聪与可可 4.3 Noi2006网络收费 4.4 Noi2006千年虫 附录参考书籍与相关材料

1.动态规划的动机和基本思想 首先声明,这里所说的动态规划的动机是从竞赛角度出发的动机。 1.1 解决重复子问题 对于很多问题,我们利用分治的思想,可以把大问题分解成若干小问题,然后再把各个小问题的答案组合起来,得到大问题的解答。这类问题的共同点是小问题和大问题的本质相同。很多分治法可以解决的问题(如quick_sort,hanoi_tower等)都是把大问题化成2个以内的不相重复的小问题,解决的问题数量即为∑(log2n / k)。而考虑下面这个问题: USACO 1.4.3 Number Triangles http://122.139.62.222/problem.php?id=1417 【题目描述】 考虑在下面被显示的数字金字塔。 写一个程序来计算从最高点开始在底部任意处结束的路径经过数字的和的最大。每一步可以走到左下方的点也可以到达右下方的点。 7 3 8 8 1 0 2 7 4 4 4 5 2 6 1 在上面的样例中,从7到3到8到7到5的路径产生了最大和:30。 【输入格式】 第一个行包含R(1<= R<=1000) ,表示行的数目。后面每行为这个数字金字塔特定行包含的整数。所有的被供应的整数是非负的且不大于100。 【输出格式】 单独的一行包含那个可能得到的最大的和。 【样例输入】 5 7 3 8 8 1 0 2 7 4 4 4 5 2 6 1 【样例输出】 30 显然,我们同样可以把大问题化成小问题来解决。如样例中最底层的6就可以从次底层

动态规划经典案例详解(背包问题)

动态规划经典案例详解之背包问题 【摘要】本文主要从动态规划经典案例——背包问题的动态规划设计思路出发,结合具体实例,对动态规划在程序设计中的典型应用以及衍生拓展进行详细分析。 【关键字】动态规划信息学奥赛0/1背包问题 动态规划并非一个算法,而是一种解题的思路,其核心思想是通过使用大量的存储空间把中间结果记录下来,大大减少重复计算的时间,从而提高的程序的执行效率,因为信息学奥林匹克复赛题目的解决程序一般是有时间限制的,对于某些用搜索必然耗费大量时间的题目,动态规划几乎是唯一的选择。但是动态规划并没有一个简单的模型可以套用,对于每个不同的题目都有对应的不同规划思路,我们只能通过对一些动态规划经典案例的学习来训练自己的动态规划思维能力,从而以不变应万变,应付各种复杂的程序设计,本文通过对动态规划经典案例之一的背包问题进行详细阐述,旨在让学生了解动态规划和搜索的不同设计思路以及动态规划的优越性。 【原型例题】 从n个物品中选取装入背包的物品,每件物品i的重量为wi,价值为pi。求使物品价值最高的选取方法。 【输入文件】 第一行一个数c,为背包容量。 第二行一个数n,为物品数量 第三行n个数,以空格间隔,为n个物品的重量 第四行n个数,以空格间隔,为n个物品的价值 【输出文件】 能取得的最大价值。 【分析】 初看这类问题,第一个想到的会是贪心,但是贪心法却无法保证一定能得到最优解,看以下实例: 贪心准则1:从剩余的物品中,选出可以装入背包的价值最大的物品,利用这种规则,价值最大的物品首先被装入(假设有足够容量),然后是下一个价值最大的物品,如此继续下去。这种策略不能保证得到最优解。例如,考虑n=2,w=[100,10,10],p=[20,15,15],c=105。当利用价值贪婪准则时,获得的解为x=[1,0,0],这种方案的总价值为20。而最优解为[0,1,1],其总价值为30。 贪心准则2:从剩下的物品中选择可装入背包的重量最小的物品。虽然这种规则对于前面的例子能产生最优解,但在一般情况下则不一定能得到最优解。考虑n=2,w=[10,20], p=[5,100],c=25。当利用重量贪婪策略时,获得的解为x=[1,0],比最优解[0,1]要差。

数学建模案例分析--最优化方法建模6动态规划模型举例

§6 动态规划模型举例 以上讨论的优化问题属于静态的,即不必考虑时间的变化,建立的模型——线性规划、非线性规划、整数规划等,都属于静态规划。多阶段决策属于动态优化问题,即在每个阶段(通常以时间或空间为标志)根据过程的演变情况确定一个决策,使全过程的某个指标达到最优。例如: (1)化工生产过程中包含一系列的过程设备,如反应器、蒸馏塔、吸收器等,前一设备的输出为后一设备的输入。因此,应该如何控制生产过程中各个设备的输入和输出,使总产量最大。 (2)发射一枚导弹去击中运动的目标,由于目标的行动是不断改变的,因此应当如何根据目标运动的情况,不断地决定导弹飞行的方向和速度,使之最快地命中目标。 (3)汽车刚买来时故障少、耗油低,出车时间长,处理价值和经济效益高。随着使用时间的增加则变得故障多,油耗高,维修费用增加,经济效益差。使用时间俞长,处理价值也俞低。另外,每次更新都要付出更新费用。因此,应当如何决定它每年的使用时间,使总的效益最佳。 动态规划模型是解决这类问题的有力工具,下面介绍相关的基本概念及其数学描述。 (1)阶段 整个问题的解决可分为若干个相互联系的阶段依次进行。通常按时间或空间划分阶段,描述阶段的变量称为阶段变量,记为k 。 (2)状态 状态表示每个阶段开始时所处的自然状况或客观条件,它描述了研究过程的状况。各阶段的状态通常用状态变量描述。常用k x 表示第k 阶段的状态变量。n 个阶段的决策过程有1+n 个状态。用动态规划方法解决多阶段决策问题时,要求整个过程具有无后效性。即:如果某阶段的状态给定,则此阶段以后过程的发展不受以前状态的影响,未来状态只依赖于当前状态。 (3)决策 某一阶段的状态确定后,可以作出各种选择从而演变到下一阶段某一状态,这种选择手段称为决策。描述决策的变量称为决策变量。决策变量限制的取值范围称为允许决策集合。用)(k k x u 表示第k 阶段处于状态k x 时的决策变量,它是k x 的函数,用)(k k x D 表示k x 的允许决策集合。 (4)策略 一个由每个阶段的决策按顺序排列组成的集合称为策略。由第k 阶段的状态k x 开始到终止状态的后部子过程的策略记为)}(,),(),({)(11n n k k k k k k x u x u x u x p Λ++=。在实际问题中,可供选择的策略有一定范围,称为允许策略集合。其中达到最优效果的策略称为最优策略。 (5)状态转移方程 如果第k 个阶段状态变量为k x ,作出的决策为k u ,那么第1+k 阶段的状态变量1+k x 也被完全确定。用状态转移方程表示这种演变规律,写作(1k k T x =+k x ,)k u (6)最优值函数 指标函数是系统执行某一策略所产生结果的数量表示,是用来衡量策略优劣的数量指标,它定义在全过程和所有后部子过程上。指标函数的最优值称为最优值函数。 下面的方程在动态规划逆序求解中起着本质的作用。

动态规划matlab仿真实例

动态规划在火力分配中的应用。 1.问题描述 设有m个目标,目标价值(重要性和危害性)各不相同,用数值A K(K=1,2,..m)表示,计划用n枚导弹突袭,导弹击毁目标的概率P K=,其中是常数,取决于导弹的特性与目标的性质;为向目标发射的导弹数,问题:做出方案使预期的突击效果最大。 2.问题建模 上述问题可以表述为 约束条件为 (为非负整数) 3.算法描述 下面通过一个实例说明:设目标数目为4(m=4),导弹为5(n=5),和a K取值情况如下表所示: 表1:A k 取值情况 目标K 1 2 3 4 8 7 6 3 0.2 0.3 0.5 0.9 将火力分配可分为4个阶段,每个阶段指标函数为:

可能取值为0,1,2,3,4,5,将函数值带人如下表: 表2 函数值 u 0 0 0 0 0 1 1.45 1.81 2.36 1.79 2 2.64 3.16 3.79 2.51 3 3.61 4.15 4.66 2.81 4 4.41 4.89 5.19 2.93 5 5.0 6 5.44 5.51 2.97 动态规划问题基本方程为: c =0 逐次向前推一级 K=4 K=3 K=2 K=1 () 只需要求解的最大值然后反推回去就可以获得最优的分配方案

4.Matlab仿真求解 因为与取值为整数,可以采用动态规划的方法,获得的最大值,对应的

最优方案 function[p_opt,fval]=dynprog(x,DecisFun,SubObjFun,TransFun,ObjFun) %求解动态规划问题最小值函数 k=length(x(1,:)) %判断决策级数 x_isnan=~isnan(x); % 非空状态矩阵 t_vubm=inf*ones(size(x)); % 性能指标中间矩阵 f_opt=nan*ones(size(x)); % 总性能指标矩阵 d_opt=f_opt; %每步决策矩阵 tmp1=find(x_isnan(:,k)); % 最后一步状态向量 tmp2=length(tmp1); % 最后一步状态个数 for i=1:tmp2 u=feval(DecisFun,k,x(tmp1(i),k)); tmp3=length(u);%决策变量 for j=1:tmp3 % 求出当前状态下所有决策的最小性能指标 tmp=feval(SubObjFun,k,x(tmp1(i),k),u(j)); if tmp <= t_vubm(i,k) %t_vub f_opt(i,k)=tmp; d_opt(i,k)=u(j); t_vubm(i,k)=tmp; end; end; end for ii=k-1:-1:1 tmp10=find(x_isnan(:,ii)); tmp20=length(tmp10); for i=1:tmp20 %求出当前状态下所有可能的决策 u=feval(DecisFun,ii,x(tmp10(i),ii)); tmp30=length(u) ; for j=1:tmp30 % 求出当前状态下所有决策的最小性能指标 tmp00=feval(SubObjFun,ii,x(tmp10(i),ii),u(j)); % 单步性能指标 tmp40=feval(TransFun,ii,x(tmp10(i),ii),u(j)); % 下一状态 tmp50=x(:,ii+1)-tmp40; % 找出下一状态在 x 矩阵的位置 tmp60=find(tmp50==0) ; if~isempty(tmp60) if nargin<6 %矩阵不同需要修改nargin的值,很重要 tmp00=tmp00+f_opt(tmp60(1),ii+1); % set the default object value else tmp00=feval(ObjFun,tmp00,f_opt(tmp60(1),ii+1)); end %当前状态的性能指标 if tmp00<=t_vubm(i,ii) f_opt(i,ii)=tmp00; d_opt(i,ii)=u(j);

动态规划典型例题

1、单调递增最长子序列 描述 求一个字符串的最长递增子序列的长度 如:dabdbf最长递增子序列就是abdf,长度为4 输入 第一行一个整数0

2、最长公共子序列 描述 如题,需要写一个程序,得出最长公共子序列。 tip:最长公共子序列也称作最长公共子串(不要求连续),英文缩写为LCS(Longest Common Subsequence)。其定义是,一个序列S ,如果分别是两个或多个已知序列的子序列,且是所有符合此条件序列中最长的,则S 称为已知序列的最长公共子序列。 输入 第一行给出一个整数N(0

3、括号匹配 时间限制:1000 ms | 内存限制:65535 KB 描述 给你一个字符串,里面只包含"(",")","[","]"四种符号,请问你需要至少添加多少个括号才能使这些括号匹配起来。 如: []是匹配的 ([])[]是匹配的 ((]是不匹配的 ([)]是不匹配的 输入 第一行输入一个正整数N,表示测试数据组数(N<=10) 每组测试数据都只有一行,是一个字符串S,S中只包含以上所说的四种字符, S的长度不超过100 输出 对于每组测试数据都输出一个正整数,表示最少需要添加的括号的数量。每组 测试输出占一行 样例输入 4 [] ([])[] ((] ([)] 样例输出 3 2

运筹学-电力系统规划-模型

运筹学在电力系统中的应用 运筹学的相关基础知识在电力系统中有着广泛应用,涉及最优随机潮流,电力市场中的最优潮流等等。本文就这两方面文献作详细分析。 随机潮流计算是电力系统分析的一项重要内容,有助于对整个电网在各种运行条件下的性能有一个全面、综合的评价,并对电网存在的薄弱环节做出量化分析。针对考虑负荷不确定性的随机最优潮流问题,建立相应的机会约束规划模型。基于确定性最优潮流的内点算法,以确定性负荷最优潮流计算结果为基础,通过建立状态变量的概率分布来判断概率约束是否满足。若不满足,则根据变量的分布和等效的机会约束,形成新的上下限约束,继续计算负荷为期望值时最优潮流,直至所有概率约束满足。 最优潮流是电力系统规划和运行的重要工具。经典的最优潮流问题是在网络结构和负荷功率完全确定的条件下求解满足各(物理和安全)约束的优化调度方案。但电力系统的运行时刻受到随机因素的影响和干扰:负荷功率难以精确预知、设备可能发生故障、元件参数也会发生变化。而电力工业的市场化改革给电力系统的运行带来了更多不确定性因素。因此,有学者提出了新的随机最优潮流的问题。 机会约束规划模型是一种随机规划模型,主要针对的是约束条件中含有随机变量,且必须在观测到随机变量的实现之前作出决策的情况而建立的模型。 求解机会约束规划的传统方法是根据事先给定的置信水平,把机会约束转化为各自确定的等价类,然后用传统的方法求解其等价的确定性模型。对于特殊的比较复杂的机会约束模型,可以借助一些启发式算法直接计算。 不同的研究出发点和考虑不同的随机因素,可导出多种形式的随机最优潮流的问题。最优潮流与概率最优潮流(Probabilistic Optimal PowerFlow, POPF)也是有区别的。概率最优潮流的主要目标根据负荷等因素的概率分布获得状态变量的概率分布函数,随机因素一般不影响最优潮流的计算结果;而随机最优潮流在建立模型和优化计算过程中考虑随机因素的影响,随机因素影响计算的过程和最终的结果。 在给出随机最优潮流基本模型的基础上,讨论了在考虑不同随机因素条件下SOPF的线性随机规划模型和求解方法。而之后的研究者在文献中使用随机最优潮流考虑了元件的随机故障,目标是得到基准条件下运行费用与校正各预想故障的期望费用之和最小的调度方案。再之后考虑了负荷的不确定性,优化的目标是使有功损耗的方差最小。以下列出随机最优潮流的机会约束规划模型。 在仅考虑负荷的不确定性,不考虑发电机和线路的随机故障的情况下,以发

1_6237190_两阶段随机规划的若干算法及应用研+究

论文题目: 两阶段随机规划的若干算法及应用研究 作者姓名:刘敬生入学时间:2006年9月专业名称:概率论与数理统计研究方向:统计理论与应用指导教师:周长银职称:副教授 论文提交日期:2009年5月 论文答辩日期:2009年6月 授予学位日期:

STUDY OF SOME ALGORITHMS FOR TWO-STAGE APPLICATIONS ITSAPPLICATIONS STOCHASTIC PROGRAM AND ITS A Dissertation submitted in fulfillment of the requirements of the degree of MASTER OF SCIENCE from Shandong University of Science and Technology b y Liu Jingsheng Supervisor:Vice Professor Zhou Changyin College of Information Science and Engineering May2009

声明 本人呈交给山东科技大学的这篇硕士学位论文,除了所列参考文献和世所公认的文献外,全部是本人在导师指导下的研究成果。该论文资料尚没有呈交于其它任何学术机关作鉴定。 硕士生签名: 日期: AFFIRMATION I declare that this dissertation,submitted in fulfillment of the requirements for the award of Master of Science in Shandong University of Science and Technology,is wholly my own work unless referenced of acknowledge.The document has not been submitted for qualification at any other academic institute. Signature: Date:

动态规划入门(论文)

动态规划思想入门 作者:陈喻(2008年10月7日)关键字:动态规划,最优子结构,记忆化搜索 引言 动态规划(dynamic programming)是运筹学的一个分支,是求解决策过程(decisionprocess)最优化的数学方法。20世纪50年代初美国数学家R.E.Bellman等人在研究多阶段决策过程(multistep decision process)的优化问题时,提出了著名的最优化原理(principle of optimality),把多阶段过程转化为一系列单阶段问题,逐个求解,创立了解决这类过程优化问题的新方法——动态规划。1957年出版了他的名著Dynamic Programming,这是该领域的第一本著作。 动态规划问世以来,在经济管理、生产调度、工程技术和最优控制等方面得到了广泛的应用。例如最短路线、库存管理、资源分配、设备更新、排序、装载等问题,用动态规划方法比用其它方法求解更为方便。 虽然动态规划主要用于求解以时间划分阶段的动态过程的优化问题,但是一些与时间无关的静态规划(如线性规划、非线性规划),只要人为地引进时间因素,把它视为多阶段决策过程,也可以用动态规划方法方便地求解。 动态规划的基本思想 动态规划是:将待求的问题分解成若干个相互联系的子问题,先求解子问题,然后从这些子问题的解得到原问题的解;对于重复出现的子问题,只在第一次遇到的时候对它直接求解,并把答案保存起来,让以后再次遇到是直接引用答案,不必从新求解,其实质是分治思想和解决冗余。

例1:求A—>B的最短路径 图1 这是一个利用动态规划思想的经典问题,通过直接观察图1我们可以枚举出20多条路径,并可以计算出其中最短的路径长度为16

动态规划例1求解下列整数规划的最优解

例1 求解下列整数规划的最优解: ()123 123max 45634510..01,2,3,j j Z x x x x x x s t x j x =++++???=??≤≥为整数. 解 (1)建立动态规划模型: 阶段变量:将给每一个变量j x 赋值看成一个阶段,划分为3个阶段,且阶段变量k=1,2,3. 设状态变量k s 表示从第k 阶段到第3阶段约束右端最大值,则10.j s = 设决策变量k x 表示第k 阶段赋给变量k x 的值(1,2,3)k =. 状态转移方程:2113223,4.s s x s s x =-=- 阶段指标:111122223333(,)4,(,)5,(,)6.u s x x u s x x u s x x === 基本方程; ()(){}()3113,2,1044 ()max ,()0.s k k k k k k k k k k x a f s u s x f s f s ++??=????? ??=+???=?≤≤ 其中1233,4, 5.a a a === (1) 用逆序法求解: 当3k =时, ()(){}{}33333443330055max 6max 6,s s x x f s x f s x ???? ?? ?? ?????? ?? =+=≤≤≤ 而{}[]30,1,2,3,4,5,6,7,8,9,10.s x ∈表示不超过x 的最大整数。因此,当30,1,2,3,4s =时, 30x =;当35,6,7,8,9s =时,3x 可取0或1;当310s =时,3x 可取0,1,2,由此确定()33. f s 现将有关数据列入表中 表中.

灾害管理随机规划

摘要:我们提出了一种随机优化方法,用于在各种可能的灾害类型和数量下用于灾害管理的医疗物资的存储和分配问题。为了准备灾难,我们开发了随机编程模型,以选择医疗物资的存储位置,并为每种类型的医疗物资提供所需的库存水平。我们的模型通过使用灾难情景来捕捉灾害的具体信息和灾害的可能影响。因此,尽管存在灾难事件的不确定性,我们仍然保持准备和风险的平衡。这种方法的好处是,鉴于评估最新的灾害现场信息,子问题可用于建议车辆的载运和路由运输用于灾害应对的医疗物资。我们提出了西雅图地区地震情景灾害规划随机优化方法的案例研究。我们的建模方法可以帮助跨学科机构准备和应对灾害,以有效的方式考虑风险。 1、介绍 支持灾害管理准备活动的决定是具有挑战性的,因为事件的不确定性,需要平衡备灾和风险以及部分信息和数据造成的复杂情况。我们介绍一个随机方案,规划在易受地震影响的西雅图地区紧急情况下使用的医疗物资的储存和分配。在事件发生之前,我们确定医疗物资的存储位置和库存水平,以平衡自身发生地震损害的风险,同时快速分配到危险区域。该研究是在战略信息资源的地理空间优化的优化平台中开发的,该优化平台是华盛顿大学太平洋区域可视化分析中心(PARVAC)的一部分。优化模型的输出是可视化的模拟(Campbell et al。,2008)。在西雅图地区,医院使用自己的或共享的仓库来存放一段时间(例如30天)的日常生活中足够的医疗物资清单。我们的目标是选择相同仓库的适当子集,以便在发生地震时及时交付医疗物资,以便为灾后使用储存额外的医疗物资。例如,我们的模式可能建议特定仓库存储32天的医疗物资,而不是30天,以更好地准备灾难。我们随机编程模型中的一个子问题产生了替代运输计划,包括车辆和路线的数量,将医疗物资从其存储地点运送到医院。 我们的随机方案为灾害规划小组提供了一个决策模型,用于灾害管理过程的准备和应对阶段,重点是分配医疗物资,如图1所示。1.我们开发了一个两级随机规划(SP)模型,用于准备阶段,建议从可能的仓库获得最佳的仓储位置,并确定库存水平。SP模型可以将医院的优先事项纳入特定医疗物资以及具体的灾难情景与运输和需求估计。在SP模型的第二阶段,每个情景在总体水平上确定交付给医院的医疗物资数量。该综合决策转换为混合整数规划(MIP)模型中每个场景的详细车辆分配和路由,该模型为每个仓库提供可用车辆数量的紧急运输计划以及一些预先规划的路线。在地震后的反应阶段也可以使用同样的MIP 模型,更新关于道路状况的信息,医疗物资的需求以及医疗物资的可用性,以便相对较快地提供具有详细路线的修订交通计划。 本文的其余部分组织如下。第二部分对随机方面的灾害管理文献进行了综述。在第3节中,我们介绍了用于备灾医疗物资仓库选择和存储的两阶段SP模型。将SP子问题的解决方案转换为车辆分配和路由的MIP模型在第4节中。在第5节中,我们提出了西雅图地区潜在地震的案例研究。我们在第6节讨论我们的方法的实际实现问题。最后,我们在第7节中提供我们的结论和观察。 2、文献回顾 我们首先讨论灾害管理文献,利用确定性和概率方法讨论应急供应的位置,然后再使用基于情景的方法(包括随机规划)来管理灾害准备的不确定性。 Brotcorne等人(2003年)将救护车和其他紧急车辆的位置和分配分为三种模式类型:确定性模型,概率排队模型和动态模型。Jia et al。(2007a)审查了用于建模较小规模紧急情况的确定性和概率设施位置模型,并引入了三个确定性模型:提供距离限制内的需求点覆盖的覆盖模型,确定性P median模型,最小化需求之间的总距离设备和P center模型,通过最小化任何需求点与其最近服务中心之间的最大距离来优化系统最差性能。此外,Jia 等(2007b)提出了用于大规模紧急情况的医疗物资设施定位的启发式解决方案。它们通过要求多个供应点来解决医疗物资的需求不确定性和不足。对于救济行动的类似设置,Tzeng et

相关文档
相关文档 最新文档