ddmm
计算机本科在读
原地址:[知乎](https://zhuanlan.zhihu.com/p/356155386)
今天早上赛题出来后,我和群友一样马上研究起了题目,踩了无数的坑,终于在晚上9:30的时候提交出了一个天数。现将提交注意的事项,和楼主踩过的坑记录在这里。还有一件事,武长赛区找队友。
本题是一个优化问题,这类赛题在近期的许多比赛中都有出现,服务器和虚拟机的匹配类似于一个二分图匹配,需要在不超过服务器负载的情况下使得用户成功创建不同规格的虚拟机。
最重要的部分就是审题
赛题组给的NUMA介绍如下:
NUMA 架构:目前主流的服务器都采用了非统一内存访问(NUMA)架构,你可 以理解为每台服务器内部都存在两个 NUMA 节点:A 和 B(下文中提到的节点均 致 NUMA 节点)。服务器拥有的资源(CPU 和内存)均匀分布在这两个节点上。 以 NV603 为例,其 A、B 两个节点分别包含 46C 和 162G 的资源。保证服务器的 CPU 核数和内存大小均为偶数。
由于服务器的资源是均匀分布,所以我们每个服务器CPU核数 c 和内存大小 m,则它在A,B两个节点均分后,各有c/2 个cpu核数 和 m/2 大小的内存。
我采用的是unordered_map来存储每种NUMA服务器的信息,虚拟机为了方便匹配服务器,设计的数据结构如下:
// 服务器信息
unordered_map<string,vector<int>> serverInfos;
// 虚拟机信息
unordered_map<string,vector<int>> vmInfos;
在解析txt文件时,将可供购买的服务器类型和用户可以创建的虚拟机类型信息解析保存。
void generateServer(string &serverType,string &cpuCores,string &memorySize,
string &serverCost,string &powerCost){
string _serverType="";
for(int i =1;i<serverType.size() -1;i++){
_serverType += serverType[i];
}
int _cpuCores =0,_memorySize=0,_serverCost=0,_powerCost=0;
for(int i=0;i<cpuCores.size() -1;i++){
_cpuCores = 10*_cpuCores + cpuCores[i] - '0';
}
for(int i=0;i<memorySize.size() -1;i++){
_memorySize = 10*_memorySize + memorySize[i] - '0';
}
for(int i=0;i<serverCost.size() -1;i++){
_serverCost = 10*_serverCost + serverCost[i] - '0';
}
for(int i=0;i<powerCost.size()-1;i++){
_powerCost = 10*_powerCost + powerCost[i] - '0';
}
serverInfos[_serverType] = vector<int>{ _cpuCores/2 ,
_cpuCores/2,_memorySize/2,_memorySize/2,_serverCost,_powerCost};
}
在读取文件时,采用freopen进行重定向到txt文件,采用cin标准输入读取数据。代码如下。
std::freopen(filePath.c_str(),"rb",stdin);
int serverNum;
string serverType,cpuCores,memorySize,serverCost,powerCost;
scanf("%d",&serverNum);
for(int i =0;i<serverNum;i++){
cin>>serverType>>cpuCores>>memorySize>>serverCost>>powerCost;
generateServer(serverType,cpuCores,memorySize,serverCost,powerCost);
}
题目描述:在得知了一天的请求序列后,你可以在实际进行调度前进行一次数据中心扩容
这里在输出答案会导致错误,在输出时,我们每一天都要输出一个购买数量(purchase, T)
和一个迁移数量(migration, N) 。特别注意,这里购买数量(purchase, T) 的T需要购买的服务器的种类数。
这次在线上环境中,读取数据的形式和2020年的软件形式不一样,我们不需要自己写读取文件的txt路径,而是类似于各大oj,系统自己会给你做输入,我们之间接收数据处理即可。
由于需要cmake编译,很多小伙伴之前没有接触过这些东西,导致上手起来比较慢,我在这里介绍一下我的编译方法。我是windows系统,使用git来运行sh build.sh进行C++ 项目的编译,编译之后,文件夹会出现build和bin两个文件夹,直接将sdk_C++这个文件夹压缩成zip格式即可提交。我的提交文件夹结构如下。
文件夹结构
如何初始化购买服务器,如何进行虚拟机的迁移,还有扩容策略我在这版代码中没有考虑,方便各位有缘人发挥自己的创造力,各种解决NP-Hard问题的智能算法是一个值得尝试的方向,同时,强化学习的方法来解决这个问题,在解决模型泛化的情况下好像也是一个不错的策略。
最后附上我的baseline
代码地址:
Ubuntu Pastebinpaste.ubuntu.com
https://paste.ubuntu.com/p/jx4PjcK7fN/
不是c++大佬,代码写得不是很好,时间仓促。如果能对大家有帮助,我就很开心了。另外打个广告,我主要使用CC++,python,有类似比赛经验,武长赛区有同学想带带我的话,可以私信我哦。还有哦,代码有什么问题欢迎大家在评论区指出来,同时,评论区也欢迎各位在这里分享思路。我也将不定期更新自己的进度,欢迎大家持续关注。
发布于 3 分钟前
华为
计算机
代码分享
赞同 1添加评论分享喜欢收藏申请转载