2019中兴捧月算法大赛历程

1.初赛

题目是网络流量均衡。再带宽限制的图中求不同请求带宽的各条业务的最短路径使总成本最小。
解题思路:

  1. 对业务进行排序,优先级高的业务去走热点链路,优先级低的业务发现热点链路已经达到带宽上限就绕路而行。尝试过按请求带宽大小降序排序业务,效果并不理想。后来按在不限制带宽的图中求得的最短路径跳数升序排序提升效果明显,这样做是原因为跳数越少的业务放在前面跑可以防止其在后面跑遇到热点链路而去绕很远的路到达终点,跳数大的业务本来的路径已经很长了,再绕路付出的额外代价不多。这种思想就是防止短路退化为长路。
  2. 加大热点链路的权重,把热点链路上的流量分流到其它链路。这么做的目的是让那些一开始走热点链路的业务退而求其次去走比原路径稍长的路径,从而缓解热点链路的压力。问题变为给各条热点链路加上多少权重,会得到能使总成本最小的热点链路分配方案,让每条业务去选择绕开哪条热点链路而走哪条热点链路。尝试过用遗传算法去搜索最优解,可是收敛速度太慢,只能放弃。最后采取的方法是先加大一点热点链路的权重,利用率越高的链路加的权重越多,然后让业务在更新过热点链路权重的图中再跑一次,重新检测出热点链路,继续加大这些热点链路权重。重复多次。寻找最佳迭代次数。

初赛最终获得了第六名的成绩,还是比较满意的。

2.决赛选拔

决赛从前32名里面经过视频面试选拔出16位参加决赛。

面试大概十五分钟,问了以下几个问题:

  1. Q:自我介绍,介绍自己做过的最满意一个项目
    A:介绍了研电赛的项目。
  2. Q:在这个项目中最大的收获
    A:这是第一次多人合作的比较大的一个项目,再与组员进行对接、沟通过程中与锻炼了与他们合作的能力。项目中用到的技术之前没接触过,也是边学边开发。在短时间内的自学能力得到了提升。
  3. Q:大赛解题思路
    A:见上
  4. Q:怎么了解这个比赛的,参加这个比赛的初衷
    A:通过中兴来学校的宣讲了解到的。参加这个比赛是想对自己学习的成功进行一个检验,同时锻炼自己的机会。、
  5. Q:了解其他优化算法吗?遗传算法、模拟退火算法等系统学过吗?floyd算法等路径优化算法吗?
    A:只学习过一些经典的基础算法,比赛用到的遗传算法是现学的,非科班生算法方面较差。
  6. Q:有什么想问的问题?
    A:企业校招看重项目经历还是基础知识,现在学习的方向和校招应聘的方向关系不大影响吗?
    答:主要看重的是学习能力,思维能力,在学校写几年代码可能不如公司写几个月代码提升大。

3.决赛

决赛在南京举办,举办方的工作人员真是用心了,服务细致入微,让人都有些不好意思了,很多活动很感人,很吸引人加入他们。决赛从发布题目到提交大概40个小时。
赛题较初赛有很大变化,链路属性变复杂了,一条链路由几节车厢组成,为每条业务选路时同时要分配车厢号,相邻链路上的车厢号相同的车厢承载的业务不同需要增加调度员。总成本改为总共需要调度员的数量。
从读懂题目到实现总成本的计算方式,跑出最初结果用了大部分时间,留给优化的时间只有一上午和一下午。思路大致如下:

  1. 对起始点相同的货物请求进行合并,结果可以看做一个大的货物请求。这些货物将共享同一批调度员进行调度,故节省了调度成本。对4000多个请求进行合并,结果为700多个“大货物”请求。怎么对这些货物进行合并涉及装箱问题,即合理安排哪些货物合并在一起以使总合并结果数量最少。目前采取的做法是对货物进行排序,让重量小的货物优先装箱。由于时间关系,还未尝试其他一维经典装箱算法,如BFT,FFT。相信会有更好的结果。
  2. 路径求解:采取迪杰斯特拉算法,所有边的权重取为1,即最短路径为跳数最少的路径。这样可以让一个货物尽早离开链路,以免产生调度需要,增加调度员的数量。
    车厢的选择:采取的做法是BF最佳适应算法,对每一条业务,在规划其路径的同时,给其选择一个这条链路上的车厢。选择的依据是这条链路上剩余容量最小且能容纳该业务的车厢,这样是为了减少链路上的承载业务车厢数,即尽可能使链路上的空车厢多。
  3. 未及尝试的思路:
    所有货物路径规划完成后,遍历所有边上的车厢承载情况,对能继续优化减少占用车厢数的链路,可以结合启发式算法,重新分配货物分布;
    有的请求文件计算出的结果会出现个别靠后的货物无法找到路径,从而给总成本增加了一个很大的值。原因可能是路径车厢同时分配的方式会使个别链路堵死。所以考虑改为采取先规划路径后分配车厢的方式。

最后的结果并不理想。了解到前几名的同学的做法大致类似:在为一条货物选路时,将车厢也看做局部的几条链路,在确定一条链路后,进行局部探囊,寻找最优的车厢分配给它。目标是对这个货物选的路径使其对图中增加的调度员的数量最少。一条货物的成本就是其为图增加的调度员数量。
这种想法起先我也想到过,但感觉实现起来会过于复杂,恐怕难于在短时间内实现,而且计算量会很大。看来自己的编程能力还是较弱。不能在短时间内验证一些思路。
虽然只拿到决赛优胜奖,不过也是收获满满。大开了眼界,与很多大佬交流讨论,感觉自己进步很大,而且会让自己有进步的方向感,迷茫感少了很多。

非常感谢中兴提供的这个机会和平台!

你可能感兴趣的:(杂七杂八)