2022华为软件精英挑战赛——梯度方法

本人研一小萌新,最近深圳疫情很严重,也不能出学校。就参加了这个比赛试试水。太菜了,已经结束了,将一些错误的思路分享一下。希望对后面队伍有一些帮助(反正也卷不到我了)。希望兄弟们帮我点点赞,去github点点小星星。

背景

我的研究是做软硬件开发的,平时干的最多的就是对着电机调PID(仿真做的多,电机烧了就很麻烦),偶尔搞搞磁悬浮啥的。本科之前有一点软件的基础,会python,会写C。后来想说还是软件赚钱,就想找找机会。其他两个组员基本是这个情况,一个做交通,一个做机器人。所以我们对这个题目是真的没有方向,就硬做,最后起码是有分数的,没有躺着等死,还是挣扎了一会的。

总体思路

首先,我们看到这个题目,先懵了3天。找了几天资料,一点鸟用都莫得。后来决定还是用土办法,用我们浅显的数学知识去填。

我们把他分成了两个问题,首先是基本的问题,就是要分配的问题,我们要把节点的流量分配到客户身上。客户是一个等式约束,而节点是一个不等式约束。

后一个问题是优化的问题,这个我们也整不明白。也是用土办法,用贪心法进行推动,但是也是这个方法效果没有达到我们的预期,也就比原来少了5-6%。

问题一:

第一步,由于时间是离散的,中间没有连续的信息,所以我们可以将每个时刻单独分开,可以看做是一个多元函数的求解问题。这个求解析解是不太可能的,而且可以肯定不是唯一解(不然谁会做解的空间还很大。

所以求解的问题应该不大,问题是需要一个怎么样的最优解。由于根本对题目没有理解,所以我们首先尝试求一种理想的解——期望在每个节点分配的流量相对比较平均。

在求解这个数学问题上,我们这个草民也没有很好的办法,只能采用梯度下降的方法,期望通过迭代计算和的方法。

首先我们先通过等式约束,创建一个满足等式约束的解,然后沿着等式约束的解的约束空间不断移动,直到进入不等式约束的解空间里,直到找到我们满足的解为止。

        

        人话就是,我的将分配方案变成一个矩阵,然后矩阵的行代表一个客户,矩阵的列代表一个节点。

        然后,通过客户的需求,按照行进行矩阵的初值的填充(也要用到那个QOS的矩阵),然后按照行进行挪移,挪移的过程中让他按照我们想要的形状移动,也就是尽量平均的方法(通过对节点现在的宽带进行均一化得到移动的方向),步长和冲量就是靠试出来了。

        搬动的原则(限幅)有两个:

  1. 不能搬成负数
  2. 不能超过带宽的上限

        后来一直认为这个很难求,在测试的时候一直不能通过,后来才发现是前面读取,后面输出都有细节的问题,python里面还有一些小bug,真的是始料未及,活生生被憋死。但是平均化后,发现这个好像不是关键,这个就比瞎鸡儿乱分,就好那么个7-8%。忙活那么久,真的是。。上头。

问题二

        这个就开始头疼了,最最最根本的问题就是,我们完全不知道,95%的点到底有什么意义,做到怎么样才能优化这个指标。就只能用土办法。。。

        我们想到的土办法,就是找到上面的解中的占95%的时间的矩阵,然后把他占95%的搬走,很自觉,也很朴素。搬动的原则和上面一样。心里的OS是,只要搬得够多,那么分数肯定能下来。就是那么简单。一次搬动的T就靠占最多的95%的节点,然后搬,农民工只会搬砖。

搬动的原则和上面一样。有用,但是没有我们预期那个好,最后会在两个时间之间反复横跳(有一种局部最小值的感觉),我们也解决不了这个问题 。

代码

        代码可以在github上下载,有一开始的python版本,还有后面学了两天C++写的基本是C语言的C++版本https://github.com/szuforti/-2022-

感受

        这种计算机的比赛和一些硬件和别的真的很不一样。主要是感觉调试很麻烦,他的数据集不会出现一些特殊情况,全靠自己脑补,还得生成出需要的数据,同时数据又不是一点点,就很麻烦。其次就是没有代码的思路,完全不知道自己要往什么方向上前进。就是一直摸着石头,然后掉水里了。软件本来说简简单单用python,后来发现速度完全不行,逼着自己学了C++,后来写成了C的模样。当然也希望这个思路是有用的,以后应该是不会再掺和这种事情了,好好调电机去了。

        又仔细一想,我那么拼命就是为了给他打工,这不是大亏了,哪有打工人这么卖命的p>文章知识点与官方知识档案匹配,可进一步学习相关知识算法技能树首页概览35106 人正在系统学习中

声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2022年2月25日
下一篇 2022年2月25日

相关推荐