基本动态规划问题的扩展

基本动态规划问题的扩展

应用动态规划可以有效的解决许多问题,其中有许多问题的数学模型,尤其对一些自从57年就开始研究的基本问题所应用的数学模型,都十分精巧。有关这些问题的解法,我们甚至可以视为标准——也就是最优的解法。不过随着问题规模的扩大化,有些模型显出了自身的不足和缺陷。这样,我们就需要进一步优化和改造这些模型。

  • 程序上的优化:

程序上的优化主要依赖问题的特殊性。我们以f(XT)= opt{f(uT)}+ A(XT), uTΠPred_Set(XT)这样的递推方程式为例(其中A(XT)为一个关于XT的确定函数,Pred_Set(XT)表示XT的前趋集)。我们设状态变量XT的维数为t,每个XT与前趋中有e维改变,则我们可以通过方程简单的得到一个时间复杂度为O(nt+e)的算法。

当然,这样的算法并不是最好的算法。为了简化问题,得到一个更好的算法。我们设每个XT所对应的g(XT)=opt{f(uT)},则f(XT)=g(XT)+A(XT),问题就变为求g(XT)的值。下面分两个方面讨论这个问题:

        1. Pred_Set(XT)为连续集:

在这样的情况下,我们可以用g(XT)= opt{g(Pred(XT)), f(Pred(XT))}这样一个方程式来求出g(XT)的值,并再用g(XT)的值求出f(XT)的值。这样,虽然我们相当于对g(XT)f(XT)分别作了一次动态规划,但由于两个规划是同时进行的,时间复杂度却降为了O(nt)。由于我们在实际使用中的前趋即通常都是连续的,故这个方法有很多应用。例如IOI’99的《小花店》一题就可以用该方法把表面上的时间复杂度O(FV2)降为O(FV)

        1. Pred_Set(XT)为与XT有关的集合:

这样的问题比较复杂,我们以最长不下降子序列问题为例。规划方程为:f(i)=max{f(j)}+1, d[i] d[j]; i>j。通常认为,这个问题的最低可行时间复杂度为O(n2)。不过,这个问题只多了一个d[i]≥d[j]的限制,是不是也可以优化呢?我们注意到max{f(j)}的部分,它的时间复杂度为O(n)。但对于这样的式子,我们通常都可以用一个优先队列来使这个max运算的时间复杂度降至O(log n)。对于该问题,我们也可以用这样的方法。在计算d[i]时,我们要先有一个平衡排序二叉树(例如红黑树)对d[1]~d[i-1]进行排序。并且我们在树的每一个节点新增一个MAX域记录它的左子树中的函数f的最大值。这样,我们在计算f(i)时,只需用O(log n)时间找出不比d[i]大的最大数所对应的节点,并用O(1)的时间访问它的MAX域就可以得出f(i)的值。并且,插入操作和更新MAX域的操作也都只用O(log n)的时间(我们不需要删除操作),故总时间复杂度为O(n log n)。实际运行时这样的程序也是十分快的,n=10000时用不到1秒就可以得出结果,而原来的程序需要30秒。

从以上的讨论可以看出,再从程序设计上对问题优化时,要尽量减少问题的约束,尽可能的化为情况1。若不可以变为情况1,那么就要仔细考虑数据上的联系,设计好的数据结构来解决问题。

  • 方程上的优化:

对于方程上的优化,其主要的方法就是通过某些数学结论对方程进行优化,避免不必要的运算。对于某一些特殊的问题,我们可以使用数学分析的方法对写出的方程求最值,这样甚至不用状态之间的递推计算就可以解决问题。不过用该方法解决的问题数量是在有限,并且这个方法也十分复杂。不过,却的确有相当数量的比较一般的问题,在应用某些数学结论后,可以提高程序的效率。

一个比较典型的例子是最优排序二叉树问题(CTSC96)。它的规划方程如下:

在递推时,阶段之间时没有优化的余地的,故优化的重点就在于这个方程的优化上。我们用B[i, j]表示D[i]+w(i, j),而原算法就是求出B并对每一列求最小值。

事实上,这一题的w有其特殊的性质:

对于a£ b£ c£ d,我们有w(a, c)+ w(b, d)£ w(a, d)+ w(b, c)

这一性质对解题是应该有所帮助的。仿照上例,在两侧加上D[a]+ D[b],可得B[a, c]+ B[b, d]£ B[a, d]+ B[b, c]

也就是说,若B[a, c]³ B[b, c],则有B[a, d]³ B[b, d]。于是我们在确定了B[a, c]B[b, c]的大小关系之后,就可以决定是不是需要比较B[a, d]B[b, d]的大小。

更进一步的,我们只要找出满足B[a, h]³ B[b, h]的最小的h,就可以免去h之后对第a列的计算。而这样的h,我们可以用二分查找法在O(log n)时间内找到(若w更特殊一些,例如说是确定的函数,我们甚至可以在O(1)的时间找到)。并且对于每一行来说,都只需要执行一次二分查找。在求出所有的h之后,只需用O(n)的时间对每列的第h行求值就可以了。这样得出的总时间为O(n)+O(n log n)= O(n log n)。至于程序设计上的问题,虽然并不复杂,但不是15分钟所可以解决的,也不是重点,略过不谈。[2]不过由于该题目可以用滚动数组的技巧解决空间的问题,故在大数据量时该算法有优异的表现。

从上面的叙述可以看出,对于方程的优化主要取决于权函数w的性质。其中应用最多的就是w(a, c)+ w(b, d)£ w(a, d)+ w(b, c)这个不等式。实际上,这个式子被称作函数的凸性判定不等式。在实际问题中,权函数通常都会满足这个不等式或这是它的逆不等式。故这样的优化应用是比较广泛的。还有许多特殊的不等式,若可以在程序中应用,都可以提高程序的效率。

  • 从低维向高维的转化:

在问题扩大规模时,有一种方式就是扩大问题的维数。这时,规划时决策变量的维数也要增加。这样,存储的空间也要随着成指数级增加,导致无法存储下所有的状态,这就是动态规划的维数灾难问题。如果我们还要在这种情况下使用动态规划,那么就要使用极其复杂的数学分析方法。对于我们来说,使用这种方法显然是不现实的。这时,我们就需要改造动态规划的模型。通常我们都可以把这时的动态规划模型变为网络流模型。

对于模型的转化方法,我们有一些一般的规律。若状态转移方程只与另一个状态有关,我们可以肯定得到一个最小费用最大流的模型[3]。这个模型必然有其规律的地方,甚至用对偶算法在对网络流的求解时也还要用到动态规划的方法。不过这不是重点,我们关心的只是动态规划问题如何转化。例如说IOI’97《火星探测器》一题。这一题的一维模型是可以用动态规划来解决的(这里的维数概念是指探测器的数目)。在维数增加时,我们就可以用该方法来用网络流的方法解决问题。

除此之外,还有许多问题可以用该方法解决。例如最长区间覆盖问题,在维数增加时也同样可以用该方法解决。更进一步来说,甚至图论的最短路问题也可以做同样的转化来求出特殊的最短路。不过一般来说转化后流量最大为1,有许多特殊的性质也没有得到应用,并且些复杂的动态规划问题还无法转化为网络流问题(例如说最优二叉树问题),故标准的网络流算法显然有些浪费,它的解决还需要进一步的研究。

参考文献:

[EGG88] David Eppstein, Zvi Galil and Raffaele Giancarlo, Speeding up Dynamic Programming

[GP90] Zvi Galil and Kunsoo Park, Dynamic Programming with Convexity, Concavity, and Sparsity


[附录]

  1. C[i, j]的凸性是指对于任意的a£ b£ c£ d,都有C[a, c]+ C[b, d]£ C[a, d]+ C[b, c]。它的证明如下:

我们设k=Kb,c,则有C[a, c]+ C[b, d]£ C[a, k-1]+ C[k, c]+ C[b, k-1]+ C[k, d]+ w(a, c)+ w(b, d)= C[a, k-1]+ C[k, d]+ w(a, d)+ C[b, k-1]+ C[k, c]+ w(b, c)= C[a, d]+ C[b, c]。得证。

  1. 有关这个问题的伪代码如下:

begin

  E[1]ßD[1];

  Queue.Add(K:1, H:n);

  for jß2 to n do

  begin

    if B(j-1, j)£ B(Queue.K[head], j) then

    begin

      E[j]ßB(j-1, j);

      Queue.Empty;

      Queue.Add(K:j-1, H:n+1);

    end else

    begin

      E[j]ßB(Queue.K[head], j);

      while B(j-1, Queue.H[tail-1])£ B(Queue.K[tail], Queue.H[tail-1]) do Queue.Delete(tail);

      Queue.H[tail]ßh(Queue.K[tail], j-1);

      if h_OK then Queue.Add(K:j-1, H:n+1);

    end;

    if Queue.H[head]=j+1 then Queue.SkipHead;

  end;

end;

其中的队列Queue可以称作备选队列,其中的队列头为第j行的最小值,并假设Queue.H[0]=j。其中的h(a, b)函数是用二分查找法查找B(a, h)³ B(b, h)的最小的h值,h_OK为查找成功与否的标志。在备选队列Queue中的数据(K:ir, H:hr)的意义是:当行数在区间[hr-1, hr-1]的范围内时,第ir列为最小值。我们知道,动态规划实际是求无向图的最短路的一种方法,故我们可以把动态规划中的每一个状态看成一个点,并将状态的转移过程变为一个图。在转化为最小费用最大流时,我们把这一个点拆成两个点,一个出点和一个入点,所有指向原来这个点的边都与入点相连,且所有由原来这个点发出的边现都以出点为起点。原来的边的容量设为正无穷,边权值一般不变。新增的入点与出点之间连一条边,它的权值为点权值,容量为每一点可以经过的次数(一般为一)。并且建立一个超级源和一个超级汇,并与可能的入点和出点连边。若有必要,超级源(或汇)也要拆成两个点,并且两个点之间的边的容量为最大的可能容量,边权值为0。这样,用最小费用流的方法得出的解就是该问题多维情况下的接。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/70064.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Vue组件库

Vue组件库 ViteVue3TypescriptTSX 1、项目搭建 1.1、创建项目(yarn) D:\WebstromProject>yarn create vite yarn create v1.22.19 [1/4] Resolving packages... [2/4] Fetching packages... [3/4] Linking dependencies... [4/4] Building fresh pa…

为新手和非技术人员提供扩展Web网站提供一个升级指南

本指南总结了扩展的基本原则,从一台服务器扩展到能够服务数百万用户的Web应用程序。它面向在技术领域工作的新手和非开发人员。因此,如果您刚刚部署了您的多云平台VPN设置,那么本文并不适合您。 话不多说,那就让我们开始吧&#x…

基于灰狼优化(GWO)、帝国竞争算法(ICA)和粒子群优化(PSO)对梯度下降法训练的神经网络的权值进行了改进(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

存储过程的学习

1,前言 这是实习期间学习的,我可能是在学校没好好听课,(或者就是学校比较垃,没教这部分,在公司经理让我下去自己学习,太难了,因为是公司代码很多部分都是很多表的操作&#…

SQL Server 查询数据并汇总相关技巧 23.08.08

GROUPING 是一个聚合函数,它产生一个附加的列,当用 CUBE 或 ROLLUP 运算符添加行时,附加的列输出值为1,当所添加的行不是由 CUBE 或 ROLLUP 产生时,附加列值为0。 仅在与包含 CUBE 或 ROLLUP 运算符的 GROUP BY 子句相联系的选择…

基于grpc从零开始搭建一个准生产分布式应用(1) - 开始准备

开始前必读:​​基于grpc从零开始搭建一个准生产分布式应用(0) - quickStart​​ 本来笔者并不想开设这个系列,因为工作量比较大,另外此专题的技术点也偏简单。最近复盘了下最近的工作,发现一个问题就是各个互联网大厂一般都会有…

AcWing算法提高课-4.2.3一个简单的整数问题2

宣传一下算法提高课整理 <— CSDN个人主页&#xff1a;更好的阅读体验 <— 本题链接&#xff08;AcWing&#xff09; 点这里 题目描述 给定一个长度为 N N N 的数列 A A A&#xff0c;以及 M M M 条指令&#xff0c;每条指令可能是以下两种之一&#xff1a; C l r…

嵌入式Linux下LVGL的移植与配置

一.sdk源码下载路径 1.官方源码下载路径如下: ​​​​​​ https://github.com/lvgl/lvgl git下载方式 git clone https://github.com/lvgl/lvgl.git 2.个人移植好的源码8.2版本下载路径: 链接&#xff1a;https://pan.baidu.com/s/1jyqIennsQpv-RB4RyKvZyg?pwdc68e 提取…

Spring-Cloud-Loadblancer详细分析_2

LoadBalancerClients 终于分析到了此注解的作用&#xff0c;它是实现不同服务之间的配置隔离的关键 Configuration(proxyBeanMethods false) Retention(RetentionPolicy.RUNTIME) Target({ ElementType.TYPE }) Documented Import(LoadBalancerClientConfigurationRegistrar…

电脑开不了机如何解锁BitLocker硬盘锁

事情从这里说起&#xff0c;不想看直接跳过 早上闲着无聊&#xff0c;闲着没事干&#xff0c;将win11的用户名称改成了含有中文字符的用户名&#xff0c;然后恐怖的事情发生了&#xff0c;蓝屏了… 然后就是蓝屏收集错误信息&#xff0c;重启&#xff0c;蓝屏收集错误信息&…

基于深度学习的3D城市模型增强【Mask R-CNN】

在这篇文章中&#xff0c;我们描述了一个为阿姆斯特丹 3D 城市模型自动添加门窗的系统&#xff08;可以在这里访问&#xff09;。 计算机视觉用于从城市全景图像中提取有关门窗位置的信息。 由于这种类型的街道级图像广泛可用&#xff0c;因此该方法可用于较大的地理区域。 推荐…

如何把图片转成gif?一分钟学会在线一键生成gif

平时我们在聊天的时候&#xff0c;经常会发送一下有趣的表情包&#xff0c;这些表情包是怎么做出来的呢&#xff1f;其实可以使用在线gif生成的方法&#xff0c;下面就来给大家演示一下图片制作gif&#xff08;https://www.gif.cn&#xff09;的具体步骤&#xff0c;一起来看看…

Flink学习记录

可以快速搭建一个Flink编写程序 mvn archetype:generate \-DarchetypeGroupIdorg.apache.flink \-DarchetypeArtifactIdflink-quickstart-java \-DarchetypeVersion1.17.1 \-DgroupIdcom.zxx.langhuan \-DartifactIdlanghuan-flink \-Dversion1.0.0-SNAPSHOT \-Dpackagecom.zx…

《全生命周期眼健康管理》助力健康科学用眼

8月8日下午&#xff0c;烟台正大光明眼科医院眼健康管理中心张提主任受邀来到烟台市残疾人事务综合服务中心&#xff0c;为残联康复训练教师及相关工作人员进行了《全生命周期眼健康管理》讲座。 烟台正大光明眼科医院眼健康管理中心张提主任 “全生命周期眼健康”这一理念其宗…

流水线时序调度之规避冲突

1 写在前面的&#xff1a; 其实略微一个大点的机器&#xff0c;一个测试流程需要若干个步骤&#xff0c;都可以用流水线的思维去看待它&#xff1b; 我之前也没往流水线的角度去考虑&#xff0c;那有些机器的时序调度是不好理解的&#xff0c;甚至计算个通量都很麻烦&#xff…

15-1_Qt 5.9 C++开发指南_Qt多媒体模块概述

多媒体功能指的主要是计算机的音频和视频的输入、输出、显示和播放等功能&#xff0c;Qt 的多媒体模块为音频和视频播放、录音、摄像头拍照和录像等提供支持&#xff0c;甚至还提供数字收音机的支持。本章将介绍 Qt 多媒体模块的功能和使用。 文章目录 1. Qt 多媒体模块概述2. …

pgAdmin开发工具之ERD

pgAdmin 是一个免费的 PostgreSQL 管理与开发平台&#xff0c;这篇文章介绍了它的安装与使用。 今天我们要介绍的是它的一个开发功能&#xff1a;实体关系图&#xff08;ERD&#xff09;工具。 ERD 工具可以使用图形化的方式表示数据库中的表、字段以及表之间的关系。 pgAdmin…

vue svg画渐变色线条

基于业务需求需要&#xff0c;需要使用svg画渐变色弧线并且采用虚线。并且封装成组件。 一、path路径 path路径是svg中最强大的图形&#xff0c;可以绘制各种svg所有能画的图形。 路径中的线是由d属性来绘制&#xff0c;属性参数由各种命令组成&#xff0c;以下是它的基本命…

selenium.webdriver Python爬虫教程

文章目录 selenium安装和使用 selenium安装和使用 pip install selenium 下载对应的浏览器驱动 实例化浏览器 from selenium import webdriverbrowser webdriver.Chrome()元素定位 控制浏览器

Jmeter设置中文的两种方式,建议使用第二种

方案一 进入jmeter图像化界面&#xff0c;选择Options下的Choose Language&#xff0c;再选择Chinese(Simplified)。这个就是选择语言为简体中文&#xff08;缺陷&#xff1a;这个只是在本次使用时为中文&#xff0c;下次打开默认还是英文的&#xff09; 方案二&#xff08;…