参加华为2017软件精英比赛的经历

最近参加了华为2017软件精英大赛,从3月初看到比赛信息开始构思解决方案,到4月初清明节前完成所有代码编写,然后开始调算法参数,再到45日初赛结束,一直忙碌了近一个月,要么是在敲代码,要么是在想怎么设计算法来更高效地搜索全局最优解,白天想,晚上想,睡前想,半夜起夜了,竟然也在想(cry)...虽然比较累,不过当今天确定自己进入了赛区前64强,拿到华为的面试绿卡之后,还是觉得自己的付出是值得的。以下是自己的参赛经历:

首先初赛赛题是这样的:在给定结构的G省电信网络中,为了视频内容快速低成本的传送到每个住户小区,需要在这个给定网络结构中选择一些网络节点附近放置视频内容存储服务器。需要解决的问题是:在满足所有的住户小区视频播放需求的基本前提下,如何选择视频内容存储服务器放置位置,使得成本最小。 赛题具体描述可以去华为软件精英大赛官网看看。

我以前也没有参加过什么软件编程类的比赛,刚开始看到这个题目的时候就不知道怎么去解决,也没个思路,就在那瞎想,还是后来看了华为出题专家给的思路之后才知道要用启发式算法去搜状态,用最小费用最大流算法确定状态的目标函数。

刚开始,首先要解决这个网络图的存储问题,用二维数组存储边的信息很容易实现,编码非常简单,但是在后边需要频繁访问这些边的信息,而网络图又是个稀疏图,用数组存储会导致时间复杂度上过高,所以我决定用链表去存储。然而在搜如何用链表存储图之后,发现用十字链表存储有向图的效率最高,于是我就现学十字链表,然后编程实现了图的存储和访问。用了大概一个多星期......

接下来就是我走弯路的时候了......一开始我也不知道怎么去搜索,就在那瞎想,看了论坛上的讨论,说是设施选址问题,算法可以用启发式算法,于是我就想到了用蚁群算法去搜,于是我就没仔细想,撸起袖子开始编了,编了有一个多星期,把蚁群算法的程序编差不多了。然后华为官方搞了个直播答疑,我就看了,同时,我才注意到通过设置虚拟超级源点和汇点,可以用最小费用最大流算法确定最低费用,于是我果断弃坑,放弃蚁群算法,转而去研究最小费用最大流算法......直到此时,我才真正有了解题思路......白白花费了近10天的时间了......

编了大概45天,终于也把最小费用最大流算法的代码部分解决了。接下来就需要使用启发式算法来确定服务器位置,然后用最小费用最大流算法确定该服务器位置下的最小花费了。

想到之前编到一大半的蚁群瞎搜算法,还是算了,粒子群算法又太费时间,想想还是用出题专家说过的模拟退火算法,虽然以前只了解过,没编程实现过,但是还是决定用它了,于是我又开始研究模拟退火算法,下了两篇论文,照着论文的思路设计起了算法。

终于在328日左右,把模拟退火算法的代码部分也实现了,然后把写入解路径的部分也写了。至此,算是把所有的代码都编写出来了,剩下的就应该是调算法参数了。于是我第一次尝试运行程序,发现程序总是崩溃,可是我又不知道怎么找原因,于是我第一次真正用起了调试功能,单步调试,逐语句调试、逐过程调试、使用断点、使用观察函数窗口、使用堆栈窗口,使用这些工具可以很快发现代码的问题所在(code::blocks 16.01的代码调试教程请见:http://blog.csdn.net/qq_18071075/article/details/69569311)

终于把所有的BUG都解决之后,第一次跑通了程序,很开心,然而此时距离初赛截止也就56天的时间了,得抓紧时间调参数,清明节是过不成了......

以前也没调过参数,加上以前也没写过模拟退火算法,对算法的理解也不是深刻,再加上我为了适应比赛赛题,又再算法里加了一些其他参数,使我在前期的时候,一直在调节其他参数,而不是模拟退火算法的最重要的两个参数:初始温度和退温因子。直到后来,我才意识到这个问题,才使最优解的搜索速度加快了。还有就是状态产生函数的设计也很重要,一开始我设计的是多个服务器结点随机移动到一个相邻结点,一直得不到接近全局最优解的解。后来我一直想,才赶紧更改了状态产生函数,设计为一个结点随机移动多步,这样一来,最优解下降了不少,可是成绩还是在70分左右,高级用例的解一直非常不理想。不过想了很久也实在是不知道怎么去优化了。直到初赛截止后,才想到了用哈希表存储访问过的状态,来减少状态的重复访问。其实应该还是有其他解决方案的,只是时间不够了,只能放弃了。静等复活赛的开始再拼一波!

总的来说,参加此次比赛收获还是不小的,至少以前还从未编写过这么大的程序,也因此学会了如何用调试工具调试程序了。当然也有一些小遗憾,饶了一些弯路,不然成绩应该更好的。

不过我也已经很满意啦,毕竟拿到的是华为的面试绿卡,对我找工作的信心有很大的提升!

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值