zoukankan      html  css  js  c++  java
  • sb的斜率优化笔记

    参考资料


    [HNOI2008]玩具装箱

    设 S[i] = Σ1≤i≤n (C[i] + 1), 设状态 dp[i] 表示装好前 i 个, 值为最小花费, 则转移为:
    dp[i] = min0≤j<i {dp[j] + (S[i]-S[j]-1-L)2} 。

    化简 (S[i]-S[j]-1-L)2 :将常量 L 加一, 变成 (S[i]-S[j]-L)2, 而后变成 S[i]2 + (S[j] + L)2 - 2S[i]S[j] - 2S[i]L。

    最后方程化简为 :dp[i] = min0≤j<i {dp[j] + S[i]2 + (S[j] + L)2 - 2S[i]S[j] - 2S[i]L} , 是 dp[i] = min/max {a(i) + b(j) + c(i) × d(j)} 的形式。

    看上去很 NB 的代数法

    考虑 dp[i] 的两个决策点 j1 < j2, 假设 j2 优于 j1, 可得:

    (-2S[i]S[j2]) + (dp[j2] + (S[j2] + L)2) ≤ (-2S[i]S[j1]) + (dp[j1] + (S[j1] + L)2)

    继续化简:

    -2S[i] (S[j2] - S[j1]) ≤ (dp[j1] + (S[j1] + L)2) - (dp[j2] + (S[j2] + L)2)

    由于 S[j2] > S[j1], 故可除:

    2S[i] ≥ (dfrac{(dp[j_2]+(S[j_2]+L)^2) - (dp[j_1]+(S[j_1]+L)^2)}{S[j_2]-S[j_1]})

    若有 j2 > j1, 就可以通过判断这个东西是否成立来判断 j2 这个决策点是不是优于 j1 这个决策点。

    然后设 X(i) = S[i], Y(i) = dp[i] + (S[i] + L)2, 再设 P(i) = (X(i), Y(i)) (平面直角坐标系上的一个点), 问题就是在平面直角坐标系上的一个斜率判定问题。

    考虑一个只有三个点的上凸包, 可知不论怎样,用上面那个结论可观测到的有效决策集合是原决策集合的下凸包。具体推理见参考资料

    线性规划法

    复习下形式:dp[i] = min/max {a(i) + b(j) + c(i) × d(j)}

    这种线性规划法就是把某个决策点 j 的转移,即 dp[i] = a(i) + b(j) + c(i) × d(j), 在某个来自西方的神秘二维结构(即平面直角坐标系)上以某种方式展开, 然后转化为在这个二维结构上的最优化问题。

    具体地, 先将除了 dp[i] 的东西以 ' 标示之, 记为常量:

    dp[i] = a(i)' + b(j) + c(i)' × d(j)

    然后将式子化成:

    b(j) = -c(i)' × d(j) - a(i)' + dp[i]

    然后现在的问题就是将所有决策点看成 (d(j),b(j)), 然后把一个斜率为 -c(i)' 的直线对齐每个点, 找出最小的截距。

    发现上凸包是不存在的, 维护决策点的下凸包即可。

    两种方法的评价

    线性规划 >>> 代数法,降维打击!

  • 相关阅读:
    sklearn中禁止输出ConvergenceWarning:
    sklearn里训练集和测试集的分割
    sklearn模型的保存与加载使用
    django项目成功启动,但views里代码未执行
    使用sklearn对iris数据集做基本的训练和预测
    unrecognized option '--high-entropy-va'
    快速下载Mingw(不使用sourceforge.net)
    cc1.exe: sorry, unimplemented: 64-bit mode not compiled in
    GoLand里Go Module模式下import自定义包
    GoLand生成可执行文件(Windows、Linux)
  • 原文地址:https://www.cnblogs.com/tztqwq/p/14289360.html
Copyright © 2011-2022 走看看