zoukankan      html  css  js  c++  java
  • 斜率优化动态规划


    • 斜率优化的作用

    Fi=min( Fj+si2+(sj+L)22si(sj+L) )F_i = min( F_j + s_i^2+(s_j+L)^2-2s_i(s_j+L) )

    形如这个式子 关于i的项关于j的项 混杂(相乘) 的状态转移方程, 可以使用斜率优化来加速 .

    接下来以优化这个式子为例说说斜率优化.


    • 斜率优化的内容

    将上方给出的式子去掉 minmin, 仅关于jj的项放在左边, 关于ii的项放在右边得

    Fj+(sj+L)2=2sisj+Fisi2+2LsiF_j+(s_j+L)^2=2s_i s_j+F_i-s_i^2+2Ls_i

    这个时候原式为 y=kx+by=kx+b 的形式, 其中

    • y=Fj+(sj+L)2y=F_j+(s_j+L)^2
    • k=2sik=2s_i
    • x=sjx=s_j
    • b=Fisi2+2Lsib=F_i-s_i^2+2Ls_i

    j[1,i)ecause j∈[1,i) 且为一个单调递增的正整数数列
    x,y herefore x,y都随 jj 单调递增.
    kecause k 始终不变
    herefore 上式代表了一个 斜率不变, 随着经过点(x,y)(x,y)的变化, 截距也随之变化的直线 .

    暂且称 (x,y)(x,y) 代表的点为 决策点,

    由于单调递增, 决策点 构成的图象为 下凸壳 , 这里给出概念图.

    备注: kbc<kcdk_{bc}<k_{cd} .

    我们需要 截距bb 最小进而使答案最优, 即找到一个最优的 决策点 .

    k线,线.color{red}{找到第一条 斜率 大于 k 的线段, 过左端点的直线 截距 即为最小值 .}


    • 斜率优化的实现

    使用 单调队列 维护, 没学过的可以看 这里 了解一下,
    具体地说:
    对上转移方程, 应当维护斜率从队首到队尾的单调递增队列,

    设当前是第 ii 个点,

    1. 不断弹出队首, 直到 队首次队首 的斜率大于等于kk 或 队列长度为 11 , 队首即为当前最优的 决策点 .
    2. 不断弹出队尾, 直到 队尾次队尾 的斜率小于 次队尾ii 的斜率, 将第 ii 个点从队尾入队(对后面来说新的决策) .

    时间复杂度 O(N)O(N) .

    经典例题


    • 斜率优化的变形

    1. kk不确定正负, 此时不能弹出队首, 但是仍然可以维护单调性, 二分查找来弥补, 时间复杂度 O(NlogN)O(NlogN) , 例题 , 下有数学解释 .
    2. 决策点的横坐标不单调递增, 需要在任意位置插入决策点, color{red}{待填坑} .

    • 相关数学推导补充

    该题 的式子为例, (已经去掉 minmin),

    F[i]=F[j]+st[i](sc[i]sc[j])+S(sc[N]sc[j])F[i] = F[j]+s_t[i]*(s_c[i]-s_c[j])+S*(s_c[N]-s_c[j])

    设 决策 jj 比 决策 kk 优, 则
    F[j]+st[i](sc[i]sc[j])+S(sc[N]sc[j])<F[k]+st[i](sc[i]sc[k])+S(sc[N]sc[k])F[j]+s_t[i]*(s_c[i]-s_c[j])+S*(s_c[N]-s_c[j])<F[k]+s_t[i]*(s_c[i]-s_c[k])+S*(s_c[N]-s_c[k])
    化简得
    F[j]F[k]sc[j]sc[k]<S+st[i]frac{F[j]-F[k]}{s_c[j]-s_c[k]}<S+s_t[i] .
    st[i]s_t[i] 单调递增, 则 jj 在以后不可能比 kk 更优了, 所以可以执行弹出队首的操作 .
    否则 jj 可能在以后的某一个决策中比 kk 更优, 不能直接弹出队首 .


  • 相关阅读:
    python常用运维脚本实例
    数据库优化方案整理
    Python第一章概述与环境安装
    九阴真经
    常用的kubectl命令
    第7篇管理存储资源
    第8篇NFS PersistentVolume
    第10篇用 ConfigMap 管理配置
    第11篇Kubernetes部署微服务电商平台
    第12篇Kubernetes 监控
  • 原文地址:https://www.cnblogs.com/zbr162/p/11822556.html
Copyright © 2011-2022 走看看