2021华为软挑-成渝复赛复盘

article/2025/9/14 23:33:53

成渝赛区

团队名:newWorld

初赛 rank 22,复赛 rank 22。

github源码:https://github.com/Yin-Freedom/codecraft_2021

赛题介绍

赛题网址:https://competition.huaweicloud.com/advance/1000041380/circumstance

本次赛题来源于云计算-资源调度管理的真实业务场景,自2000年以来,国外众多互联网公司如Amazon、Google、Microsoft等纷纷创立云计算中心,作为一种方便、低成本的公共服务,得以快速发展。华为云成立于2005年,作为后进者快速发展到目前的Issa全球市场前列。

在云市场发展壮大的同时,云提供商们关注云数据中心硬件成本花费资源利用率对成本降低的巨大作用。通过优化算法对物理服务器上的虚拟机资源进行规划和调度能够为云运营商节省上亿的成本。

赛题简化

本次赛题的主要任务可以分为:服务器选型、虚拟机放置规划和虚拟机调度。

其中虚拟机放置问题可以看做是一种多维装箱问题(Vector Bin Packing),学术界对装箱问题的研究精彩纷呈,主要有:近似算法(首次适应(First Fit)、最佳适应(Best Fit)、下降最佳适应(Best Fit Descending)),随机算法(模拟退火法(Simulated annealing)、粒子群算法、蚁群算法、元启发式算法(metaheuristic)),和最优解算法(分支定界算法)。其中近似算法在一维装箱问题中不会超过最优解的11/9,随机算法就真的是随机,最优解算法能够得到最优解却是依赖牺牲时间换取的。

本次赛题的装箱问题是服务器和虚拟机的两个维度 cpu 和 mem 加上单双节点分类,从而使得问题成为三维装箱问题,因此各种算法的结果近似,基本等同于最基本的下降贪心算法结果。

虚拟机调度有两种可行方案:1.直观理解就是将未放满服务器上的虚拟机迁移至较满服务器(最基本的方法),2.也可以对不同服务器上的虚拟机进行重排(重难点)。可参考Google在ROADEF\EURO 2012上举办了名为Machine Reassignment的竞赛,其中大部分高级组(非doctor学历或非在校学生)队伍都采用了局部搜索(Neiborhood search)的随机算法,由于此次比赛要求单个数据集低于90s,实际线下不能超过20s,所以这些对此次赛题几乎没有参考性。其中方案1中影响最大的因素为待迁移服务器和目标服务器排序逻辑,由于该方法只能将剩余资源较大服务器上的虚拟机迁移至剩余资源较小的服务器上,而如果剩余资源较小的服务器出现碎片化剩余空间,如 A[0, 45] [126, 127],即cpu=126,mem=127的剩余资源为cpu=0,mem=45,则无法继续放置。所以我们的观点是必须采用第二种方案弥补该问题。


数据分析

Input:

server: (host0Y6DP, 300, 830, 141730, 176)

server_typecpuramhard_costenergy_cost
host0Y6DP300830141730176

visual machine:(vmMRUNJ, 60, 2, 1) 0代表单节点部署,1代表双节点部署

vm_typecpuramsingle or double
vmMRUNJ6021

 

request:(add, vmUQ9E5, 971449032) (del, 720035579)

request_typevm_typevm_single number
add(del)vmUQ9E5971449032

在输出前系统会通过标准输入给出一些信息,包括N种服务器类型数据,M中虚拟机类型数据,以及接下来N天的用户请求(删除和添加虚拟机)。

我们调度需要满足一些限制条件:1. 容纳服务器的虚拟机cpu && ram都不能超过其容量上限,特别的,对于单节点虚拟机只用放在server的一个节点即可(A或B节点),双节点虚拟机的cpu && ram需要均分放在server的两个节点(A和B节点)。

Output:

1.首先输出购买服务器信息,判题器根据购买信息按读入顺序为每台服务器设置从0开始的唯一编号。

2.根据前一天不超过存量虚拟机5/1000的限制将已有虚拟机从一台服务器迁移至能够容纳它的其他服务器上。

3.按Input顺序输出对添加虚拟机的部署信息,如果是单双节点还需指明部署在服务器的A节点还是B节点。

Constraint:

在迁移和部署过程中均需满足服务器的容量限制条件

Evaluation function:

服务器购买  get_value = hard_cost + (T - today) * energy_cost  | 其中T为总的天数,T-today为剩余天数。

 


解题思路和结果分析

其实今年赛题很简单,很容易写出baseline,我在初赛练习赛(2021/3/10)放出赛题很快写出了最简单的方法,贪心方法和按利用率排序。贪心方法就是确定每天买一种类型的服务器,先买一台放得下当前虚拟机就放,放不下就买新的服务器,每次放置都从先买的服务器开始尝试,最后根据购买服务器目标函数比较每种服务器的总价选择最小的。然后尝试过使用随机算法(如模拟退火,博哥成电校内赛时讲了一堆元启发,难道这就是其他赛区派来的间谍,Emmm),但是由于时间限制和效果放弃了。线上单个集合90s的限制实际上线下不能超过20s。

大佬搞得python判题器https://github.com/B1ACK917/2021HWAutoGrader,主要功能其实只有圆形图看服务器类型数据,哈哈哈哈。

后来我google找了几十篇文献,研读了10多篇文献,然后找到了两个字“废话”!可能是这次赛题结合实际,是三维以及以上的multichoice vector bin packing,导致国内外的研究都成了无用功。只好自研算法,然后根据贪心算法和迁移的骚操作(题目让每天先迁移再购买最后部署,我们先购买和部署,然后再将那些删除操作后剩余的vm迁移至其他较满服务器上),后来据我所知,没有其他人这样搞。但是在得到较好成绩后没有继续优化这个点。购买服务器也换成了买最便宜的,导致的结果就是超过50%的服务器都是最小最便宜的那一款,所以迁移反而负优化

接下来我们被困在11e的关头一直没有找到问题关键,然后我又回头去找文献去了!哎!果然是太年轻。后来根据图形化和分析,我们在正式赛封榜前两天找到了一个主要问题:由于购买时买到了较小的服务器,而迁移没有只考虑了利用率,所以当空余空余服务器很多时(i.e. total servers:3000,empty servers:1000),大部分大容量服务器已经被放满了。在超量请求(>1000条add请求)到来时,一旦包含很多最小服务器放不下的vm类型时,便会直接购买大容量服务器,直接导致大量小服务器(1000台)都空着,而又购买了很多新的服务器,所以硬件成本直接涨了几千万,也就在11e关头徘徊。

我们后来发现这个问题后,先是通过强制迁移限制:同样类型只能迁移至同样类型上,避免小的vm把大的server填满,而大的vm找不到server只好买新的情况,直接突破11e的关头。但是队友想出一个magic方法,购买时强行限制server剩余部分容量,这样就让买的服务器偏大,不会出现放不下的尴尬情况。由于该方法让我们到达有了较大进步,加上骚迁移直接到达10e9000w,也就挤进32强的席位,然后我们便忽略了对这个购买方法深层次的逻辑分析,间接导致后来复赛的滑铁卢。 

 

重点

1. 其实从初赛开始你的算法就大致决定了复赛的结果,因为可以分为每天调度(总共1000天)和每天迁移,而非迁移的结果与迁移结果成正相关。初赛训练赛通过比较西北赛区rank1大佬非迁移结果,10e800w,而大部分队伍都是11e4000w。所以复赛训练集大部分队伍不迁移都在20e左右,而前几大佬都是19.7e,我们有个购买模型在19.85e,但是后来一直没有找到适应的迁移策略。

2. 数学验证。由于赛题理解简单,所以实际操作的时候构思了许多策略,但是都没有将其转换成抽象的数学模型,而是简单地通过实现结果来判断好坏。因此我们根本没有完全确定那几个策略是普适性的。

3. 对于想到且通过可视化确认的点一定要认真分析,不要抛弃,其中最主要的就是购买模型和迁移方法。因为赛题同样是数据类型非常大,所以部分观察看不出具体的问题。

4. 没有数学逻辑的优化是个极大地陷阱,如果没有认真分析而是直接采用,后期会因为没法分析而无法继续优化。

 

 

 


http://chatgpt.dhexx.cn/article/D76imuEd.shtml

相关文章

2020华为软挑热身赛

基于高斯贝叶斯分类的C优化器 摘要:2020华为软件挑战赛如期举行,本次挑战赛分为热身赛、初赛、复赛、总决赛4个部分,其中热身赛结合当前机器学习中分类问题以及鲲鹏服务器性能相关来出题。为了解决该问题,达到算法准确率和程序时…

华为软挑赛2023-初赛笔记

前言 比赛介绍 官方链接: 2023华为软件精英挑战赛——普朗克计划 (huaweicloud.com) 赛题介绍 场景介绍 官方赛题介绍: 2023华为软件精英挑战赛初赛赛题及相关材料发布_2023华为软件精英挑战赛_华为云论坛 (huaweicloud.com) 比赛场景如图所示 简单来说,在一…

【C++】2018华为软挑:模拟退火+贪心FF解决装箱问题

本文的主要工作是补充这篇博客的缺失代码,使之能够运行。 2018华为软挑--模拟退火FF解决装箱问题【C代码】_小马哥MAX的博客-CSDN博客算法简介: 装箱问题是一个NP完全问题,求解全局最优解有很多种方法:遗传算法、禁忌搜索…

2020华为软挑热身赛-这些坑我帮你踩过了(华为软件精英挑战赛编程闯关)

本文始发于个人公众号【两猿社】。 声明,为保证比赛公平,本文不会提供比赛源码,仅提供思路与踩坑经验。 他来了,他来了,他带着面试绿卡走来了。 他来了,他来了,他带着20w大奖走来了。 一年一度…

2018华为软挑参赛体验

第一次接触到这个比赛应该是研究生刚入学的时候,在教研室看到了师姐的一份简历,上面就有华为软挑的参赛经历。研一利用空余时间加强C和STL的学习,看完了《C primer》《Effective STL》,自己也写了一些demo,感觉这个比赛…

2022华为软挑编程问题报错总结

for i in number_feature: TypeError: ‘int’ object is not iterable的错误 错误原因:是因为在python里,整型(int)数据是不能直接用于迭代的,而是应该用range()函数 改为如下图:

2021华为软挑部分答疑——哪些你有错却总是找不到的地方,我来带你找啦(含标准输入代码)

前期工作: 2021华为软挑初探——代码实现 2021华为软挑再探——代码实现 1 关于打包 在windows系统下,先把你写的程序写在src里面的CodeCraft-2021里面 然后在这个页面,将这三个文件压缩就可以上传啦: 2 关于标准输入 标准输…

华为软挑2019

参加软挑的一些感悟 写在前边的话 我本科一直在做嵌入式相关的项目,这是第一次参加软件类的竞赛,不得不说过程确实很刺激,最后止步杭厦赛区50强也很是遗憾,明明很接近,最后输在了代码效率上,本地成绩很好的 python代码 ,上传测评运行时间超限(官测环境比本地性能好&…

2021华为软挑初探——代码实现

其他工作: 2021华为软挑部分答疑——哪些你有错却总是找不到的地方,我来带你找啦(含标准输入代码) 2021华为软挑再探——代码实现 这几天华为软挑好多人也是做的热火朝天,作为一个渣渣小孙也来探探,不探…

2020华为软挑总结

文章目录 一、热身赛编程闯关:评价标准:问题分析 二、初赛问题描述评价标准:问题分析思路一:思路二:思路三:针对思路三的提速: 最终结果: 三、code记录初赛两篇不错的总结三、复活赛…

2022华为软挑比赛(初赛笔记)

文章目录 2022华为软挑(初赛笔记)1. 赛题要求2. 解决方案2.1 挑选适合的边缘节点2.2 第一轮:最大分配2.3 第二轮:均值分配 总结 本文仓库地址: Github-CodeCraft-2022 2022华为软挑(初赛笔记) …

2023华为软件精英挑战赛笔记心得(Python实现)

第一次参加华为软挑,问了周围一圈人没人组队,看了眼题目,感觉挺有意思的,就打算自己写来跑一下,不求分数,主要是想学点东西,顺便记录一下。(最后跑了195w,自己的能力也就…

2021华为软件精英挑战总结

2021华为软挑32强总结 今年的软挑最终止步于粤港澳赛区第16名,总成本为16亿3979万6349,赛区第一名总成本为15亿3903万4817。 虽然没进入决赛,但是拿到了华为面试直通卡,也喜提广州一日游,算不虚此行了。决赛虽然还在继…

Spring认证中国教育管理中心-Spring Data Neo4j教程一

原标题:Spring认证中国教育管理中心-Spring Data Neo4j教程一(Spring中国教育管理中心) 5. 开始 我们为 SDN 提供了 Spring Boot 启动器。请通过您的依赖管理包含启动模块并配置要使用的螺栓 URL,例如org.neo4j.driver.uribolt:/…

SpringBoot 整合 Neo4j

1、创建测试类2、集成 SpringBoot 阅读此文之前,必须对 Neo4j 有个初步的了解,如果要实际操作的话,需要自备一个 Neo4j 数据库 本文所涉及代码已开源至 Gitee https://gitee.com/Array_Xiang/spring-boot-neo4j 创建一个 SpringBoot 项目&…

【Neo4j教程之CQL函数基本使用】

🚀 Neo4j 🚀 🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀 🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨ 🌲 作者简介:硕风和炜,C…

Neo4j资料 Neo4j教程 Neo4j视频教程 Neo4j 图数据库视频教程

课程发布地址 地址: 腾讯课堂《Neo4j 图数据库视频教程》 https://ke.qq.com/course/327374?tuin442d3e14 作者 庞国明,《Neo4j权威指南》副主编、《Neo4j 3.x 入门经典》翻译 邮箱:pangguomingyeah.netQQ:1143815700Neo4j技术讨论QQ群&…

Neo4J超详细专题教程,快来收藏起来吧

Neo4J超详细教程 Lecture:波哥 一、Neo4J相关介绍 1.为什么需要图数据库 随着社交、电商、金融、零售、物联网等行业的快速发展,现实社会织起了了一张庞大而复杂的关系 网,传统数据库很难处理关系运算。大数据行业需要处理的数据之间的关系随…

Neo4j教程 Neo4j视频教程 Neo4j 图数据库视频教程

课程发布地址 地址: 腾讯课堂《Neo4j 图数据库视频教程》 https://ke.qq.com/course/327374?tuin442d3e14 作者 庞国明,《Neo4j权威指南》副主编、《Neo4j 3.x 入门经典》翻译 邮箱:pangguomingyeah.netQQ:1143815700Neo4j技术讨论QQ群&…

neo4j教程-安装部署

neo4j教程-安装部署 Neo4j的关键概念和特点 •Neo4j是一个开源的NoSQL图形存储数据库,可为应用程序提供支持ACID的后端。Neo4j的开发始于2003年,自2007年转变为开源图形数据库模型。程序员使用的是路由器和关系的灵活网络结构,而不是静态表…