1.题目描述

  1. 共有 M 个客户节点和 N 个边缘节点。
  2. 在每个时刻,要决策如何把每个客户节点的带宽需求分配到边缘节点。
  3. 为了确保调度质量,每个客户节点的需求只能分配到满足 QoS 约束的边缘节点
    上。即:当客户节点和边缘节点之间的 QoS 小于“QoS 上限”时,才会进行流量
    分配。
  4. 在每个时刻,每个边缘节点接收的带宽需求总和不能超过其带宽上限。
  5. 合理分配所有时刻的客户节点带宽需求,使得最终的带宽总成本尽量小。
  6. 成本为某个边缘节点,统计它在每个时刻分配的带宽之和,这些值
    在整个时间线上形成一个带宽序列,对其进行升序排序,以其 95%位置(向上
    取整)的带宽值作为该节点的 95 百分位带宽。
    7.总成本为求和所有边缘节点成本得到带宽总成本。

2.思路

将网络节点根据连接用户数量和带宽大小进行降序排序,让一部分节点每个时刻都尽量占用带宽,一部分节点只部署5%个时刻的带宽,这些节点的成本即为0。

如图,竖条为所有网络节点在所有时刻的带宽部署情况,横条为95%时刻位置,前一部分的网络节点带宽最大,连接用户数量最多,在每个时刻都尽量占用,而后面的节点只占用前5%。作为前一部分节点的数量称为阈值。
最终成绩为武长赛区43名,无缘复赛,只能拿到三等奖。

3.代码(Java)

注释还是比较清楚的,一些细节问题可以直接看。

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Properties;public class Main {//文件名+路径+printstatic int T,M,N,qos_constraint;static String[][] demand,qos,site_bandwidth;static ArrayList rear=new ArrayList();public static void main(String[] args) {output("");demand=new String[8929][35];//T M  [T-1][M-1]  T<=8928,N<=135,M<=35  width=430080site_bandwidth=new String[136][2];//N 2  [N-1][1]qos=new String[136][35];//N M   [N-1][M-1]   input();//T M N 101 11 101int gate=T-(int) Math.ceil((T-1)*0.95)-1;      //95位Netnode[] netnodes=new Netnode[N];//1--N-1 for(int i=1;i<M;i++) {for(int j=1;j<M;j++) {if(demand[0][j].equals(qos[0][i])) {for(int k=0;k<T;k++) {String t=demand[k][i];demand[k][i]=demand[k][j];demand[k][j]=t;}break;}}}for(int i=1;i<N;i++) {for(int j=1;j<N;j++) {if(site_bandwidth[j][0].equals(qos[i][0])) {netnodes[i]=new Netnode(Integer.parseInt(site_bandwidth[j][1]), T, M, qos[i], qos_constraint);//导入网络节点break;}}for(int j=1;j<i;j++) {if(netnodes[j].t<netnodes[i].t) {//根据网络节点的连接用户数排序;'<'或'>'需要根据数据集实际情况进行调整Netnode netnode=netnodes[i];netnodes[i]=netnodes[j];netnodes[j]=netnode;}}}for(int i=1;i<N;i++) {for(int j=i+1;j<N;j++) {if(netnodes[i].t==netnodes[j].t) {if(netnodes[i].width<netnodes[j].width) {//连接用户数相同在根据总带宽排序;'<'或'>'需要根据数据集实际情况进行调整Netnode netnode=netnodes[i];netnodes[i]=netnodes[j];netnodes[j]=netnode;}}else {break;}}}int threshold=getthreshold(netnodes);  //阈值,阈值前面的网络节点尽量塞满,后面的只塞5%for(int i=threshold;i<N;i++) {for(int j=i+1;j<N;j++) {if(netnodes[i].t>netnodes[j].t) {//对阈值后面的节点根据网络节点的连接用户数排序;'<'或'>'需要根据数据集实际情况进行调整,记得和函数getthreshold里这部分同号Netnode netnode=netnodes[i];netnodes[i]=netnodes[j];netnodes[j]=netnode;}}}for(int i=threshold;i<N;i++) {for(int j=i+1;j<N;j++) {if(netnodes[i].t==netnodes[j].t) {if(netnodes[i].width>netnodes[j].width) {//连接用户数相同在根据总带宽排序;'<'或'>'需要根据数据集实际情况进行调整,记得和函数getthreshold里这部分同号Netnode netnode=netnodes[i];netnodes[i]=netnodes[j];netnodes[j]=netnode;}}else {break;}}}for(int i=1;i<T;i++) {for(int j=1;j<M;j++) {output(distribute(i, j, threshold, netnodes)+"\n");//进行模拟}for(int j=1;j<N;j++) {netnodes[j].twidth=netnodes[j].width;//更新本轮带宽}for(int j=0;j<rear.size();j++) {netnodes[(int) rear.get(j)].gate--;}rear.clear();}print(netnodes);//remove}public static int getthreshold(Netnode[] tnetnodes) {//测试最佳阈值int threshold=0,cost=500000000;Netnode[] netnodes=new Netnode[N];for(int m=1;m<N;m++) {            //测试最佳阈值for(int i=1;i<N;i++) {netnodes[i]=tnetnodes[i];}for(int i=m;i<N;i++) {for(int j=i+1;j<N;j++) {if(netnodes[i].t>netnodes[j].t) {//根据网络节点的连接用户数排序;'<'或'>'需要根据数据集实际情况进行调整Netnode netnode=netnodes[i];netnodes[i]=netnodes[j];netnodes[j]=netnode;}}}for(int i=m;i<N;i++) {for(int j=i+1;j<N;j++) {if(netnodes[i].t==netnodes[j].t) {if(netnodes[i].width>netnodes[j].width) {//对阈值后面的节点排序;'<'或'>'需要根据数据集实际情况进行调整Netnode netnode=netnodes[i];netnodes[i]=netnodes[j];netnodes[j]=netnode;}}else {break;}}}for(int i=1;i<T;i++) {for(int j=1;j<M;j++) {distribute(i, j, m, netnodes);}for(int j=1;j<N;j++) {netnodes[j].twidth=netnodes[j].width;}for(int j=0;j<rear.size();j++) {netnodes[(int) rear.get(j)].gate--;}rear.clear();}int sum=0;for(int i=1;i<N;i++) {Arrays.sort(netnodes[i].widtharray);sum+=netnodes[i].widtharray[(int)Math.ceil((T-1)*0.95-1)];}if(cost>sum) {cost=sum;threshold=m;}for(int j=1;j<N;j++) {for(int k=1;k<T;k++) {netnodes[j].widtharray[k-1]=0;netnodes[j].gate=T-(int) Math.ceil((T-1)*0.95)-1;}}}return threshold;}public static String distribute(int i,int j,int threshold,Netnode[] netnodes) {//分配算法int need=Integer.parseInt(demand[i][j]);String ts=demand[0][j]+":";if(need==0) {return ts;}for(int k=1;k<N;k++) {if(netnodes[k].qos[j]<qos_constraint&&netnodes[k].twidth>0) {//判断用户能否接上该节点if(k<threshold) {//N/4-(15-20)   //判断该用户节点进去阈值前段还是阈值后段if(need>netnodes[k].twidth) {need-=netnodes[k].twidth;netnodes[k].widtharray[i-1]=netnodes[k].width;ts+="<"+netnodes[k].id+","+netnodes[k].twidth+">,";netnodes[k].twidth=0;}else if(need<=netnodes[k].twidth){netnodes[k].twidth-=need;netnodes[k].widtharray[i-1]+=need;ts+="<"+netnodes[k].id+","+need+">";need=0;break;}}else {if(netnodes[k].gate>0) {         //判断阈值后端的节点是否还有位置(5%)if(need>netnodes[k].twidth) {need-=netnodes[k].twidth;netnodes[k].widtharray[i-1]=netnodes[k].width;ts+="<"+netnodes[k].id+","+netnodes[k].twidth+">,";netnodes[k].twidth=0;netnodes[k].gate--;if(rear.contains(k)) {rear.remove(rear.indexOf(k));}}else if(need<=netnodes[k].twidth){netnodes[k].twidth-=need;netnodes[k].widtharray[i-1]+=need;ts+="<"+netnodes[k].id+","+need+">";need=0;if(!rear.contains(k)) {rear.add(k);}//netnodes[k].gate--;break;}}}}}if(need!=0) {      //判断该用户节点的需求是否已经分配完for(int k=threshold;k<N;k++) {if(netnodes[k].qos[j]<qos_constraint&&netnodes[k].twidth>0) {if(need>netnodes[k].twidth) {need-=netnodes[k].twidth;netnodes[k].widtharray[i-1]=netnodes[k].width;ts+="<"+netnodes[k].id+","+netnodes[k].twidth+">,";netnodes[k].twidth=0;}else if(need<=netnodes[k].twidth){netnodes[k].twidth-=need;netnodes[k].widtharray[i-1]+=need;ts+="<"+netnodes[k].id+","+need+">";need=0;break;}}}}return ts;}public static void print(Netnode[] netnodes) {//打印结果int sum1=0;for(int i=1;i<N;i++) {Arrays.sort(netnodes[i].widtharray);//System.out.println(i+":"+Arrays.toString(netnodes[i].widtharray));output(i+":"+Arrays.toString(netnodes[i].widtharray)+"\n\n");sum1+=netnodes[i].widtharray[(int)Math.ceil((T-1)*0.95-1)];}System.out.println(sum1);}public static void input(){//输入String line = "";String tarray[];int i=0,j=0;try (BufferedReader br = new BufferedReader(new FileReader("D:\\华为软件挑战赛\\线下调试数据\\data1\\demand.csv"))) {//"/data/demand.csv"while ((line = br.readLine()) != null) {tarray = line.split(",");for(j=0;j<tarray.length;j++) {demand[i][j]=tarray[j];}i++;}T=i--;M=j--;} catch (IOException e) {e.printStackTrace();}i=0;try (BufferedReader br = new BufferedReader(new FileReader("D:\\华为软件挑战赛\\线下调试数据\\data1\\site_bandwidth.csv"))) {//"/data/site_bandwidth.csv"while ((line = br.readLine()) != null) {tarray = line.split(",");for(j=0;j<tarray.length;j++) {site_bandwidth[i][j]=tarray[j];}i++;}N=i--;} catch (IOException e) {e.printStackTrace();}i=0;try (BufferedReader br = new BufferedReader(new FileReader("D:\\华为软件挑战赛\\线下调试数据\\data1\\qos.csv"))) {//"/data/qos.csv"while ((line = br.readLine()) != null) {tarray = line.split(",");for(j=0;j<tarray.length;j++) {qos[i][j]=tarray[j];}i++;}} catch (IOException e) {e.printStackTrace();}try {FileInputStream fin;fin = new FileInputStream("D:\\华为软件挑战赛\\线下调试数据\\data1\\config.ini");//"/data/config.ini"Properties props=new Properties();props.load(fin);qos_constraint=Integer.parseInt(props.getProperty("qos_constraint"));fin.close(); } catch (IOException e) {e.printStackTrace();}}public static void output(String result) {//输出String path="D:\\华为软件挑战赛\\线下调试数据\\data1\\output\\solution.txt";//"/output/solution.txt"FileWriter fwriter = null;try {if(!result.equals("")) {fwriter = new FileWriter(path, true);fwriter.write(result);}else {fwriter = new FileWriter(path);fwriter.write(result);}} catch (IOException ex) {ex.printStackTrace();} finally {try {fwriter.flush();fwriter.close();} catch (IOException ex) {ex.printStackTrace();}}}
}
class Netnode{                    //网络节点类public int width,twidth,t,gate;public int[] qos,widtharray;//qos:1--m-1String id;public Netnode(int width,int T,int M,String[] d,int qc){this.width=width;twidth=width;widtharray=new int[T-1];gate=T-(int) Math.ceil((T-1)*0.95)-1;qos=new int[M];id=d[0];for(int i=1;i<M;i++) {qos[i]=Integer.parseInt(d[i]);if(qos[i]<qc) {t++;}}}
}

2022华为软件挑战赛流量管理相关推荐

  1. 2017华为软件挑战赛总结

    2017华为软件挑战赛总结 这次比赛是去年做的, 自己之前没有总结,现在才开始总结,很多东西快想不起来了,真是惭愧 赛题主要内容和目的 初赛题目和内容 给你一个流网络(边有容量和单位流量费用),已知有 ...

  2. 2019华为软件挑战赛初赛代码开源分享

    本项目是华为2019年软件精英挑战赛的初赛题目的实现,初赛排名西北赛区 41 名 项目地址:https://github.com/WFrame0224/SDK_python 文章目录 1. 运行说明 ...

  3. 2022年华为软件精英挑战赛区域初赛解读(基于数学规划模型附代码)

    0 写在前面的 本文是对2022年华为软件精英挑战赛(普朗克计划)区域初赛的一个解读.首先说明的是本文的算法无法直接拿来参赛的,因为区域初赛的要求是不能调用其它的算法包,python的话只能用nump ...

  4. 2023华为软件精英挑战赛,探寻软件人才与科技创新的最优解

    作者 | 曾响铃 文 | 响铃说 今天,软件行业正呈现出江河入海一般的大汇流趋势. 一方面是技术的汇流,诸如人工智能等前沿技术与软件行业的深度融合,正全面颠覆软件产品的开发模式和服务逻辑. 另一方面则 ...

  5. # 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 ...

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

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

  7. 2016华为软件精英挑战赛:赛题及其答疑汇总

    注:本文文字均摘自官方指定网站和论坛,权威且可信,答疑见中间部分,非常全,众玩家可放心阅读. 同时文末给出了包括自己在内的诸多玩家的解法. 前言 赛题源自"未来网络"业务发放中的路 ...

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

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

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

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

最新文章

  1. 面试官:聊一聊 Spring Boot 服务监控机制
  2. 1235813找规律第100个数_拓展提优 | 小学数学拓展提优专项训练第9讲:
  3. 在非UI线程中处理Bitmap
  4. wxWidgets:实时传输时间RTTI
  5. UTF8 匹配汉字,字母,数字
  6. 如何制作一个基于Tile的游戏 2 Cocos2d-x 2 0 4
  7. AP模块NOTE修改API
  8. sfc流程图怎么画_sfc第四次超级机器人大战流程图
  9. 招程序员不要信中医的? | 从编程的角度看中医
  10. spring容器启动的加载过程(三)
  11. c语言把数字转换为字母,C语言将字符串转数字
  12. 论文的总结与展望写作技巧
  13. 5款最佳Linux服务器系统推荐
  14. Flash Player 更新后视频卡问题
  15. 国瀚实业|春节投资,这些理财的坑要注意
  16. Android实现白天黑夜动画,android 实现【夜晚模式】的另外一种思路
  17. 关于ssl证书:pem转成crt文件的最简单方法:直接改后缀名!
  18. css文件插入背景音乐,博客园添加背景音乐,背景效果!
  19. AFNetWorking3.0 实现同步请求
  20. 室内监控与室外监控有什么区别 如何选择合适的监控摄像机

热门文章

  1. Qt单元测试工具 QTestlib
  2. 《引爆核能-销售演讲与呈现技巧》司铭宇
  3. jconsole是否可以在生产环境使用_使用rmi jmx JCONSOLE远程监控JVM
  4. Skype交互过程分析
  5. 101个制造浪漫的方法
  6. Computer for fun
  7. 语法分析器(syntax analyzer)【Python实现】
  8. 虚拟现实技术在物理光学的应用
  9. 大英赛C类翻译题合集
  10. 【研究型论文】Encrypted Malware Traffic Detection via Graph-based Network Analysis