前言
很开心能够参加这次2021华为软挑的比赛,喜欢这样充满挑战性,在任务驱动下不断学习,主动思考解决问题的方法的经历,以及与一群小伙伴讨论问题,一起学习成长进步的感觉,收获满满,真的很棒!
于是在此记录下一点心得,留下我曾经来过的痕迹,为自己这些年来参加的大大小小各式各样的比赛再添一笔,也留下这一段收获满满、值得回味的记忆吧~
赛题解读
今年的赛题是关于对云上资源的规划和调度问题。给了一系列有着不同CPU、内存资源量的服务器,根据用户请求的不同 CPU与内存量的虚拟机资源分配合适的服务器。
资料收集
首先到处查询各种资料,有讲到这个问题的任务可以看成一个变种的多维装箱问题,也就是一个np难问题,比较难找到一个精确的解,但是我们可以找出一个趋近于最优解的方案。
解读参考:
与赛题中服务器选型和请求调度这两个问题最为相似的运筹优化模型是Vector Bin Packing(多维装箱问题),该问题是传统Bin Packing问题的一个变种。该问题模型与赛题中的定义非常相似,如果不考虑虚拟机的删除和服务器的能耗成本,那么服务器选型 + 请求调度这两个问题与该模型是完全等价的。而如果加入虚拟机的删除,则该问题会变成动态的版本,对应于Dynamic Bin Packing的相关扩展模型。
以及参考里面还提到了阿姆达尔定律?不太懂,于是也去查了一下:
Bin packing(装箱问题)
Problem:给定n件物品和k个箱子,每一个箱子的容量为1,每一件物品的大小w为(0,1),要求使用最少数目的箱子来装上全部的物品。
这个问题是NPC问题,只有approximation(近似)算法。
B站上对背包问题的讲解:【动态规划】背包问题
思路分析
此问题最关键的步骤主要有两个部分:一方面是根据需以及请求的资源量合理的选择适合的服务器类型,另一方面是为各个虚拟机请求找到合适的服务器进行分配。
选择服务器的部分
各表建立
我们分析了官方所给出的training-1与training-2两个样本的虚拟机请求数据。首先服务器的属性有包括服务器类型、CPU资源、内存资源、机器售价、每日花费。虚拟机的属性包括虚拟机类型、CPU资源、内存资源、单双节点。我们按照提议设计建立了:
- 服务器类型查询表
- 虚拟机类型查询表
- 已有服务器资源表
- 已分配好服务器的虚拟机表
- 纯粹统计服务器购买数的表
- 虚拟机迁移表
- 创建请求表
- 虚拟机请求表
- 虚拟机-服务器对应分配表
- 服务器ID编号查询表
- 服务器原始表(其实只是一开始记录读入服务器信息的表而已,也可不使用)
- 虚拟机原始表(其实只是一开始记录读入虚拟机信息的表而已,也可不使用)
按顺序的各表定义如下:
//服务器信息
struct Server
{
string type; //服务器型号
int cpuA; //A节点cpu核数
int memoryA; //A节点内存大小
int cpuB; //B节点cpu核数
int memoryB; //B节点内存大小
int price; //硬件成本
int cost; //每天能耗成本
// int id; //服务器编号
};
//虚拟机信息
struct VM
{
string type; //虚拟机型号
int cpu; //cpu核数
int memory; //内存大小
int node