# huawei2021 **Repository Path**: pastpresent/huawei2021 ## Basic Information - **Project Name**: huawei2021 - **Description**: 2021年华为软件挑战赛参赛心得 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2021-04-20 - **Last Updated**: 2022-04-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 2021年华为软件挑战赛 参赛经历 > 与其感慨路难行 不如马上出发 ## 前因 #### 听师兄建议,参加的比赛 - 3月 华为软挑 - 5月底到7月 快手K-Code - 11月 新网银行 交子杯 - 虎牙小程序、招银fintech也可以参加 ## 训练赛 ### 3月10日 下发赛题 #### 赛题要求 - 提供多种服务器和虚拟机及相关信息 - 根据每日的新增或删除虚拟机请求对服务器进行选型、负载、调度 - 本质上归结为生产系统的优化调度问题 #### 主要问题 - 根据虚拟机请求做出服务器的选型购买 - 根据已有的服务器负载序列做出新增虚拟机的部署 - 根据已有的服务器负载序列做出已有虚拟机的迁移 - 处理每天请求对应的输出顺序是服务器的购买 已有虚拟机的迁移 新增虚拟机的部署 #### 思路 - 主办方提供的思路 - 向量装箱问题 - 加权向量装箱问题 - 多重选择加权向量装箱 - 多选择动态加权向量装箱 - 服务器整合 - 服务器重新分配 - 个人思路 - 首先完成baseline,发现有虚拟机请求就购买一个固定服务器进行部署 - 其次加上每个服务器的内核和内存情况,当有新的虚拟机请求时首先遍历已有的服务器负载序列,如果没有满足的服务器再购买新的服务器 ### 3月12日 #### 完成读取文本输入部分 ``` java String path = "C:\\Users\\11931\\Desktop\\华为软挑\\training-1.txt"; Path path = Paths.get(Read.path); List lines = Files.readAllLines(path); ``` #### 发现问题 每次向list中存入实体类或list时,都是存入一个类似于指针的地址,如果采用循环存储,每次必须重新new一个对象,不能使用clear(),否则会导致存入的值都一样 ### 3月13日 #### 确定各数据的存储结构 - 如果数据容量大小可确定,一般进行遍历操作,采用数组 - 如果数据容量大小不确定,一般进行遍历操作,采用list - 如果数据一般采用key-value查询操作,采用map #### 考虑对请求的处理分单双节点进行 ### 3月17日 #### 确定打包方式 - 通过服务器进行打包 1. 将文件上传到服务器 2. 进入相应文件夹,chmod 744 build.sh 修改权限 3. ./build.sh 进行构建 4. 将文件下载到本地,压缩后提交 ### 3月19日 #### 蔡师兄提供服务器选型和部署策略 - 对所有的服务器信息按价格进行排序 - 根据增加的虚拟机信息,对已有的服务器进行一个评分排序,评分采用欧氏距离排序,取最小分数且满足条件的服务器进行虚拟机的部署,若没有则进行服务器的购买 ### 3月23日 #### 读取控制台输入 ```java Scanner scanner = new Scanner(System.in); String string = (String)(scanner.nextLine()); ``` 不可使用while(scanner.hasNextLine())读取控制台输入,会陷入死循环,读取文件可以 #### 第一次成功提交作品 采用最简单的随机购买策略,每次只买一个固定服务器 #### 考虑重映射问题 1. 用一个Map存储服务器型号及对应id 2. 遍历Map进行输出,将现有的server_id对应到一个新的数组map[100000] 3. 每个元素下标对应原来的server_id,但元素等于一个计数器idx++,idx相当于新的server_id ## 初赛 ### 3月25日 #### 实现按照硬件成本最低购买新服务器策略 #### 增加评价函数进行服务器的选型和虚拟机的部署 - 评价函数 value = 2 * (cpus - cpuv)^2 + (mems - memv)^2 #### 考虑进行迁移 1. 将现有服务器在一天结束时按照负载(所含虚拟机)的数量进行排序 2. 将负载少的服务器中的虚拟机向负载多的服务器迁移,部署的评价函数仍采用以上所用 ### 3月26日 #### 实现迁移 #### 最终提交 迁移前700天的2/1000的虚拟机,评价函数参数改为5 ## 总结与反思 ### 还可以改进的地方 1. 数据结构的存储 2. 迁移只考虑了双节点,单节点没有加上 ### 不足之处 1. 对java的基本数据结构了解不足,数据的存储速度和读取速度仍有很大的提升空间 2. 相关算法了解不够,需要多刷leetcode算法题拓宽视野 3. 函数封装思想不成熟,写代码一条路走到黑,不利于后期维护 ### 收获 1. 对于java读取输入以及输出操作有了认识,学习了打包文件,了解了比赛的基本流程 2. 认识到了函数封装和数据结构的重要性,开始学习数据结构与算法 3. 本次比赛中,迁移操作由于运行时间的问题没有全部完成,但其实调参也发挥着重要的作用,优秀的策略和参数优于多余的操作(调参才是王道,md)