2018年华为软件精英挑战赛总结

Posted longjiang-uestc

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2018年华为软件精英挑战赛总结相关的知识,希望对你有一定的参考价值。

比赛总结

这个比赛花了太多的时间,最后的结果还是有点遗憾

赛题主要内容和目的

初赛题目和内容

  • 预测云平台下给定连续时间内的虚拟机数量(15种不同虚拟机的类型), 并放置到给定容量大小的物理机上(cpu:64, mem:128)
  • 要求预测要准,放置要避免碎片(整个比赛可以分为两个部分: 预测 + 放置)

    预测部分

  • 预测部分,由于给的数据比较少, 最多不超过3个月的数据, 复杂的机器学习模型基本上很难收敛, LSTM这些深度学习网络反而效果不好
  • 所以选择了简单和线性回归、最小二乘法、趋势平均、指数平滑等简单的预测方法
  • 数据去噪很重要, 对分数提升很快, 采用箱型图去噪法:
    • 箱型图去噪算法, 先将数据排序, 找到为与四分之一和四分之三的数值, 记录下他们的差值IQR
    • 将原始数据中大于[3/4位置数值+3*IQR]与小于[1/4位置数值-3*IQR]的视为噪点, 并用前一个位置和后一个位置的平均数进行填充
  • 最后3周数据加权平均
    • 利用后三周的数据, 乘以不同的系数, 然后加权求和, 以一周为一个样本
  • 最小二乘法(线性回归)
    • 最小二乘法, 通过最小化误差的平方和寻找寻找数据的最佳函数匹配, 预测数据与实际数据之间误差的平方和最小
      • 拟合出一条直线的系数, 将未知点x代入求得y的值, 可以通过公式算出线性拟合的两个参数, 最佳拟合
      • 对两个数分别求偏导, 对偏导为0
  • ARIMA模型
    • 参考博客
    • 自回归移动平均模型, 是统计模型中最常见的一种用来进行时间序列预测的模型
    • 对时序数据要求要稳定
    • 对非平稳时间序列先进行d阶差分运算, 化为平稳序列
    • 要对平稳时间序列分别求得其自相关系数ACF和偏自相关系数PACF, 通过对自相关图和偏自相关图的分析, 得到最佳的阶层p和阶数q
    • p(本身的滞后数AR), q(采用的预测误差的滞后数MR)
  • 指数平滑
    • 时间序列的态势具有稳定性和规则性, 所以时间序列可被合理地顺势推延
    • 最近的过去态势, 在某种程度上会持续到最近的未来, 将较大的权值放在最近的数据上
    • 简单的全期平均法, 加权移动平均
    • 指数平均兼容了全期平均和移动平均的特点, 不舍弃过去的数据, 随着数据的远离, 赋予逐渐收敛为零的权值
    • 任意一期的指数平滑值都是本期实际观察值与前一期指数平滑值的加权平均
    • 计算公式为: St = a * yt + (1 - a)St-1
      • St是时间t的平滑值
      • yt是时间t的真实值
      • St-1是时间t-1的平滑值
      • a是平滑系数, 范围为(0, 1), 平滑系数以指数形式递减, 故称为指数平滑
    • 平滑常数决定了平滑水平以及对预测值与实际结果之间差异的响应速度。
      • 平滑常数a越接近于1,远期实际值对本期平滑值影响程度的下降越迅速;
      • 平滑常数a越接近于0,远期实际值对本期平滑值影响程度的下降越缓慢。
      • 由此,当时间数列相对平稳时,可取较大的a;
      • 当时间数列波动较大时,应取较小的a,以不忽略远期实际值的影响。
      • 生产预测中,平滑常数的值取决于产品本身和管理者对良好响应率内涵的理解
    • 一次指数平滑预测: Yt+1 = aYt + (1-a)Yt‘ 或 Yt+1 = Yt‘ + a(Yt - Yt‘)
    • 二次指数平滑预测: 二次指数平滑使用于线性趋势的时间序列
      • yt+m = (2+am/(1-a))yt‘-(1+am/(1-a))yt = (2yt‘-yt) + m(yt‘-yt) a/(1-a)
      • yt = ayt-1‘+(1-a)yt-1
      • 自变量是预测天数
    • 三次指数平滑则是在二次平滑基础上再平滑
      • 基本思想是: 预测值是以前观测值的加权和, 且不同的数据给予不同的权值, 新数据给较大的权, 旧数据给较小的权
    • 指数平滑会发生滞后的情况

放置部分

  • 放置部分主要是一个装箱问题, 但由于cpu和mem的关系比较特殊(1:1, 1:2, 1:4),可以规约为二维空间的0-1背包进行求解
    • 每种物品只有一件, 可以选择放与不放
    • 用子问题定义状态: 即f(i, u, v)表示前i件物品(虚拟机)放入到一个容量为U, V的背包可以获得的最大价值, 状态转移方程为:
    • f(i, u, v) = max{cpu+mem+f(i-1,u-cpu,v-mem), f(i-1, u, v)} //价值就是cpu+mem(cpu个数+内存大小)
    • 将前i件物品放入到容量为v的背包中, 这个子问题只考虑第i件物品的策略(放与不放)
    • 如果将第i件物品放入背包中, 那么问题转换为前i-1件物品放入剩下容量为v-Ci的背包中, 此时能够回的的最大价值是f(i-1, v-Ci),再加上通过放入第i件物品获得的价值Wi
    • 如果不将第i件物品放入到背包中, 那么问题就可以转换为前i-1件物品放入容量为v的背包中, 价值为f(i-1, v);
    • 利用贪心的策略, 选择获取利益最大的方式放还是不放第i件物品
  • 填包策略: 二维空间的0-1背包问题求解装箱, 很可能会出现最后一个包(物理机)不满的情况, 两种方案
  • 第一种是暴力填充;第二种方案是暴力删除, 到底是删包还是填充, 应该计算分数的公式来决定, 那种方案分数高, 就选择那种方案

复赛变化点

  • 增加了三种不同的服务器类型(普通、高性能、大内存), 预测时间不连续,要求预测时间更长,虚拟机种类更多
  • 服务器放置更改为线性规划+比例优先+动态规划优化
  • 预测归一化后用指数平滑和最小二乘的融合算法

以上是关于2018年华为软件精英挑战赛总结的主要内容,如果未能解决你的问题,请参考以下文章

2018 华为软件精英挑战赛 (上合赛区决赛:227/300分)

2021华为软件精英挑战赛总结

华为2017软件精英挑战赛初赛源码

2021华为软件精英挑战赛

夺冠秘诀?华为软件精英挑战赛两届冠军这样复盘比赛经验

2023第九届华为软件精英挑战赛启动报名,最高20万元奖金激励