2021华为软件精英挑战赛

github地址: https://github.com/lh4027/huawei-software-competition2021.git.

比赛心得

今年首次参加华为软挑,一开始只想进前64 强拿个证书就满足了,没想到队友太猛直接肝进初赛正式赛第六。
复赛由于时间关系没有好好准备加上没有很好的思路,训练赛的时候掉到了16,现场赛3个小时又出现了意外(换了数据集后,训练赛提交成功的代码竟然正式赛运行异常),只好现场改用初赛最好成绩那份代码,不出意料,最后只取得了复赛21的成绩,总的来说还是比较遗憾的,毕竟复赛期间改良的代码没有用上。初赛,复赛成绩如下:


接下来我会具体总结一下我们队伍的思路和方法,时间仓促,可能有叙述不合理的地方,见谅。

赛题分析:(具体赛题也上传在github上)

题目中所给的虚拟机有两种部署方式,分别为单双节点部署,单节点部署指的是一台虚拟机所需的资源(CPU和内存)完全由主机上的一个节点提供;双节点部署指的是一台虚拟机所需的资源(CPU 和内存)必须由一台服务器的两个节点同时提供,并且每个节点提供总需求资源的一半。
    赛题要求根据所给的请求序列,创建服务器,部署虚拟机,或者按照用户请求在对应的服务器上删除相应的虚拟机。但要注意,服务器上的任意一个节点(A和 B)上的资源负载(CPU 和内存)均不能超过其容量上限。在完成每一天的服务器的扩容之后,在处理每一天的新请求之前,你还可以对当前存量虚拟机进行一次迁移,即把虚拟机从一台服务器迁移至另一台服务器。对于单节点部署的虚拟机,将其从一台服务器的 A 节点迁移至 B 节点(或反之)也是允许的。但迁移的虚拟机总量不超过当前存量虚拟机数量的千分之五。
    我们可以发现这是一个类似于装箱的问题,把服务器比作箱子,把虚拟机比作需要放进去的货物。官方推文上给的提示复杂难懂,但本质好像也是多维装箱问题。

我们程序的流程

首先解析出来所有服务器类型,虚拟机类型,以及请求天数,然后对每一天到来的虚拟机请求处理,迁移,部署最后扩容。
我们的方法是针对每一天的请求数据来进行的,(初赛一次性给出了所有天数的请求,意味着可以用上帝视角去处理这个问题,但是实际场景中不可能知道全部数据,只能预测到有限天数的请求,这也是复赛赛题变动的地方)。
第一天的时候我们根据所有的Add请求进行扩容,也就是首次购买服务器,如何选取服务器会在后续扩容策略里面详述,然后再进行虚拟机的部署,也就是分配,我们的add请求和delete请求是分开处理的,先处理完所有add请求,再去处理所有delete请求,因为我们是基于一天数据的全局视角来处理数据的,这对我们的程序来说很重要
后面的每一天我们先取出所有虚拟机请求,首先进行迁移,这里的迁移其实是针对上一天的,因为上一天会有删除请求,会空出很多服务器资源,这时候就需要对这些空置资源重新整合。然后进行虚拟机的分配,也就是部署add请求的虚拟机。将这一天的所有add请求单独拿出来,往剩余的服务器资源里面部署,直到剩余服务器资源再也部署不进去虚拟机后终止。
将剩余的add请求交给扩容,选择购买一批服务器放入这剩下的add请求,至此所有add请求我们都处理完毕,接下来处理所有delete请求。一天结束。循环往复,直至最后一天。

扩容策略:

我们的扩容策略其实就是基本的装箱问题加贪心算法,主要利用了降序梯度最佳适应算法,加上一些小技巧,在我们的代码中,将每天分配部署后的剩余虚拟机add请求拿过来,按照这些请求所需资源大小降序排列,即让大的虚拟机先放,遍历所有可购买的服务器,每一台服务器放入其自身容量极限的虚拟机后,计算服务器剩余资源,取出差值最小的服务器,一次循环选出一台服务器,每次选出后服务器后,记录该服务器上的虚拟机,这里在购买服务器的同时已经相当于把这些虚拟机分配好了后面直接查找这些虚拟机所在的服务器就可以直接输出了

每选择好一台服务器后,就更新现在的虚拟机请求总表,即去掉已经分配在购买的服务器上的虚拟机请求。当这一天的虚拟机总表为空时,我们就完成了扩容。这种方法使得利用率很高,但有个很大问题,时间复杂度会很高,尤其是一天的虚拟机请求特别多时,会很耗费时间。
这里我们用了一些小技巧,一个是数据切分,另一个是按照虚拟机内核比>1和内核比<1分类,服务器也按照内核比分成两类。流程:数据切分->按照内核比分类->按照请求所需资源大小降序排列,这样当虚拟机请求数很多时(程序中设置为3000),我们分为几个数据块,每个数据块单独执行扩容策略,再用上多线程,很好地解决了超时问题。

分配策略:

每天在扩容之前,我们需要将虚拟机请求先进行一次部署,如何保证较好的资源利用率尤为重要,在这个阶段,我们部署越多的虚拟机请求,扩容时需要购买的服务器就越少,成本就会越低。这里使用的策略依旧是贪心算法,找放入虚拟机后剩余服务器资源量最小的,每次遍历所有服务器,策略和扩容类似。

迁移策略:

将剩余服务器资源从大到小排序,将剩余资源多的服务器上的虚拟机迁移到剩余资源少的服务器上,复杂度很高,采用了很多剪枝方法,加了很多限制,如迁移成功率,失败率等。(膜拜大佬队友,优化时间很有一套)具体可看代码。

复赛的时候我们又改进了分配算法和迁移算法,用初赛数据集测试总成本可以达到11亿以下,可惜复赛现场赛出了bug,所以代码一定要多测试,提升鲁棒性。
以上仅为我们团队思路和方法,非科班出身,能力不足请轻喷。
最后总结一下,在参加这类比赛时,代码更新迭代非常快,最好做好版本管理和代码留存说明,写代码时多思考,不要堆砌代码,否则后期自己都看不懂自己的代码了,修改起来很麻烦。

2021华为软件精英挑战赛相关推荐

  1. # 2021华为软件精英挑战赛C/C++——build.sh/build_and_run.sh/CodeCraft_zip.sh注释

    2021华为软件精英挑战赛C/C++--build.sh/build_and_run.sh/CodeCraft_zip.sh注释 1.build.sh #!/bin/bashSCRIPT=$(read ...

  2. 2021华为软件精英挑战赛(附赠线下判题器链接)——经历

    2021华为软件精英挑战赛(附赠线下判题器链接)--经历 1.题目解析 本次赛题源自现实的互联网企业面临的问题,怎样购买与部署服务器最便宜! 服务器:不相同型号的服务器有着不同的CPU与不同的内存,每 ...

  3. 2021华为软件精英挑战赛,思路框架,欢迎留言讨论

    2021华为软件精英挑战赛,思路框架. 1.对数据初始化封装 服务器 用集合来进行封装,集合由字符串和数组组成键值对 {"服务器型号":[cpu内核,内存,硬件价格,能耗]} 例如 ...

  4. 2021华为软件精英挑战赛总结(复赛第12名)

    2021华为软件精英挑战赛 github 地址:https://github.com/DougZheng/Huawei_software 前言 无意中看到赛题,觉得很有意思,就匆忙在报名截止前几天上了 ...

  5. 2021华为软件精英挑战赛总结分享

    2021华为软件精英挑战赛总结分享 随着大赛的结束,自己的2021软挑也落下了帷幕,很幸运在自己学业生涯的最后几个月能够再参加一次华为软挑,虽然成绩不是特别好,但已经满足了.这是自己第二次参加华为的比 ...

  6. 2021华为软件精英挑战赛初赛baseline

    2021华为软件精英挑战赛初赛baseline,由ddmm大佬提供的单文件baseline按照工程开发格式改写,改为以类为单位,多文件的格式.同样没有在里面添加任何算法,相当于一个脚手架,帮助大家更快 ...

  7. 2021华为软件精英挑战赛初赛代码及思路

    2021华为软件精英挑战赛训练赛.正式赛思路分享     有幸再次参加了华为软件精英挑战赛(去年由于不知道数据集有坑,导致没能进入复赛,今年决定再来一次弥补去年的遗憾)     今年的赛题相比去年个人 ...

  8. 2021华为软件精英挑战赛(杭厦第20名)

    写在前面 距离华为软件精英挑战赛结束也有一段时间了 我是浙工大投降战队的队长,第一次参加这种比赛能打到复赛我还是比较满意的 这次比赛我最大的收获就是认识了好多厉害的大佬 希望我们杭厦赛区晋级的战队总决 ...

  9. 报名启动 | 2021华为软件精英挑战赛正式开启,冠军奖金20万!

    #华为软件精英挑战赛等你来战~# 华为软件精英挑战赛是华为公司面向在校大学生举办的大型软件竞赛,在软件精英挑战赛的舞台上,相信您可以充分展示软件设计与编程的能力,享受coding解决问题的乐趣,感受软 ...

  10. 2021华为软件精英挑战总结

    2021华为软件精英挑战赛总结 今年的软挑最终止步于粤港澳赛区第16名,总成本为16亿3979万6349,赛区第一名总成本为15亿3903万4817. 虽然没进入决赛,但是拿到了华为面试直通卡,也喜提 ...

最新文章

  1. Python 基础教程:常用函数整理
  2. 高度平衡树 -- AVL 树
  3. django 入门,快速搭建一个后端接口
  4. 4.5 计算机网络之网络层路由选择协议(自治系统AS、RIP、OSPF、BGP)
  5. Google Map 自定义infowindow
  6. java 数据结构 迷宫_JAVA数据结构与算法之递归(一)~ 迷宫问题
  7. usage: git remote add [options] name url -f, --fetch fetch the remote branches ...
  8. 网易云数据库架构设计实践
  9. ubuntu20.04修改登录背景(十分详细)
  10. 趣味运动会项目及规则
  11. 单位内网视频会议怎么开
  12. java caller_callee和caller属性的区别
  13. codewars解题笔记---Are You Playing Banjo?
  14. 小程序+动易SF制作随手拍实例全景式操作(3)
  15. 【机器学习算法实践】AdaBoost是典型的Boosting算法,加法模型多个弱分类器流水线式的提升精度,更关注那些难处理的数据
  16. 一个划时代的知识女性——《杨绛传》读书笔记心得感想4300字
  17. [PCB]这里带你了解何为PCB?
  18. CTFHUB find_it
  19. 项目八学好英语网html,英语说课网址、八年级(上)Unit 8、小语四册三单元(刻舟求剑)...
  20. Python:列表推导式、生成器、迭代器

热门文章

  1. ps新手秒变大师必备的Ps插件全在这!(mac版本)
  2. GRE阅读高频机经原文及答案之Design-Engineering
  3. 用gambit学博弈论--完全信息动态博弈(一)
  4. 十年回眸 中国游戏崛起的完美轨迹
  5. Protel99se基本教程 Protel 99SE从零开始学习教程视频教程
  6. pe如何自动加载外置工具_winpe无法加载外置程序解决方法
  7. 读《深入浅出统计学》
  8. 用华为eNSP仿真校园网
  9. i710700黑苹果_[Hackintosh]解决黑苹果无法使用Siri、iMessage等服务
  10. 第七届蓝桥杯c语言a组答案,第七届蓝桥杯 C语言A组试题.pdf